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:
@@ -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++){
|
||||||
|
|||||||
@@ -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,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,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,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,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,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,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,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,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,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,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
@@ -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 it’s 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 you’ve 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, he’s a 7/7 Dragon God creature with flying and indestructible. -- +1: Target creature without first strike, double strike, or vigilance can’t 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 player’s 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 player’s 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 player’s 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 creature’s 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}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
Reference in New Issue
Block a user