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
@@ -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"; cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/1/910f48ab-b04e-4874-b31d-a86a7bc5af14.jpg?1617626097";
else if(id.equals("296380t")) else if(id.equals("296380t"))
cardurl = "https://deckmaster.info/images/cards/KLD/-3287-hr.jpg"; 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; 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"; tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/1/a/1a2d027f-8996-4761-a776-47cd428f6779.jpg?1618766925";
else if(id.equals("522245t")) else if(id.equals("522245t"))
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/3/7/37e32ba6-108a-421f-9dad-3d03f7ebe239.jpg?1623113548"; 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; 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("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("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("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 false;
return true; return true;
} }
@@ -2714,7 +2761,8 @@ public class ImgDownloader {
rarity = ""; rarity = "";
if(id != null && (id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("491633"))) if(id != null && (id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("491633")))
rarity = "t"; 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 = ""; rarity = "";
int c = lines.indexOf("[/card]", lastIndex); int c = lines.indexOf("[/card]", lastIndex);
if (c > 0) if (c > 0)
@@ -2733,6 +2781,10 @@ public class ImgDownloader {
mappa.put("513543t", "Pest"); mappa.put("513543t", "Pest");
if(id.equals("513634")) if(id.equals("513634"))
mappa.put("513634t", "Fractal"); mappa.put("513634t", "Fractal");
if(id.equals("530447"))
mappa.put("530447t", "Skeleton");
if(id.equals("530448"))
mappa.put("530448t", "Goblin");
if (id.equals("114921")) { if (id.equals("114921")) {
mappa.put("11492111t", "Citizen"); mappa.put("11492111t", "Citizen");
mappa.put("11492112t", "Camarid"); 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("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("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("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 { try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a"); 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("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("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("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 { try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
Elements outlinks = doc.select("body a"); 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("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("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("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 { try {
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get(); doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
} catch (Exception e) { } 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("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("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("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"); Elements metadata = doc.select("head meta");
if(metadata != null) { if(metadata != null) {
for (int j = 0; j < metadata.size(); j++){ for (int j = 0; j < metadata.size(); j++){
+15 -4
View File
@@ -438,17 +438,28 @@ Switch decks without saving=Cambia mazzo senza salvare
Switch Decks=Cambia mazzo Switch Decks=Cambia mazzo
--UNLOCK CARDS--=-SBLOCCA CARTE- --UNLOCK CARDS--=-SBLOCCA CARTE-
#Vista de la coleccion #Vista collezione
Click on the card image=Clicca sull'immagine Click on the card image=Clicca sull'immagine
to add card to deck.=per aggiungere la carta al mazzo. to add card to deck.=per aggiungere la carta al mazzo.
Your Deck: =Il tuo mazzo: Your Deck: =Il tuo mazzo:
Sideboard: =La panchina: Sideboard: =Panchina:
Remove Card=Rimuovi la carta Commanders: =Comandanti:
Dungeons: =Dungeon:
Remove Card=Togli dal mazzo
Add/Remove Cards=Aggiungi / Rimuovi carte Add/Remove Cards=Aggiungi / Rimuovi carte
Add to Deck=Aggiungi al mazzo Add to Deck=Aggiungi al mazzo
Add to Sideboard=Aggiungi alla panchina 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- -Beginners-
Portal Second Age=Portale, la seconda era 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
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Arena Beginner Set name=Arena Beginner Set
orderindex=PRO-Z8.ANB orderindex=PRO-ZA.ANB
year=2020-08-13 year=2020-08-13
total=121 total=121
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Historic Anthology 1 name=Historic Anthology 1
orderindex=PRO-Z5.HA1 orderindex=PRO-Z6.HA1
year=2019-11-21 year=2019-11-21
total=22 total=22
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Historic Anthology 2 name=Historic Anthology 2
orderindex=PRO-Z6.HA2 orderindex=PRO-Z7.HA2
year=2020-03-12 year=2020-03-12
total=28 total=28
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Historic Anthology 3 name=Historic Anthology 3
orderindex=PRO-Z7.HA3 orderindex=PRO-Z8.HA3
year=2020-05-21 year=2020-05-21
total=31 total=31
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Historic Anthology 4 name=Historic Anthology 4
orderindex=PRO-ZA.HA4 orderindex=PRO-ZD.HA4
year=2021-03-11 year=2021-03-11
total=30 total=30
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Historic Anthology 5 name=Historic Anthology 5
orderindex=PRO-ZB.HA5 orderindex=PRO-ZE.HA5
year=2021-05-27 year=2021-05-27
total=26 total=26
[/meta] [/meta]
@@ -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]
@@ -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
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=The List name=The List
orderindex=PRO-ZA.PLIST orderindex=PRO-ZC.PLIST
year=2020-09-26 year=2020-09-26
total=336 total=336
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Strixhaven Mystical Archive name=Strixhaven Mystical Archive
orderindex=EXP-ZZJ.STA orderindex=EXP-K.STA
year=2021-04-23 year=2021-04-23
total=63 total=63
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Strixhaven: School of Mages name=Strixhaven: School of Mages
orderindex=EXP-ZZI.STX orderindex=REP-J.STX
year=2021-04-23 year=2021-04-23
total=340 total=340
[/meta] [/meta]
+1 -1
View File
@@ -1,7 +1,7 @@
[meta] [meta]
author=Wagic Team author=Wagic Team
name=Zendikar Rising Expeditions name=Zendikar Rising Expeditions
orderindex=PRO-Z9.ZNE orderindex=PRO-ZB.ZNE
year=2020-09-25 year=2020-09-25
total=30 total=30
[/meta] [/meta]
@@ -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 #AUTO_DEFINE _METALCRAFT_ aslongas(artifact|mybattlefield) >2
# Proliferate # 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 # 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 # Populate
#AUTO_DEFINE _POPULATE_ name(Populate) clone notAtarget(creature[token]|myBattlefield) #AUTO_DEFINE _POPULATE_ name(Populate) clone notAtarget(creature[token]|myBattlefield)
File diff suppressed because it is too large Load Diff
+80 -83
View File
@@ -1,6 +1,6 @@
#Primitives Pack for Wagic the Homebrew. #Primitives Pack for Wagic the Homebrew.
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card #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] [card]
name=Abandon Reason name=Abandon Reason
target=<upto:2>creature target=<upto:2>creature
@@ -1975,7 +1975,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Ajani's Pridemate 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. text=Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.
mana={1}{W} mana={1}{W}
type=Creature type=Creature
@@ -5143,7 +5143,7 @@ toughness=4
[card] [card]
name=Archangel of Thune name=Archangel of Thune
abilities=flying,lifelink 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. text=Flying. -- Lifelink. -- Whenever you gain life, put a +1/+1 counter on each creature you control.
mana={3}{W}{W} mana={3}{W}{W}
type=Creature type=Creature
@@ -6778,7 +6778,7 @@ toughness=2
[card] [card]
name=Atraxa, Praetors' Voice name=Atraxa, Praetors' Voice
abilities=flying,vigilance,deathtouch,lifelink 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.) 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} mana={G}{W}{U}{B}
type=Legendary Creature type=Legendary Creature
@@ -8902,9 +8902,10 @@ type=Instant
[/card] [/card]
[card] [card]
name=Bant Panorama name=Bant Panorama
auto={T}:Add{1} auto={T}:Add{C}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;island;forest;plains]|myLibrary) auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
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={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. 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 type=Land
[/card] [/card]
@@ -12217,7 +12218,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Bloodbond Vampire 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. text=Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.
mana={2}{B}{B} mana={2}{B}{B}
type=Creature type=Creature
@@ -15125,8 +15126,8 @@ toughness=4
[card] [card]
name=Brisela, Voice of Nightmares name=Brisela, Voice of Nightmares
auto=meldfrom(Gisela, the Broken Blade|Bruna, the Fading Light) auto=meldfrom(Gisela, the Broken Blade|Bruna, the Fading Light)
abilities=flying, first strike, vigilance, lifelink abilities=flying,first strike,vigilance,lifelink
auto=maxcast(*[manacost<4])0 opponent 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. text=Flying, first strike, vigilance, lifelink -- Your opponents can't cast spells with converted mana cost 3 or less.
type=Legendary Creature type=Legendary Creature
subtype=Eldrazi Angel subtype=Eldrazi Angel
@@ -15376,7 +15377,7 @@ type=Enchantment
[/card] [/card]
[card] [card]
name=Bruna, the Fading Light name=Bruna, the Fading Light
abilities=flying, vigilance abilities=flying,vigilance
autostack=if casted(this) then may moveTo(mybattlefield) target(creature[angel;human]|mygraveyard) 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.) 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} mana={5}{W}{W}
@@ -20321,7 +20322,7 @@ toughness=1
[card] [card]
name=Cliffhaven Vampire name=Cliffhaven Vampire
abilities=flying 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. text=Flying -- Whenever you gain life, each opponent loses 1 life.
mana={2}{W}{B} mana={2}{W}{B}
type=Creature type=Creature
@@ -22111,7 +22112,7 @@ toughness=1
[card] [card]
name=Contagion Clasp name=Contagion Clasp
auto=counter(-1/-1,1) target(creature) 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.) 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} mana={2}
type=Artifact type=Artifact
@@ -22119,7 +22120,7 @@ type=Artifact
[card] [card]
name=Contagion Engine name=Contagion Engine
auto=target(player) ability$!name(target player) counter(-1/-1,1) all(creature|mybattlefield)!$ targetedplayer 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.) 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} mana={6}
type=Artifact type=Artifact
@@ -22569,7 +22570,7 @@ toughness=1
[card] [card]
name=Core Prowler name=Core Prowler
abilities=infect 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.) 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} mana={4}
type=Artifact Creature type=Artifact Creature
@@ -22980,8 +22981,7 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Courser of Kruphix name=Courser of Kruphix
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplaylandlibrarytop
auto=canplaylandlibrarytop
auto=@movedTo(land|mybattlefield):life:1 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. 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} mana={1}{G}{G}
@@ -32124,7 +32124,7 @@ toughness=4
[card] [card]
name=Drogskol Reaver name=Drogskol Reaver
abilities=flying,double strike,lifelink 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. text=Flying, double strike, lifelink -- Whenever you gain life, draw a card.
mana={5}{W}{U} mana={5}{W}{U}
type=Creature type=Creature
@@ -35515,7 +35515,7 @@ toughness=7
[/card] [/card]
[card] [card]
name=Emmessi Tome 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. text={5}, {T}: Draw two cards, then discard a card.
mana={4} mana={4}
type=Artifact type=Artifact
@@ -36845,9 +36845,10 @@ toughness=3
[/card] [/card]
[card] [card]
name=Esper Panorama name=Esper Panorama
auto={T}:Add{1} auto={T}:Add{C}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;swamp;island;plains]|myLibrary) auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
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={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. 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 type=Land
[/card] [/card]
@@ -43795,7 +43796,7 @@ type=Sorcery
name=Fuel for the Cause name=Fuel for the Cause
target=*|stack target=*|stack
auto=fizzle 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.) 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} mana={2}{U}{U}
type=Instant type=Instant
@@ -44142,8 +44143,7 @@ toughness=8
[/card] [/card]
[card] [card]
name=Future Sight name=Future Sight
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplayfromlibrarytop
auto=canplayfromlibrarytop
text=Play with the top card of your library revealed. -- You may play the top card of your library. text=Play with the top card of your library revealed. -- You may play the top card of your library.
mana={2}{U}{U}{U} mana={2}{U}{U}{U}
type=Enchantment type=Enchantment
@@ -44570,8 +44570,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Garruk's Horde name=Garruk's Horde
abilities=trample,showfromtoplibrary abilities=trample,showfromtoplibrary,canplaycreaturelibrarytop
auto=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.) 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} mana={5}{G}{G}
type=Creature type=Creature
@@ -46465,8 +46464,8 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Gisela, the Broken Blade name=Gisela, the Broken Blade
abilities=flying, first strike, lifelink abilities=flying,first strike,lifelink
auto=@each my endofturn:target(Bruna the Fading Light) meld(Brisela Voice of Nightmares) 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. 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} mana={2}{W}{W}
type=Legendary Creature type=Legendary Creature
@@ -49374,6 +49373,15 @@ text=Grasslands enters the battlefield tapped. -- {T}, Sacrifice Grasslands: Sea
type=Land type=Land
[/card] [/card]
[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 name=Grave Birthing
target=opponent target=opponent
auto=ability$!moveto(exile) notatarget(*|mygraveyard)!$ targetedplayer auto=ability$!moveto(exile) notatarget(*|mygraveyard)!$ targetedplayer
@@ -50225,7 +50233,7 @@ subtype=Equipment
name=Grim Affliction name=Grim Affliction
target=creature target=creature
auto=counter(-1/-1,1) 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. text=Put a -1/-1 counter on target creature, then proliferate.
mana={2}{B} mana={2}{B}
type=Instant type=Instant
@@ -50593,9 +50601,10 @@ toughness=1
[/card] [/card]
[card] [card]
name=Grixis Panorama name=Grixis Panorama
auto={T}:Add{1} auto={T}:Add{C}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;island;swamp]|myLibrary) auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
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={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. 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 type=Land
[/card] [/card]
@@ -51513,6 +51522,14 @@ power=2
toughness=2 toughness=2
[/card] [/card]
[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 name=Gutter Skulk
mana={1}{B} mana={1}{B}
type=Creature type=Creature
@@ -56951,7 +56968,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Ignorant Bliss 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 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. 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} mana={1}{R}
@@ -57864,7 +57881,7 @@ toughness=3
[/card] [/card]
[card] [card]
name=Inexorable Tide 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. text=Whenever you cast a spell, proliferate.
mana={3}{U}{U} mana={3}{U}{U}
type=Enchantment type=Enchantment
@@ -60686,9 +60703,10 @@ toughness=1
[/card] [/card]
[card] [card]
name=Jund Panorama name=Jund Panorama
auto={T}:Add{1} auto={T}:Add{C}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;swamp]|myLibrary) auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
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={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. 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 type=Land
[/card] [/card]
@@ -61148,7 +61166,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Kalastria Nightwatch 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. text=Whenever you gain life, Kalastria Nightwatch gains flying until end of turn.
mana={4}{B} mana={4}{B}
type=Creature type=Creature
@@ -61545,7 +61563,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Karlov of the Ghost Council 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) 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. 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} mana={W}{B}
@@ -69763,8 +69781,7 @@ toughness=4
[/card] [/card]
[card] [card]
name=Magus of the Future name=Magus of the Future
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplayfromlibrarytop
auto=canplayfromlibrarytop
text=Play with the top card of your library revealed. -- You may play the top card of your library. text=Play with the top card of your library revealed. -- You may play the top card of your library.
mana={2}{U}{U}{U} mana={2}{U}{U}{U}
type=Creature type=Creature
@@ -70052,7 +70069,7 @@ toughness=1
[card] [card]
name=Malakir Familiar name=Malakir Familiar
abilities=flying,deathtouch 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. text=Flying, deathtouch -- Whenever you gain life, Malakir Familiar gets +1/+1 until end of turn.
mana={2}{B} mana={2}{B}
type=Creature type=Creature
@@ -72274,8 +72291,7 @@ subtype=Aura
[/card] [/card]
[card] [card]
name=Melek, Izzet Paragon name=Melek, Izzet Paragon
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplayinstantsorcerylibrarytop
auto=canplayinstantsorcerylibrarytop
auto=@movedto(instant,sorcery|mystack) from(mylibrary):all(trigger[to]) castcard(copied noevent) 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. 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} mana={4}{U}{R}
@@ -78387,9 +78403,10 @@ toughness=1
[/card] [/card]
[card] [card]
name=Naya Panorama name=Naya Panorama
auto={T}:Add{1} auto={T}:Add{C}
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;plains]|myLibrary) auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
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={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. 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 type=Land
[/card] [/card]
@@ -80034,7 +80051,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Nirkana Assassin 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.) 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} mana={2}{B}
type=Creature type=Creature
@@ -82302,26 +82319,7 @@ toughness=4
[/card] [/card]
[card] [card]
name=Opalescence name=Opalescence
auto=lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1)) auto=lord(other enchantment[-aura]) transforms((creature,newability[manacost/manacost]))
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))
mana={2}{W}{W} mana={2}{W}{W}
type=Enchantment 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. 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]
[card] [card]
name=Oracle of Mul Daya name=Oracle of Mul Daya
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplaylandlibrarytop
auto=maxPlay(land)+1 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. 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} mana={3}{G}
type=Creature type=Creature
@@ -87050,7 +87047,7 @@ toughness=1
[/card] [/card]
[card] [card]
name=Plaguemaw Beast 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. text={T}, Sacrifice a creature: Proliferate.
mana={3}{G}{G} mana={3}{G}{G}
type=Creature type=Creature
@@ -89585,7 +89582,7 @@ toughness=2
[/card] [/card]
[card] [card]
name=Puppet's Verdict 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. 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} mana={1}{R}{R}
type=Instant type=Instant
@@ -101131,7 +101128,7 @@ type=Instant
[/card] [/card]
[card] [card]
name=Searing Meditation 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. 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} mana={1}{R}{W}
type=Enchantment type=Enchantment
@@ -102337,7 +102334,7 @@ type=Sorcery
[/card] [/card]
[card] [card]
name=Serene Steward 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. text=Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.
mana={1}{W} mana={1}{W}
type=Creature type=Creature
@@ -111876,7 +111873,7 @@ toughness=3
name=Spread the Sickness name=Spread the Sickness
target=creature target=creature
auto=destroy 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.) 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} mana={4}{B}
type=Sorcery type=Sorcery
@@ -112835,7 +112832,7 @@ type=Sorcery
[card] [card]
name=Steady Progress name=Steady Progress
auto=draw:1 controller 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.) 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} mana={2}{U}
type=Instant type=Instant
@@ -119276,7 +119273,7 @@ type=Sorcery
[card] [card]
name=Tezzeret's Gambit name=Tezzeret's Gambit
auto=draw:2 controller 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. text=Draw two cards, then proliferate.
color=blue color=blue
mana={3}{p(U)} mana={3}{p(U)}
@@ -120842,7 +120839,7 @@ type=Artifact
[/card] [/card]
[card] [card]
name=Throne of Geth 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. text={T},Sacrifice an artifact: Proliferate.
mana={2} mana={2}
type=Artifact type=Artifact
@@ -120900,7 +120897,7 @@ toughness=1
[card] [card]
name=Thrummingbird name=Thrummingbird
abilities=flying 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. text=Flying -- Whenever Thrummingbird deals combat damage to a player, proliferate.
mana={1}{U} mana={1}{U}
type=Creature type=Creature
@@ -129085,7 +129082,7 @@ subtype=Aura
[card] [card]
name=Viral Drake name=Viral Drake
abilities=flying,infect 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.) 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} mana={3}{U}
type=Creature type=Creature
@@ -130171,7 +130168,7 @@ type=Legendary Land
name=Volt Charge name=Volt Charge
target=creature,player target=creature,player
auto=damage:3 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. text=Volt Charge deals 3 damage to target creature or player. Proliferate.
mana={2}{R} mana={2}{R}
type=Instant type=Instant
@@ -131076,7 +131073,7 @@ toughness=5
[card] [card]
name=Wall of Limbs name=Wall of Limbs
abilities=defender 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 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. 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} mana={2}{B}
@@ -1,7 +1,7 @@
grade=borderline grade=borderline
#Planeswalkers Primitives Pack for Wagic the Homebrew. #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 #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] [card]
name=Abian, Luvion Usurper name=Abian, Luvion Usurper
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
@@ -84,7 +84,7 @@ subtype=Ajani
[card] [card]
name=Ajani, Mentor of Heroes name=Ajani, Mentor of Heroes
auto=counter(0/0,4,loyalty) 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: 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,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 auto={C(0/0,-8,Loyalty)}:name(-8: Gain 100 life) life:100 controller
@@ -739,6 +739,18 @@ type=Legendary Planeswalker
subtype=Dovin subtype=Dovin
[/card] [/card]
[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 name=Elspeth, Knight-Errant
auto=counter(0/0,4,loyalty) 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) 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 color=white
[/card] [/card]
[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 name=Grist, the Hunger Tide
auto=counter(0/0,3,loyalty) auto=counter(0/0,3,loyalty)
auto=transforms((removealltypes,newability[becomes(Legendary Planeswalker Grist)])) forever auto=transforms((removealltypes,newability[becomes(Legendary Planeswalker Grist)])) forever
@@ -1105,6 +1129,18 @@ type=Legendary Planeswalker
subtype=Huatli subtype=Huatli
[/card] [/card]
[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 name=Jace, Arcane Strategist
auto=counter(0/0,4,loyalty) auto=counter(0/0,4,loyalty)
auto=@drawof(player):transforms((,newability[@drawof(player) restriction{once}:counter(1/1,1) target(creature|myBattlefield)])) ueot auto=@drawof(player):transforms((,newability[@drawof(player) restriction{once}:counter(1/1,1) target(creature|myBattlefield)])) ueot
@@ -1118,9 +1154,11 @@ subtype=Jace
[card] [card]
name=Jace, Architect of Thought name=Jace, Architect of Thought
auto=counter(0/0,4,loyalty) 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 aicode=activate target(*[zpos<=3]|mylibrary) moveto(myhand) and!( transforms((,newability[all(*[zpos<=3]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )!
auto={C(0/0,-2,Loyalty)}:name(-2: CANNOT BE CODED) donothing 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={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 )! 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. 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} mana={2}{U}{U}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -1518,8 +1556,8 @@ name=Kiora, the Crashing Wave
auto=counter(0/0,2,loyalty) 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: 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,-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 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) 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} mana={2}{G}{U}
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Kiora subtype=Kiora
@@ -1693,6 +1731,18 @@ type=Legendary Planeswalker
subtype=Liliana subtype=Liliana
[/card] [/card]
[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 name=Lord Windgrace
abilities=canbecommander abilities=canbecommander
auto=counter(0/0,5,Loyalty) auto=counter(0/0,5,Loyalty)
@@ -1729,6 +1779,17 @@ type=Legendary Planeswalker
subtype=Lukka subtype=Lukka
[/card] [/card]
[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 name=Mu Yanling
auto=counter(0/0,5,loyalty) auto=counter(0/0,5,loyalty)
auto={C(0/0,2,Loyalty)}:name(+2: Target creature can't be blocked) unblockable target(creature) auto={C(0/0,2,Loyalty)}:name(+2: Target creature can't be blocked) unblockable target(creature)
@@ -1795,10 +1856,11 @@ subtype=Nahiri
[card] [card]
name=Nahiri, the Harbinger name=Nahiri, the Harbinger
auto=counter(0/0,4,loyalty) 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 )! 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: May discard and draw a card) may notAtarget(*|myHand) transforms((,newability[reject and!(draw:1)!])) forever 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,-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. 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} mana={2}{R}{W}
type=Legendary Planeswalker type=Legendary Planeswalker
@@ -2835,9 +2897,8 @@ subtype=Vivien
[/card] [/card]
[card] [card]
name=Vivien, Monsters' Advocate name=Vivien, Monsters' Advocate
abilities=showfromtoplibrary abilities=showfromtoplibrary,canplaycreaturelibrarytop
aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary) aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary)
auto=canplaycreaturelibrarytop
auto=counter(0/0,3,Loyalty) 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,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 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
@@ -2997,3 +3058,14 @@ mana={2}{R}{G}
type=Legendary Planeswalker type=Legendary Planeswalker
subtype=Xenagos 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]
@@ -2,7 +2,7 @@ grade=unsupported
#The cards in this file are not implemented/incomplete yet. #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 #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 #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] [card]
name="Ach! Hans, Run!" 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. 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 type=Artifact
[/card] [/card]
[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 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. 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} mana={1}{R}
@@ -4730,12 +4721,6 @@ mana={2}{G}
type=Instant type=Instant
[/card] [/card]
[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 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. 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} mana={1}{B}
@@ -4889,12 +4874,6 @@ mana={0}
type=Artifact type=Artifact
[/card] [/card]
[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 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. 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} mana={4}{UB}{UB}
+52 -2
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 class TrCardRolledDie: public Trigger
{ {
public: public:
@@ -747,6 +780,8 @@ public:
if (!e) return 0; if (!e) return 0;
if (limitOnceATurn && triggeredTurn == game->turn) if (limitOnceATurn && triggeredTurn == game->turn)
return 0; return 0;
if (rollresult == -1 && e->card->dieNumFaces != e->card->lastRollResult)
return 0;
if (rollresult > 0 && rollresult != e->card->lastRollResult) if (rollresult > 0 && rollresult != e->card->lastRollResult)
return 0; return 0;
if (playerName != "" && playerName != e->playerName) if (playerName != "" && playerName != e->playerName)
@@ -4027,6 +4062,19 @@ public:
AAExploresEvent * clone() const; AAExploresEvent * clone() const;
~AAExploresEvent(); ~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 //Yidaro Counter
class AAAlterYidaroCount: public ActivatedAbilityTP class AAAlterYidaroCount: public ActivatedAbilityTP
{ {
@@ -6566,11 +6614,12 @@ class AASetDie: public InstantAbility
{ {
public: public:
int side; int side;
int diefaces;
string abilityToAlter; string abilityToAlter;
string abilityWin; string abilityWin;
string abilityLose; string abilityLose;
MTGAbility * abilityAltered; 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(); int resolve();
const string getMenuText(); const string getMenuText();
AASetDie * clone() const; AASetDie * clone() const;
@@ -6582,7 +6631,8 @@ public:
string baseAbility; string baseAbility;
AASetDie * setDie; AASetDie * setDie;
int userchoice; 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(); int resolve();
const string getMenuText(); const string getMenuText();
GenericRollDie * clone() const; GenericRollDie * clone() const;
+7 -3
View File
@@ -34,7 +34,8 @@ enum
SBMENU_ADD_NORMAL = 803, SBMENU_ADD_NORMAL = 803,
SBMENU_ADD_SB = 804, SBMENU_ADD_SB = 804,
SBMENU_ADD_CMD = 805, SBMENU_ADD_CMD = 805,
SBMENU_ADD_CANCEL = 806 SBMENU_ADD_DNG = 806,
SBMENU_ADD_CANCEL = 807
}; };
// enums for menu options // enums for menu options
@@ -76,7 +77,7 @@ private:
DeckViewerStages mStage; DeckViewerStages mStage;
JMusic * bgMusic; 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; WGuiFilters * filterMenu;
WSrcDeckViewer * source; WSrcDeckViewer * source;
@@ -91,6 +92,7 @@ private:
DeckDataWrapper * myCollection; DeckDataWrapper * myCollection;
DeckDataWrapper * mySideboard; DeckDataWrapper * mySideboard;
DeckDataWrapper * myCommandZone; DeckDataWrapper * myCommandZone;
DeckDataWrapper * myDungeonZone;
StatsWrapper * mStatsWrapper; StatsWrapper * mStatsWrapper;
int hudAlpha; int hudAlpha;
@@ -115,6 +117,7 @@ private:
void toggleView(); void toggleView();
void insertSideBoard(); void insertSideBoard();
void insertCommandZone(); void insertCommandZone();
void insertDungeonZone();
public: public:
GameStateDeckViewer(GameApp* parent); GameStateDeckViewer(GameApp* parent);
virtual ~GameStateDeckViewer(); virtual ~GameStateDeckViewer();
@@ -122,12 +125,13 @@ public:
void updateFilters(); void updateFilters();
void rebuildFilters(); void rebuildFilters();
void toggleCollection(); void toggleCollection();
void toggleSB_CMD(); void toggleSB_CMD_DNG();
void Start(); void Start();
virtual void End(); virtual void End();
void addRemove(MTGCard * card); void addRemove(MTGCard * card);
void SBaddRemove(MTGCard * card); void SBaddRemove(MTGCard * card);
void CMDaddRemove(MTGCard * card); void CMDaddRemove(MTGCard * card);
void DNGaddRemove(MTGCard * card);
void choiceAddRemove(MTGCard * card); void choiceAddRemove(MTGCard * card);
virtual void Update(float dt); virtual void Update(float dt);
void renderOnScreenBasicInfo(); void renderOnScreenBasicInfo();
+1
View File
@@ -117,6 +117,7 @@ public:
int lastFlipResult; int lastFlipResult;
int dieSide; int dieSide;
int lastRollResult; int lastRollResult;
int dieNumFaces;
int scryedCards; int scryedCards;
int stillInUse(); int stillInUse();
+2
View File
@@ -221,6 +221,7 @@ public:
vector<string> meta_AIHints; vector<string> meta_AIHints;
vector<string> Sideboard; vector<string> Sideboard;
vector<string> CommandZone; vector<string> CommandZone;
vector<string> DungeonZone;
string meta_unlockRequirements; string meta_unlockRequirements;
int meta_id; int meta_id;
@@ -239,6 +240,7 @@ public:
int remove(MTGCard * card); int remove(MTGCard * card);
void replaceSB(vector<string> newSB = vector<string>()); void replaceSB(vector<string> newSB = vector<string>());
void replaceCMD(vector<string> newCMD = vector<string>()); void replaceCMD(vector<string> newCMD = vector<string>());
void replaceDNG(vector<string> newDNG = vector<string>());
string getFilename(); string getFilename();
int save(); int save();
int save(const string& destFileName, bool useExpandedDescriptions, const string& deckTitle, const string& deckDesc); int save(const string& destFileName, bool useExpandedDescriptions, const string& deckTitle, const string& deckDesc);
+7 -1
View File
@@ -308,7 +308,13 @@ class Constants
LIFEFAKER = 181, LIFEFAKER = 181,
DOUBLEFACEDEATH = 182, DOUBLEFACEDEATH = 182,
GAINEDDOUBLEFACEDEATH = 183, 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_S = 'S', //Special Rarity
RARITY_M = 'M', //Mythics RARITY_M = 'M', //Mythics
+1
View File
@@ -250,6 +250,7 @@ public:
MTGCardInstance * putInExile(MTGCardInstance * card); MTGCardInstance * putInExile(MTGCardInstance * card);
MTGCardInstance * putInLibrary(MTGCardInstance * card); MTGCardInstance * putInLibrary(MTGCardInstance * card);
MTGCardInstance * putInHand(MTGCardInstance * card); MTGCardInstance * putInHand(MTGCardInstance * card);
MTGCardInstance * putInSideboard(MTGCardInstance * card);
MTGCardInstance * putInZone(MTGCardInstance * card, MTGGameZone * from, MTGGameZone * to, bool asCopy = false); MTGCardInstance * putInZone(MTGCardInstance * card, MTGGameZone * from, MTGGameZone * to, bool asCopy = false);
int isInPlay(MTGCardInstance * card); int isInPlay(MTGCardInstance * card);
int isInGrave(MTGCardInstance * card); int isInGrave(MTGCardInstance * card);
+1
View File
@@ -44,6 +44,7 @@ public:
int drawCounter; int drawCounter;
int energyCount; int energyCount;
int yidaroCount; int yidaroCount;
int dungeonCompleted;
int numOfCommandCast; int numOfCommandCast;
int monarch; int monarch;
int surveilOffset; int surveilOffset;
+8
View File
@@ -390,6 +390,14 @@ struct WEventCardExplored : public WEventCardUpdate {
virtual Targetable * getTarget(int target); 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 //roll die event
struct WEventCardRollDie : public WEventCardUpdate { struct WEventCardRollDie : public WEventCardUpdate {
string playerName; string playerName;
+7 -2
View File
@@ -605,9 +605,14 @@ int PutInGraveyard::resolve()
} }
if (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH]) if (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
{ {
card->controller()->game->putInZone(card, zone, card->owner->game->battlefield); bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
if(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); card->tap(true);
if(addCounter)
card->counters->addCounter(1, 1, false);
return 1; return 1;
} }
if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay) if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay)
+59 -12
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 //AA Yidaro Count
AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost, AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost,
int who) : int who) :
@@ -3188,9 +3230,9 @@ AASetCoin::~AASetCoin()
} }
// //
//rolling a 6 side die //rolling a generic die
GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice) : 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) ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice), diefaces(diefaces)
{ {
this->GetId(); this->GetId();
setDie = NULL; setDie = NULL;
@@ -3201,17 +3243,17 @@ int GenericRollDie::resolve()
if (!target) if (!target)
return 0; return 0;
vector<MTGAbility*>selection; vector<MTGAbility*>selection;
if(userchoice > 0 && userchoice < 7){ if(userchoice > 0 && userchoice <= diefaces){
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, baseAbility); setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, diefaces, baseAbility);
MTGAbility * set = setDie->clone(); MTGAbility * set = setDie->clone();
set->oneShot = true; set->oneShot = true;
game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target; game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target;
set->resolve(); set->resolve();
SAFE_DELETE(setDie); SAFE_DELETE(setDie);
} else{ } 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(); MTGAbility * set = setDie->clone();
set->oneShot = true; set->oneShot = true;
selection.push_back(set); selection.push_back(set);
@@ -3230,7 +3272,9 @@ int GenericRollDie::resolve()
const string GenericRollDie::getMenuText() const string GenericRollDie::getMenuText()
{ {
return "Roll a Die"; std::stringstream msg;
msg << "Roll a " << diefaces << " faced Die";
return msg.str();
} }
GenericRollDie * GenericRollDie::clone() const GenericRollDie * GenericRollDie::clone() const
@@ -3243,9 +3287,9 @@ GenericRollDie::~GenericRollDie()
{ {
} }
//set color choosen //set die result
AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, string toAlter): AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, int _diefaces, string toAlter):
InstantAbility(observer, id, source),side(_side), abilityToAlter(toAlter) InstantAbility(observer, id, source),side(_side), diefaces(_diefaces), abilityToAlter(toAlter)
{ {
this->target = _target; this->target = _target;
abilityAltered = NULL; abilityAltered = NULL;
@@ -3256,8 +3300,9 @@ int AASetDie::resolve()
MTGCardInstance * _target = (MTGCardInstance *)target; MTGCardInstance * _target = (MTGCardInstance *)target;
_target->dieSide = side; _target->dieSide = side;
int roll = 1 + game->getRandomGenerator()->random() % 6; int roll = 1 + game->getRandomGenerator()->random() % diefaces;
_target->lastRollResult = roll; _target->lastRollResult = roll;
_target->dieNumFaces = diefaces;
WEvent * e = NEW WEventCardRollDie(_target, source->controller()->getDisplayName()); WEvent * e = NEW WEventCardRollDie(_target, source->controller()->getDisplayName());
game->receiveEvent(e); game->receiveEvent(e);
vector<string>Win = parseBetween(abilityToAlter,"winability "," winabilityend"); vector<string>Win = parseBetween(abilityToAlter,"winability "," winabilityend");
@@ -4473,6 +4518,8 @@ int AAFlip::resolve()
MTGCardInstance * myParent = NULL; MTGCardInstance * myParent = NULL;
if(_target->target) if(_target->target)
myParent = _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->name = myFlip->name;
_target->setName(myFlip->name); _target->setName(myFlip->name);
if(!isflipcard)//transform card if(!isflipcard)//transform card
+161 -25
View File
@@ -39,6 +39,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
myDeck = NULL; myDeck = NULL;
mySideboard = NULL; mySideboard = NULL;
myCommandZone = NULL; myCommandZone = NULL;
myDungeonZone = NULL;
filterMenu = NULL; filterMenu = NULL;
source = NULL; source = NULL;
hudAlpha = 0; 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); 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); 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); 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); 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: //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); 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(bgMusic);
SAFE_DELETE(toggleDeckButton); SAFE_DELETE(toggleDeckButton);
SAFE_DELETE(sellCardButton); SAFE_DELETE(sellCardButton);
SAFE_DELETE(sb_cmd_Button); SAFE_DELETE(sb_cmd_dng_Button);
SAFE_DELETE(statsPrevButton); SAFE_DELETE(statsPrevButton);
SAFE_DELETE(filterButton); SAFE_DELETE(filterButton);
SAFE_DELETE(toggleViewButton); SAFE_DELETE(toggleViewButton);
@@ -90,6 +91,11 @@ GameStateDeckViewer::~GameStateDeckViewer()
SAFE_DELETE(myCommandZone->parent); SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone); SAFE_DELETE(myCommandZone);
} }
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
if (myCollection) if (myCollection)
{ {
SAFE_DELETE(myCollection->parent); SAFE_DELETE(myCollection->parent);
@@ -125,7 +131,7 @@ void GameStateDeckViewer::updateFilters()
void GameStateDeckViewer::toggleCollection() void GameStateDeckViewer::toggleCollection()
{ {
if(mView->deck() == mySideboard || mView->deck() == myCommandZone) if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
return; return;
if (mView->deck() == myCollection) if (mView->deck() == myCollection)
@@ -142,7 +148,7 @@ void GameStateDeckViewer::toggleCollection()
updateFilters(); updateFilters();
} }
void GameStateDeckViewer::toggleSB_CMD() void GameStateDeckViewer::toggleSB_CMD_DNG()
{ {
if(mView->deck() == myDeck) if(mView->deck() == myDeck)
return; return;
@@ -150,17 +156,22 @@ void GameStateDeckViewer::toggleSB_CMD()
if (mView->deck() == myCollection) if (mView->deck() == myCollection)
{ {
mView->SetDeck(mySideboard); mView->SetDeck(mySideboard);
sb_cmd_Button->setText("View CMD"); sb_cmd_dng_Button->setText("View CMD");
} }
else if (mView->deck() == mySideboard) else if (mView->deck() == mySideboard)
{ {
mView->SetDeck(myCommandZone); 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 else
{ {
mView->SetDeck(myCollection); mView->SetDeck(myCollection);
sb_cmd_Button->setText("View SB/CMD"); sb_cmd_dng_Button->setText("View SB");
} }
//source->swapSrc(); //source->swapSrc();
//updateFilters(); //updateFilters();
@@ -210,6 +221,7 @@ void GameStateDeckViewer::Start()
myDeck = NULL; myDeck = NULL;
mySideboard = NULL; mySideboard = NULL;
myCommandZone = NULL; myCommandZone = NULL;
myDungeonZone = NULL;
mStage = STAGE_WELCOME; mStage = STAGE_WELCOME;
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1; last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
@@ -282,6 +294,11 @@ void GameStateDeckViewer::End()
SAFE_DELETE(myCommandZone->parent); SAFE_DELETE(myCommandZone->parent);
SAFE_DELETE(myCommandZone); SAFE_DELETE(myCommandZone);
} }
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
SAFE_DELETE(pricelist); SAFE_DELETE(pricelist);
SAFE_DELETE(playerdata); SAFE_DELETE(playerdata);
SAFE_DELETE(filterMenu); SAFE_DELETE(filterMenu);
@@ -354,6 +371,28 @@ void GameStateDeckViewer::CMDaddRemove(MTGCard * card)
mView->reloadIndexes(); 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) void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
{ {
if (!card) return; if (!card) return;
@@ -366,19 +405,37 @@ void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
if (mView->deck() == myCollection) if (mView->deck() == myCollection)
{ {
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards"); 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"); if(!card->data->hasType("Dungeon")){
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard"); sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER])) sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander"); 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"); 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 = 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_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"); 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() void GameStateDeckViewer::saveDeck()
{ {
//update the corresponding meta data object //update the corresponding meta data object
@@ -436,6 +513,8 @@ void GameStateDeckViewer::saveDeck()
insertSideBoard(); insertSideBoard();
//insert commanders to mydeck parents //insert commanders to mydeck parents
insertCommandZone(); insertCommandZone();
//insert dungeons to mydeck parents
insertDungeonZone();
//save deck //save deck
myDeck->save(); myDeck->save();
playerdata->save(); playerdata->save();
@@ -491,7 +570,7 @@ bool GameStateDeckViewer::userPressedButton()
{ {
return ((toggleDeckButton->ButtonPressed()) return ((toggleDeckButton->ButtonPressed())
|| (sellCardButton->ButtonPressed()) || (sellCardButton->ButtonPressed())
|| (sb_cmd_Button->ButtonPressed()) || (sb_cmd_dng_Button->ButtonPressed())
|| (statsPrevButton->ButtonPressed()) || (statsPrevButton->ButtonPressed())
|| (filterButton->ButtonPressed()) || (filterButton->ButtonPressed())
|| (toggleViewButton->ButtonPressed()) || (toggleViewButton->ButtonPressed())
@@ -506,7 +585,7 @@ void GameStateDeckViewer::setButtonState(bool state)
{ {
toggleDeckButton->setIsSelectionValid(state); toggleDeckButton->setIsSelectionValid(state);
sellCardButton->setIsSelectionValid(state); sellCardButton->setIsSelectionValid(state);
sb_cmd_Button->setIsSelectionValid(state); sb_cmd_dng_Button->setIsSelectionValid(state);
statsPrevButton->setIsSelectionValid(state); statsPrevButton->setIsSelectionValid(state);
filterButton->setIsSelectionValid(state); filterButton->setIsSelectionValid(state);
toggleViewButton->setIsSelectionValid(state); toggleViewButton->setIsSelectionValid(state);
@@ -518,12 +597,12 @@ void GameStateDeckViewer::setButtonState(bool state)
void GameStateDeckViewer::RenderButtons() void GameStateDeckViewer::RenderButtons()
{ {
if(mView->deck() != mySideboard && mView->deck() != myCommandZone) if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
toggleDeckButton->Render(); toggleDeckButton->Render();
sellCardButton->Render(); sellCardButton->Render();
if(mView->deck() != myDeck) if(mView->deck() != myDeck)
sb_cmd_Button->Render(); sb_cmd_dng_Button->Render();
if(mView->deck() != mySideboard && mView->deck() != myCommandZone) if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
filterButton->Render(); filterButton->Render();
statsPrevButton->Render(); statsPrevButton->Render();
toggleViewButton->Render(); toggleViewButton->Render();
@@ -631,7 +710,7 @@ void GameStateDeckViewer::Update(float dt)
if (last_user_activity > 0.2) if (last_user_activity > 0.2)
{ {
last_user_activity = 0; last_user_activity = 0;
toggleSB_CMD(); toggleSB_CMD_DNG();
} }
break; break;
case JGE_BTN_PRI: case JGE_BTN_PRI:
@@ -685,9 +764,9 @@ void GameStateDeckViewer::Update(float dt)
break; break;
case JGE_BTN_MENU: 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 else
{ {
@@ -696,7 +775,7 @@ void GameStateDeckViewer::Update(float dt)
} }
break; break;
case JGE_BTN_CTRL: 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 break;//SB is for viewing add or remove only
else if(!mView->ButtonPressed(JGE_BTN_CTRL)) else if(!mView->ButtonPressed(JGE_BTN_CTRL))
{ {
@@ -985,7 +1064,8 @@ void GameStateDeckViewer::renderOnScreenMenu()
int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES); int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES); int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES);
int cmd_value = myCommandZone->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); font->DrawString(buffer, SCREEN_WIDTH - 200 + rightTransition, SCREEN_HEIGHT / 2 + 15);
for (int j = 0; j < Constants::NB_Colors; j++) 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->parent);
SAFE_DELETE(myCommandZone); SAFE_DELETE(myCommandZone);
} }
//dng
if (myDungeonZone)
{
SAFE_DELETE(myDungeonZone->parent);
SAFE_DELETE(myDungeonZone);
}
//temp deck for sb? //temp deck for sb?
MTGDeck * sbtempDeck = NEW MTGDeck(MTGCollection()); MTGDeck * sbtempDeck = NEW MTGDeck(MTGCollection());
if(myDeck->parent) if(myDeck->parent)
@@ -1707,10 +1793,52 @@ int GameStateDeckViewer::loadDeck(int deckid)
myCollection->validate(); myCollection->validate();
} }
//endcmd //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); myDeck->Sort(WSrcCards::SORT_ALPHA);
mySideboard->Sort(WSrcCards::SORT_ALPHA); mySideboard->Sort(WSrcCards::SORT_ALPHA);
myCommandZone->Sort(WSrcCards::SORT_ALPHA); myCommandZone->Sort(WSrcCards::SORT_ALPHA);
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
SAFE_DELETE(filterMenu); SAFE_DELETE(filterMenu);
rebuildFilters(); rebuildFilters();
mView->reloadIndexes(); mView->reloadIndexes();
@@ -1877,6 +2005,14 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
sbMenu->Close(); sbMenu->Close();
break; break;
} }
case SBMENU_ADD_DNG:
{
MTGCard * card = mView->getActiveCard();
if (card)
DNGaddRemove(card);
sbMenu->Close();
break;
}
case SBMENU_ADD_CANCEL: case SBMENU_ADD_CANCEL:
sbMenu->Close(); sbMenu->Close();
break; break;
+4 -2
View File
@@ -147,7 +147,7 @@ GameState(parent, "duel")
menu = NULL; menu = NULL;
popupScreen = NULL; popupScreen = NULL;
mGamePhase = DUEL_STATE_UNSET; mGamePhase = DUEL_STATE_UNSET;
taskList = NEW TaskList(options.profileFile(PLAYER_TASKS).c_str()); taskList = NEW TaskList();
#ifdef TESTSUITE #ifdef TESTSUITE
testSuite = NULL; testSuite = NULL;
@@ -190,6 +190,8 @@ void GameStateDuel::Start()
OpponentsDeckid = 0; OpponentsDeckid = 0;
bool createDeckMenu=true; // create only a deckmenu if not in tournament bool createDeckMenu=true; // create only a deckmenu if not in tournament
SAFE_DELETE(taskList);
taskList = NEW TaskList();
#ifdef NETWORK_SUPPORT #ifdef NETWORK_SUPPORT
if(!mParent->mpNetwork) { if(!mParent->mpNetwork) {
@@ -358,6 +360,7 @@ void GameStateDuel::End()
SAFE_DELETE(opponentMenu); SAFE_DELETE(opponentMenu);
SAFE_DELETE(deckmenu); SAFE_DELETE(deckmenu);
SAFE_DELETE(popupScreen); SAFE_DELETE(popupScreen);
SAFE_DELETE(taskList);
//reset player for next match (only if actual match is finished) //reset player for next match (only if actual match is finished)
tournament->End(); tournament->End();
@@ -1682,7 +1685,6 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
// break; // break;
case MENUITEM_TASKBOARD: case MENUITEM_TASKBOARD:
if(taskList->getState() != TaskList::TASKS_ACTIVE){ if(taskList->getState() != TaskList::TASKS_ACTIVE){
taskList->load(options.profileFile(PLAYER_TASKS).c_str());
taskList->Start(); taskList->Start();
} else { } else {
taskList->End(); taskList->End();
+170 -20
View File
@@ -1245,12 +1245,33 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
if (TargetChooser * tc = parseSimpleTC(s, "explored", card)) if (TargetChooser * tc = parseSimpleTC(s, "explored", card))
return NEW TrCardExplored(observer, id, card, tc, once, limitOnceATurn); 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 //Roll die has been performed from a card
if (TargetChooser * tc = parseSimpleTC(s, "dierolled", card)){ if (TargetChooser * tc = parseSimpleTC(s, "dierolled", card)){
int rollresult = 0; int rollresult = 0;
vector<string>res = parseBetween(s, "result(",")"); vector<string>res = parseBetween(s, "result(",")");
if(res.size()){ if(res.size()){
rollresult = atoi(res[1].c_str()); if(res[1] == "max"){
rollresult = -1;
} else {
rollresult = atoi(res[1].c_str());
}
} }
string playerName = ""; string playerName = "";
vector<string>from = parseBetween(s, "from(",")"); 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 pos1 = s.find("transforms(("); // Try to handle pay ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!"); 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); vector<string> splitMayPaystr = parseBetween(s, "pay(", ")", true);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && found < pos1 && found < pos2) || 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)){ (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]; storedAbilityString = splitGrant[1];
size_t pos1 = s.find("transforms(("); // Try to handle grant ability inside ability$! or transforms keywords. size_t pos1 = s.find("transforms(("); // Try to handle grant ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!"); 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]); size_t pos3 = s.find(splitGrant[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && 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)){ (pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitGrant[0]; s = splitGrant[0];
s.append("grant "); s.append("grant ");
s.append(splitGrant[2]); s.append(splitGrant[2]);
@@ -1860,9 +1889,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
storedAbilityString = splitRevealx[1]; storedAbilityString = splitRevealx[1];
size_t pos1 = s.find("transforms(("); // Try to handle reveal ability inside ability$! or transforms keywords. size_t pos1 = s.find("transforms(("); // Try to handle reveal ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!"); 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]); size_t pos3 = s.find(splitRevealx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && 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)){ (pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitRevealx[0]; s = splitRevealx[0];
s.append("reveal: "); s.append("reveal: ");
s.append(splitRevealx[2]); s.append(splitRevealx[2]);
@@ -1876,9 +1909,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
storedAbilityString = splitScryx[1]; storedAbilityString = splitScryx[1];
size_t pos1 = s.find("transforms(("); // Try to handle scry ability inside ability$! or transforms keywords. size_t pos1 = s.find("transforms(("); // Try to handle scry ability inside ability$! or transforms keywords.
size_t pos2 = s.find("ability$!"); 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]); size_t pos3 = s.find(splitScryx[1]);
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && 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)){ (pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
s = splitScryx[0]; s = splitScryx[0];
s.append("scry: "); s.append("scry: ");
s.append(splitScryx[2]); s.append(splitScryx[2]);
@@ -1890,6 +1927,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (found != string::npos && storedString.empty()) if (found != string::npos && storedString.empty())
{ {
size_t pos1 = s.find("ability$!"); // Try to handle transforms ability inside ability$! keyword. 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){ if(pos1 == string::npos || found < pos1){
size_t real_end = s.find("))", found); size_t real_end = s.find("))", found);
size_t stypesStartIndex = found + 12; size_t stypesStartIndex = found + 12;
@@ -2687,13 +2728,6 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//Phase based actions
found = s.find("phaseaction");
if (found != string::npos)
{
return parsePhaseActionAbility(s,card,spell,target,restrictions,id);
}
//flip a coin //flip a coin
vector<string> splitFlipCoin = parseBetween(s, "flipacoin ", " flipend"); vector<string> splitFlipCoin = parseBetween(s, "flipacoin ", " flipend");
if (splitFlipCoin.size()) if (splitFlipCoin.size())
@@ -2705,22 +2739,124 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; return a;
} }
//roll a die //roll a d4 die
vector<string> splitRollDie = parseBetween(s, "rolladie ", " rollend"); vector<string> splitRollD4 = parseBetween(s, "rolld4 ", " rolld4end");
if (splitRollDie.size()) if (splitRollD4.size())
{ {
string a1 = splitRollDie[1]; string a1 = splitRollD4[1];
int userchoice = 0; int userchoice = 0;
if(a1[0] >= 48 && a1[0] <= 57){ if(a1[0] >= 48 && a1[0] <= 57){
userchoice = a1[0] - 48; userchoice = (a1[0] - 48);
a1 = a1.substr(2); 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->oneShot = 1;
a->canBeInterrupted = false; a->canBeInterrupted = false;
return a; 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 //may pay ability
vector<string> splitMayPaysub = parseBetween(s, "pay[[","]]", true); vector<string> splitMayPaysub = parseBetween(s, "pay[[","]]", true);
if (splitMayPaysub.size()) if (splitMayPaysub.size())
@@ -3554,6 +3690,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
return a; 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 //alter yidaro counter
vector<string> splitYidaroCounter = parseBetween(s, "alteryidarocount:", " ", false); vector<string> splitYidaroCounter = parseBetween(s, "alteryidarocount:", " ", false);
if (splitYidaroCounter.size()) if (splitYidaroCounter.size())
@@ -4312,6 +4459,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (splitMeldFrom[1].size()) if (splitMeldFrom[1].size())
{ {
splitMeldNames = splitMeldFrom[1]; 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); MTGAbility * a = NEW AAMeldFrom(observer, id, card, target, splitMeldNames);
a->oneShot = true; a->oneShot = true;
@@ -4326,6 +4474,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
if (splitMeld[1].size()) if (splitMeld[1].size())
{ {
splitMeldName = splitMeld[1]; 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); MTGAbility * a = NEW AAMeld(observer, id, card, target, splitMeldName);
a->oneShot = true; 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::HANDDEATH] = true;
badAbilities[(int)Constants::GAINEDHANDDEATH] = true; badAbilities[(int)Constants::GAINEDHANDDEATH] = true;
badAbilities[(int)Constants::INPLAYDEATH] = true; badAbilities[(int)Constants::INPLAYDEATH] = true;
badAbilities[(int)Constants::COUNTERDEATH] = true;
badAbilities[(int)Constants::INPLAYTAPDEATH] = true; badAbilities[(int)Constants::INPLAYTAPDEATH] = true;
badAbilities[(int)Constants::DOUBLEFACEDEATH] = true; badAbilities[(int)Constants::DOUBLEFACEDEATH] = true;
badAbilities[(int)Constants::GAINEDDOUBLEFACEDEATH] = true; badAbilities[(int)Constants::GAINEDDOUBLEFACEDEATH] = true;
+12 -3
View File
@@ -267,6 +267,7 @@ void MTGCardInstance::initMTGCI()
lastFlipResult = -1; lastFlipResult = -1;
dieSide = 0; dieSide = 0;
lastRollResult = 0; lastRollResult = 0;
dieNumFaces = 0;
scryedCards = 0; scryedCards = 0;
isAttacking = NULL; isAttacking = NULL;
storedCard = NULL; storedCard = NULL;
@@ -529,9 +530,14 @@ int MTGCardInstance::toGrave( bool forced )
} }
if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH]) if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH])
{ {
p->game->putInZone(this, p->game->inPlay, owner->game->battlefield); bool toTap = basicAbilities[(int)Constants::INPLAYTAPDEATH];
if(basicAbilities[(int)Constants::INPLAYTAPDEATH]) bool addCounter = basicAbilities[(int)Constants::COUNTERDEATH];
tap(true); 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; return 1;
} }
if (!basicAbilities[(int)Constants::INDESTRUCTIBLE]) if (!basicAbilities[(int)Constants::INDESTRUCTIBLE])
@@ -1028,6 +1034,9 @@ bool MTGCardInstance::canPlayFromLibrary()
if(isSorceryorInstant() && (has(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY) if(isSorceryorInstant() && (has(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY)
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY)))) || (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY))))
found++; 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) if(found > 0)
return true; return true;
+80 -7
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 ")); s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
std::string::const_iterator it = s.begin(); std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it; while (it != s.end() && std::isdigit(*it)) ++it;
if(!s.empty() && it == s.end()) if(!s.empty() && it == s.end()){
Sideboard.push_back(s); MTGCard * card = database->getCardById(atoi(s.c_str()));
else { 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; int numberOfCopies = 1;
size_t found = s.find(" *"); size_t found = s.find(" *");
if (found != string::npos){ 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++){ for (int i = 0; i < numberOfCopies; i++){
std::stringstream str_id; std::stringstream str_id;
str_id << card->getId(); 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); 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); CommandZone.push_back(s);
} }
} }
}else { } else {
size_t found = s.find(" *"); size_t found = s.find(" *");
if (found != string::npos) if (found != string::npos)
s = s.substr(0, found); 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()); CommandZone.push_back(str_id.str());
} }
} }
}else { } else {
DebugTrace("could not add to CommandZone any card with name: " << s); DebugTrace("could not add to CommandZone any card with name: " << s);
} }
} }
continue; 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; continue;
} }
if (meta_only) continue; //Changed from break in order to read the command tag in metafile. 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; return;
} }
void MTGDeck::replaceDNG(vector<string> newDMG)
{
if(newDMG.size())
{
DungeonZone.clear();
DungeonZone = newDMG;
}
return;
}
int MTGDeck::remove(int cardid) int MTGDeck::remove(int cardid)
{ {
if (cards.find(cardid) == cards.end() || cards[cardid] == 0) return 0; 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"; 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(); file.close();
JFileSystem::GetInstance()->Rename(tmp, destFileName); JFileSystem::GetInstance()->Rename(tmp, destFileName);
+7 -1
View File
@@ -214,7 +214,13 @@ const char* Constants::MTGBasicAbilities[] = {
"undamageable", //It cannot be damaged by any source "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) "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) "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; map<string,int> Constants::MTGBasicAbilitiesMap;
+29 -2
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() 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])) 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); bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
if(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); ret->tap(true);
if(addCounter)
ret->counters->addCounter(1, 1, false);
return ret; return ret;
} }
return putInZone(card, card->currentZone, card->owner->game->graveyard); 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 // Moves a card to its owner's exile
MTGCardInstance * MTGPlayerCards::putInExile(MTGCardInstance * card) 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::GAINEDEXILEDEATH] = card->basicAbilities[Constants::GAINEDEXILEDEATH];
copy->basicAbilities[Constants::GAINEDHANDDEATH] = card->basicAbilities[Constants::GAINEDHANDDEATH]; copy->basicAbilities[Constants::GAINEDHANDDEATH] = card->basicAbilities[Constants::GAINEDHANDDEATH];
copy->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH] = card->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH]; copy->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH] = card->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH];
copy->basicAbilities[Constants::DUNGEONCOMPLETED] = card->basicAbilities[Constants::DUNGEONCOMPLETED];
copy->damageInflictedAsCommander = card->damageInflictedAsCommander; copy->damageInflictedAsCommander = card->damageInflictedAsCommander;
copy->numofcastfromcommandzone = card->numofcastfromcommandzone; copy->numofcastfromcommandzone = card->numofcastfromcommandzone;
for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++) for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++)
+1
View File
@@ -36,6 +36,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
drawCounter = 0; drawCounter = 0;
energyCount = 0; energyCount = 0;
yidaroCount = 0; yidaroCount = 0;
dungeonCompleted = 0;
numOfCommandCast = 0; numOfCommandCast = 0;
monarch = 0; monarch = 0;
surveilOffset = 0; surveilOffset = 0;
+1
View File
@@ -603,6 +603,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet)
p->preventable = initState.playerData[i].player->preventable; p->preventable = initState.playerData[i].player->preventable;
p->energyCount = initState.playerData[i].player->energyCount; p->energyCount = initState.playerData[i].player->energyCount;
p->yidaroCount = initState.playerData[i].player->yidaroCount; p->yidaroCount = initState.playerData[i].player->yidaroCount;
p->dungeonCompleted = initState.playerData[i].player->dungeonCompleted;
p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast; p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast;
p->monarch = initState.playerData[i].player->monarch; p->monarch = initState.playerData[i].player->monarch;
p->surveilOffset = initState.playerData[i].player->surveilOffset; p->surveilOffset = initState.playerData[i].player->surveilOffset;
+11
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) : WEventCardRollDie::WEventCardRollDie(MTGCardInstance * card, string playerName) :
WEventCardUpdate(card), playerName(playerName) WEventCardUpdate(card), playerName(playerName)
{ {
@@ -570,6 +575,12 @@ Targetable * WEventCardExplored::getTarget(int target)
return NULL; return NULL;
} }
Targetable * WEventCardDungeonCompleted::getTarget(int target)
{
if (target) return card;
return NULL;
}
Targetable * WEventCardRollDie::getTarget(int target) Targetable * WEventCardRollDie::getTarget(int target)
{ {
if (target) return card; if (target) return card;
+83 -2
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; 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") 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 else if (s.find("cardcounttype") != string::npos)//Count Total cards of specific type
{ {
intValue = 0; 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 else if(!intValue)//found nothing, try parsing a atoi
{ {
intValue = atoi(s.c_str()); intValue = atoi(s.c_str());