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";
|
||||
else if(id.equals("296380t"))
|
||||
cardurl = "https://deckmaster.info/images/cards/KLD/-3287-hr.jpg";
|
||||
else if(id.equals("530447"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/f/6f509dbe-6ec7-4438-ab36-e20be46c9922.jpg?1626139695";
|
||||
else if(id.equals("530448"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/5/9/59b11ff8-f118-4978-87dd-509dc0c8c932.jpg?1626297774";
|
||||
else if(id.equals("530449"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/7/0/70b284bd-7a8f-4b60-8238-f746bdc5b236.jpg?1626297777";
|
||||
else if(id.equals("530448t"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/1/4/1425e965-7eea-419c-a7ec-c8169fa9edbf.jpg?1626139812";
|
||||
else if(id.equals("530447t"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/f/a/fa6fdb57-82f3-4695-b1fa-1f301ea4ef83.jpg?1626139846";
|
||||
else if(id.equals("527514t"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/c/4/c49e8e79-8673-41c2-a1ad-273c37e27aca.jpg?1625767076";
|
||||
else if(id.equals("527507t"))
|
||||
cardurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/b/6b2c8f52-1580-42d5-8434-c4c70e31e31b.jpg?1626139372";
|
||||
|
||||
return cardurl;
|
||||
}
|
||||
@@ -2338,7 +2352,40 @@ public class ImgDownloader {
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/1/a/1a2d027f-8996-4761-a776-47cd428f6779.jpg?1618766925";
|
||||
else if(id.equals("522245t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/3/7/37e32ba6-108a-421f-9dad-3d03f7ebe239.jpg?1623113548";
|
||||
|
||||
else if(id.equals("296413t"))
|
||||
tokenurl = "https://i.pinimg.com/564x/af/cc/4c/afcc4c87d67c9651838fed09217c7eed.jpg";
|
||||
else if(id.equals("296410t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/4/94057dc6-e589-4a29-9bda-90f5bece96c4.jpg?1572489125";
|
||||
else if(id.equals("527539t") || id.equals("527477t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/a/3/a3a684b7-27e0-4d9e-a064-9e03c6e50c89.jpg?1626139418";
|
||||
else if(id.equals("527351t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/c/e/ce3c0bd9-8a37-4164-9937-f35d1c210fe8.jpg?1626139016";
|
||||
else if(id.equals("527378t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/8/6/86881c5f-df5e-4f50-b554-e4c49d5316f9.jpg?1625676073";
|
||||
else if(id.equals("532511t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/a/3/a378702b-d074-4402-b423-2ca8f44fce7c.jpg?1572370699";
|
||||
else if(id.equals("532519t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/2/62cafc0a-cd02-4265-aa1f-b8a6cb7cc8db.jpg?1592710150";
|
||||
else if(id.equals("532527t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/8/e/8e3b2942-d1a4-4d27-9d64-65712497ab2e.jpg?1561897504";
|
||||
else if(id.equals("532560t") || id.equals("532659t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/5/95483574-95b7-42a3-b700-616189163b0a.jpg?1598312392";
|
||||
else if(id.equals("531918t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/0/7/076f934b-a244-45f1-bcb3-7c5e882e9911.jpg?1594733476";
|
||||
else if(id.equals("532539t") || id.equals("531948t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/4/4/44a4ef4a-a026-424e-88ff-e2bb77aaf05d.jpg?1625974889";
|
||||
else if(id.equals("532482t") || id.equals("532493t") || id.equals("532491t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/e/4/e43a205e-43ea-4b3e-92ab-c2ee2172a50a.jpg?1572489150";
|
||||
else if(id.equals("532599t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/9/c/9c8fe0d7-5c40-45fe-b3d8-47852380845e.jpg?1562542392";
|
||||
else if(id.equals("531833t"))
|
||||
tokenurl = "https://i.pinimg.com/564x/04/dc/04/04dc041251acb96f97327d67e9c8fe23.jpg";
|
||||
else if(id.equals("532489t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/6/0/60842b1a-6ae7-4b3b-a23f-0d94a3d89884.jpg?1562639827";
|
||||
else if(id.equals("531921t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/2/3/2300635e-7771-4676-a5a5-29a9d8f49f1a.jpg?1604194799";
|
||||
else if(id.equals("531928t") || id.equals("531933t"))
|
||||
tokenurl = "https://c1.scryfall.com/file/scryfall-cards/large/front/0/b/0b08d210-01cb-46c5-9150-4dfb47f50ae7.jpg?1626139197";
|
||||
return tokenurl;
|
||||
}
|
||||
|
||||
@@ -2359,7 +2406,7 @@ public class ImgDownloader {
|
||||
id.equals("293198") || id.equals("479634") || id.equals("479702") || id.equals("489837") || id.equals("489861") || id.equals("491359") ||
|
||||
id.equals("294872") || id.equals("295110") || id.equals("294842") || id.equals("295067") || id.equals("491767") || id.equals("295386") ||
|
||||
id.equals("295229") || id.equals("295387") || id.equals("295206") || id.equals("295706") || id.equals("497549") || id.equals("497666") ||
|
||||
id.equals("503860") || id.equals("522280") || id.equals("522111"))
|
||||
id.equals("503860") || id.equals("522280") || id.equals("522111") || id.equals("527288") || id.equals("531927"))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@@ -2714,7 +2761,8 @@ public class ImgDownloader {
|
||||
rarity = "";
|
||||
if(id != null && (id.equals("209162") || id.equals("209163") || id.equals("401721") || id.equals("401722") || id.equals("491633")))
|
||||
rarity = "t";
|
||||
if(id != null && (id.equals("1750411") || id.equals("5176911") || id.equals("44680711") || id.equals("29530711") || id.equals("45108910")))
|
||||
if(id != null && (id.equals("1750411") || id.equals("5176911") || id.equals("44680711") || id.equals("29530711") || id.equals("45108910")
|
||||
|| id.equals("530447") || id.equals("530448") || id.equals("530449")))
|
||||
rarity = "";
|
||||
int c = lines.indexOf("[/card]", lastIndex);
|
||||
if (c > 0)
|
||||
@@ -2733,6 +2781,10 @@ public class ImgDownloader {
|
||||
mappa.put("513543t", "Pest");
|
||||
if(id.equals("513634"))
|
||||
mappa.put("513634t", "Fractal");
|
||||
if(id.equals("530447"))
|
||||
mappa.put("530447t", "Skeleton");
|
||||
if(id.equals("530448"))
|
||||
mappa.put("530448t", "Goblin");
|
||||
if (id.equals("114921")) {
|
||||
mappa.put("11492111t", "Citizen");
|
||||
mappa.put("11492112t", "Camarid");
|
||||
@@ -2958,7 +3010,8 @@ public class ImgDownloader {
|
||||
|| scryset.equals("PAL05") || scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1")
|
||||
|| scryset.equals("SLD") || scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3") || scryset.equals("SS3")
|
||||
|| scryset.equals("AKR") || scryset.equals("ANB") || scryset.equals("PLIST") || scryset.equals("KLR") || scryset.equals("CC1")
|
||||
|| scryset.equals("ATH") || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")){
|
||||
|| scryset.equals("ATH") || scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")
|
||||
|| scryset.equals("HTR18") || scryset.equals("HTR19")){
|
||||
try {
|
||||
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
|
||||
Elements outlinks = doc.select("body a");
|
||||
@@ -3149,7 +3202,8 @@ public class ImgDownloader {
|
||||
&& !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1")
|
||||
&& !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3") && !scryset.equals("SS3")
|
||||
&& !scryset.equals("AKR") && !scryset.equals("ANB") && !scryset.equals("PLIST") && !scryset.equals("KLR") && !scryset.equals("CC1")
|
||||
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")){
|
||||
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")
|
||||
&& !scryset.equals("HTR18") && !scryset.equals("HTR19")){
|
||||
try {
|
||||
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
|
||||
Elements outlinks = doc.select("body a");
|
||||
@@ -3264,7 +3318,8 @@ public class ImgDownloader {
|
||||
&& !scryset.equals("PAL05") && !scryset.equals("PAL06") && !scryset.equals("PAL99") && !scryset.equals("PARL") && !scryset.equals("HA1")
|
||||
&& !scryset.equals("SLD") && !scryset.equals("MB1") && !scryset.equals("HA2") && !scryset.equals("HA3") && !scryset.equals("SS3")
|
||||
&& !scryset.equals("AKR") && !scryset.equals("ANB") && !scryset.equals("PLIST") && !scryset.equals("KLR") && !scryset.equals("CC1")
|
||||
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")){
|
||||
&& !scryset.equals("ATH") && !scryset.equals("HA4") && !scryset.equals("TSR") && !scryset.equals("HA5") && !scryset.equals("H1R")
|
||||
&& !scryset.equals("HTR18") && !scryset.equals("HTR19")){
|
||||
try {
|
||||
doc = Jsoup.connect(imageurl + scryset.toLowerCase()).get();
|
||||
} catch (Exception e) {
|
||||
@@ -3431,7 +3486,8 @@ public class ImgDownloader {
|
||||
|| scryset.equals("PAL06") || scryset.equals("PAL99") || scryset.equals("PARL") || scryset.equals("HA1") || scryset.equals("SLD")
|
||||
|| scryset.equals("MB1") || scryset.equals("HA2") || scryset.equals("HA3") || scryset.equals("SS3") || scryset.equals("AKR")
|
||||
|| scryset.equals("ANB") || scryset.equals("PLIST") || scryset.equals("KLR") || scryset.equals("CC1") || scryset.equals("ATH")
|
||||
|| scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R")){
|
||||
|| scryset.equals("HA4") || scryset.equals("TSR") || scryset.equals("HA5") || scryset.equals("H1R") || scryset.equals("HTR18")
|
||||
|| scryset.equals("HTR19")){
|
||||
Elements metadata = doc.select("head meta");
|
||||
if(metadata != null) {
|
||||
for (int j = 0; j < metadata.size(); j++){
|
||||
|
||||
@@ -438,17 +438,28 @@ Switch decks without saving=Cambia mazzo senza salvare
|
||||
Switch Decks=Cambia mazzo
|
||||
--UNLOCK CARDS--=-SBLOCCA CARTE-
|
||||
|
||||
#Vista de la coleccion
|
||||
#Vista collezione
|
||||
Click on the card image=Clicca sull'immagine
|
||||
to add card to deck.=per aggiungere la carta al mazzo.
|
||||
Your Deck: =Il tuo mazzo:
|
||||
Sideboard: =La panchina:
|
||||
Remove Card=Rimuovi la carta
|
||||
Sideboard: =Panchina:
|
||||
Commanders: =Comandanti:
|
||||
Dungeons: =Dungeon:
|
||||
Remove Card=Togli dal mazzo
|
||||
Add/Remove Cards=Aggiungi / Rimuovi carte
|
||||
Add to Deck=Aggiungi al mazzo
|
||||
Add to Sideboard=Aggiungi alla panchina
|
||||
Add to Dungeons=Aggiungi ai dungeon
|
||||
Choose as Commander=Scegli come comandante
|
||||
Remove from Sideboard=Togli dalla panchina
|
||||
Remove as Commander=Rimuovi come comandante
|
||||
Remove from Dungeons=Togli dai dungeon
|
||||
View SB=Vedi PA
|
||||
View CMD=Vedi CMZ
|
||||
View DNG=Vedi DNG
|
||||
View Coll.=Vedi Coll.
|
||||
|
||||
#Ediciones:
|
||||
#Edizioni:
|
||||
|
||||
-Beginners-
|
||||
Portal Second Age=Portale, la seconda era
|
||||
|
||||
1472
projects/mtg/bin/Res/sets/AFC/_cards.dat
Normal file
1472
projects/mtg/bin/Res/sets/AFC/_cards.dat
Normal file
File diff suppressed because it is too large
Load Diff
1567
projects/mtg/bin/Res/sets/AFR/_cards.dat
Normal file
1567
projects/mtg/bin/Res/sets/AFR/_cards.dat
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Arena Beginner Set
|
||||
orderindex=PRO-Z8.ANB
|
||||
orderindex=PRO-ZA.ANB
|
||||
year=2020-08-13
|
||||
total=121
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Historic Anthology 1
|
||||
orderindex=PRO-Z5.HA1
|
||||
orderindex=PRO-Z6.HA1
|
||||
year=2019-11-21
|
||||
total=22
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Historic Anthology 2
|
||||
orderindex=PRO-Z6.HA2
|
||||
orderindex=PRO-Z7.HA2
|
||||
year=2020-03-12
|
||||
total=28
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Historic Anthology 3
|
||||
orderindex=PRO-Z7.HA3
|
||||
orderindex=PRO-Z8.HA3
|
||||
year=2020-05-21
|
||||
total=31
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Historic Anthology 4
|
||||
orderindex=PRO-ZA.HA4
|
||||
orderindex=PRO-ZD.HA4
|
||||
year=2021-03-11
|
||||
total=30
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Historic Anthology 5
|
||||
orderindex=PRO-ZB.HA5
|
||||
orderindex=PRO-ZE.HA5
|
||||
year=2021-05-27
|
||||
total=26
|
||||
[/meta]
|
||||
|
||||
42
projects/mtg/bin/Res/sets/HTR18/_cards.dat
Normal file
42
projects/mtg/bin/Res/sets/HTR18/_cards.dat
Normal file
@@ -0,0 +1,42 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Heroes of the Realm 2018
|
||||
orderindex=PRO-Z5.HTR18
|
||||
year=2019-08-01
|
||||
total=6
|
||||
[/meta]
|
||||
[card]
|
||||
primitive=Human Wizard
|
||||
id=-296413
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Human
|
||||
id=-296410
|
||||
rarity=T
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Kharis & the Beholder
|
||||
id=296410
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Kharis & the Beholder
|
||||
id=296410
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Optimus Prime, Inspiring Leader
|
||||
id=296411
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Sol, Advocate Eternal
|
||||
id=296412
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=The Legend of Arena
|
||||
id=296413
|
||||
rarity=M
|
||||
[/card]
|
||||
42
projects/mtg/bin/Res/sets/HTR19/_cards.dat
Normal file
42
projects/mtg/bin/Res/sets/HTR19/_cards.dat
Normal file
@@ -0,0 +1,42 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Heroes of the Realm 2019
|
||||
orderindex=PRO-Z9.HTR19
|
||||
year=2020-08-01
|
||||
total=7
|
||||
[/meta]
|
||||
[card]
|
||||
primitive=Collectigull // Only the Best
|
||||
id=296414
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Keeper of the Secret Lair
|
||||
id=296415
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=War of the Spark
|
||||
id=296416
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Champions of Archery // Join the Group
|
||||
id=296417
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Myntasha, Honored One
|
||||
id=296418
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=The Cinematic Phoenix
|
||||
id=296419
|
||||
rarity=M
|
||||
[/card]
|
||||
[card]
|
||||
primitive=Fabled Path of Searo Point
|
||||
id=296420
|
||||
rarity=M
|
||||
[/card]
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=The List
|
||||
orderindex=PRO-ZA.PLIST
|
||||
orderindex=PRO-ZC.PLIST
|
||||
year=2020-09-26
|
||||
total=336
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Strixhaven Mystical Archive
|
||||
orderindex=EXP-ZZJ.STA
|
||||
orderindex=EXP-K.STA
|
||||
year=2021-04-23
|
||||
total=63
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Strixhaven: School of Mages
|
||||
orderindex=EXP-ZZI.STX
|
||||
orderindex=REP-J.STX
|
||||
year=2021-04-23
|
||||
total=340
|
||||
[/meta]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[meta]
|
||||
author=Wagic Team
|
||||
name=Zendikar Rising Expeditions
|
||||
orderindex=PRO-Z9.ZNE
|
||||
orderindex=PRO-ZB.ZNE
|
||||
year=2020-09-25
|
||||
total=30
|
||||
[/meta]
|
||||
|
||||
@@ -61,10 +61,11 @@ $AUTO_DEFINE _CLASH_ Put here a code if compare the casting cost based on Errati
|
||||
#AUTO_DEFINE _METALCRAFT_ aslongas(artifact|mybattlefield) >2
|
||||
|
||||
# Proliferate
|
||||
#AUTO_DEFINE _PROLIFERATE_ name(Proliferate) notAtarget(<anyamount>*) propagate
|
||||
#AUTO_DEFINE _PROLIFERATE_ name(Proliferate) notatarget(<anyamount>*) duplicatecounters(single)
|
||||
|
||||
# Proliferate, still need to target players since the old code doesn't work (*[artifact;creature;...;players]) just let you target creature and player
|
||||
#AUTO_DEFINE _OLDPROLIFERATE_ name(proliferate) notatarget(<anyamount>*) proliferate
|
||||
#AUTO_DEFINE _OLDPROLIFERATE_ name(Proliferate) notAtarget(<anyamount>*) propagate
|
||||
#AUTO_DEFINE _OLDOLDPROLIFERATE_ name(proliferate) notatarget(<anyamount>*) proliferate
|
||||
|
||||
# Populate
|
||||
#AUTO_DEFINE _POPULATE_ name(Populate) clone notAtarget(creature[token]|myBattlefield)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
#Primitives Pack for Wagic the Homebrew.
|
||||
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
|
||||
#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 16-06-2021
|
||||
#I sorted this programatically so the other comments are removed except for AUTO_DEFINE - Vitty85 16-07-2021
|
||||
[card]
|
||||
name=Abandon Reason
|
||||
target=<upto:2>creature
|
||||
@@ -1975,7 +1975,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Ajani's Pridemate
|
||||
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
|
||||
text=Whenever you gain life, put a +1/+1 counter on Ajani's Pridemate.
|
||||
mana={1}{W}
|
||||
type=Creature
|
||||
@@ -5143,7 +5143,7 @@ toughness=4
|
||||
[card]
|
||||
name=Archangel of Thune
|
||||
abilities=flying,lifelink
|
||||
auto=@lifeof(player) from(*[-lifefaker]):all(creature|mybattlefield) counter(1/1,1)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):all(creature|mybattlefield) counter(1/1,1)
|
||||
text=Flying. -- Lifelink. -- Whenever you gain life, put a +1/+1 counter on each creature you control.
|
||||
mana={3}{W}{W}
|
||||
type=Creature
|
||||
@@ -6778,7 +6778,7 @@ toughness=2
|
||||
[card]
|
||||
name=Atraxa, Praetors' Voice
|
||||
abilities=flying,vigilance,deathtouch,lifelink
|
||||
auto=@each my end:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=@each my end:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Flying, vigilance, deathtouch, lifelink -- At the beginning of your end step, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={G}{W}{U}{B}
|
||||
type=Legendary Creature
|
||||
@@ -8902,9 +8902,10 @@ type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Bant Panorama
|
||||
auto={T}:Add{1}
|
||||
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;island;forest;plains]|myLibrary)
|
||||
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;island;forest;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
|
||||
auto={T}:Add{C}
|
||||
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Bant Panorama: Search your library for a basic Forest, Plains, or Island card and put it onto the battlefield tapped. Then shuffle your library.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -12217,7 +12218,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Bloodbond Vampire
|
||||
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
|
||||
text=Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.
|
||||
mana={2}{B}{B}
|
||||
type=Creature
|
||||
@@ -15125,8 +15126,8 @@ toughness=4
|
||||
[card]
|
||||
name=Brisela, Voice of Nightmares
|
||||
auto=meldfrom(Gisela, the Broken Blade|Bruna, the Fading Light)
|
||||
abilities=flying, first strike, vigilance, lifelink
|
||||
auto=maxcast(*[manacost<4])0 opponent
|
||||
abilities=flying,first strike,vigilance,lifelink
|
||||
auto=maxcast(*[manacost<=3])0 opponent
|
||||
text=Flying, first strike, vigilance, lifelink -- Your opponents can't cast spells with converted mana cost 3 or less.
|
||||
type=Legendary Creature
|
||||
subtype=Eldrazi Angel
|
||||
@@ -15376,7 +15377,7 @@ type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Bruna, the Fading Light
|
||||
abilities=flying, vigilance
|
||||
abilities=flying,vigilance
|
||||
autostack=if casted(this) then may moveTo(mybattlefield) target(creature[angel;human]|mygraveyard)
|
||||
text=When you cast Bruna, the Fading Light, you may return target Angel or Human creature card from your graveyard to the battlefield. -- Flying, vigilance -- (Melds with Gisela, the Broken Blade.)
|
||||
mana={5}{W}{W}
|
||||
@@ -20321,7 +20322,7 @@ toughness=1
|
||||
[card]
|
||||
name=Cliffhaven Vampire
|
||||
abilities=flying
|
||||
auto=@lifeof(player) from(*[-lifefaker]):life:-1 opponent
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):life:-1 opponent
|
||||
text=Flying -- Whenever you gain life, each opponent loses 1 life.
|
||||
mana={2}{W}{B}
|
||||
type=Creature
|
||||
@@ -22111,7 +22112,7 @@ toughness=1
|
||||
[card]
|
||||
name=Contagion Clasp
|
||||
auto=counter(-1/-1,1) target(creature)
|
||||
auto={4}{T}:notatarget(<anyamount>*) propagate
|
||||
auto={4}{T}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=When Contagion Clasp enters the battlefield, put a -1/-1 counter on target creature. -- {4}, Tap: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={2}
|
||||
type=Artifact
|
||||
@@ -22119,7 +22120,7 @@ type=Artifact
|
||||
[card]
|
||||
name=Contagion Engine
|
||||
auto=target(player) ability$!name(target player) counter(-1/-1,1) all(creature|mybattlefield)!$ targetedplayer
|
||||
auto={4}{T}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) propagate && propagate
|
||||
auto={4}{T}:name(Proliferate) NotATarget(<anyamount>*) transforms((,newability[duplicatecounters(single)],newability[duplicatecounters(single)])) oneshot
|
||||
text=When Contagion Engine enters the battlefield, put a -1/-1 counter on each creature target player controls. -- {4},{T}: Proliferate, then proliferate again. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there. Then do it again.)
|
||||
mana={6}
|
||||
type=Artifact
|
||||
@@ -22569,7 +22570,7 @@ toughness=1
|
||||
[card]
|
||||
name=Core Prowler
|
||||
abilities=infect
|
||||
auto=@movedto(this|mygraveyard) from(this|mybattlefield):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=@movedto(this|mygraveyard) from(this|mybattlefield):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- When Core Prowler dies, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={4}
|
||||
type=Artifact Creature
|
||||
@@ -22980,8 +22981,7 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Courser of Kruphix
|
||||
abilities=showfromtoplibrary
|
||||
auto=canplaylandlibrarytop
|
||||
abilities=showfromtoplibrary,canplaylandlibrarytop
|
||||
auto=@movedTo(land|mybattlefield):life:1
|
||||
text=Play with the top card of your library revealed. -- You may play the top card of your library if it's a land card. -- Whenever a land enters the battlefield under your control, you gain 1 life.
|
||||
mana={1}{G}{G}
|
||||
@@ -32124,7 +32124,7 @@ toughness=4
|
||||
[card]
|
||||
name=Drogskol Reaver
|
||||
abilities=flying,double strike,lifelink
|
||||
auto=@lifeof(player) from(*[-lifefaker]):draw:1 controller
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):draw:1 controller
|
||||
text=Flying, double strike, lifelink -- Whenever you gain life, draw a card.
|
||||
mana={5}{W}{U}
|
||||
type=Creature
|
||||
@@ -35515,7 +35515,7 @@ toughness=7
|
||||
[/card]
|
||||
[card]
|
||||
name=Emmessi Tome
|
||||
auto={5}{T}:auto={T}:draw:2 && transforms((,newability[target(*|myhand) reject])) forever
|
||||
auto={5}{T}:draw:2 && transforms((,newability[target(*|myhand) reject])) forever
|
||||
text={5}, {T}: Draw two cards, then discard a card.
|
||||
mana={4}
|
||||
type=Artifact
|
||||
@@ -36845,9 +36845,10 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Esper Panorama
|
||||
auto={T}:Add{1}
|
||||
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;swamp;island;plains]|myLibrary)
|
||||
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;swamp;island;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
|
||||
auto={T}:Add{C}
|
||||
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Esper Panorama: Search your library for a basic Plains, Island, or Swamp card and put it onto the battlefield tapped. Then shuffle your library.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -43795,7 +43796,7 @@ type=Sorcery
|
||||
name=Fuel for the Cause
|
||||
target=*|stack
|
||||
auto=fizzle
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Counter target spell, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={2}{U}{U}
|
||||
type=Instant
|
||||
@@ -44142,8 +44143,7 @@ toughness=8
|
||||
[/card]
|
||||
[card]
|
||||
name=Future Sight
|
||||
abilities=showfromtoplibrary
|
||||
auto=canplayfromlibrarytop
|
||||
abilities=showfromtoplibrary,canplayfromlibrarytop
|
||||
text=Play with the top card of your library revealed. -- You may play the top card of your library.
|
||||
mana={2}{U}{U}{U}
|
||||
type=Enchantment
|
||||
@@ -44570,8 +44570,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Garruk's Horde
|
||||
abilities=trample,showfromtoplibrary
|
||||
auto=canplaycreaturelibrarytop
|
||||
abilities=trample,showfromtoplibrary,canplaycreaturelibrarytop
|
||||
text=Trample -- Play with the top card of your library revealed. -- You may cast the top card of your library if it's a creature card. (Do this only any time you could cast that creature card. You still pay the spell's costs.)
|
||||
mana={5}{G}{G}
|
||||
type=Creature
|
||||
@@ -46465,8 +46464,8 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Gisela, the Broken Blade
|
||||
abilities=flying, first strike, lifelink
|
||||
auto=@each my endofturn:target(Bruna the Fading Light) meld(Brisela Voice of Nightmares)
|
||||
abilities=flying,first strike,lifelink
|
||||
auto=@each my endofturn:target(Bruna^ the Fading Light|mybattlefield) meld(Brisela, Voice of Nightmares)
|
||||
text=Flying, first strike, lifelink -- At the beginning of your end step, if you both own and control Gisela, the Broken Blade and a creature named Bruna, the Fading Light, exile them, then meld them into Brisela, Voice of Nightmares.
|
||||
mana={2}{W}{W}
|
||||
type=Legendary Creature
|
||||
@@ -49374,6 +49373,15 @@ text=Grasslands enters the battlefield tapped. -- {T}, Sacrifice Grasslands: Sea
|
||||
type=Land
|
||||
[/card]
|
||||
[card]
|
||||
name=Grave Betrayal
|
||||
auto=@movedTo(creature|opponentGraveyard) from(Battlefield):all(trigger[to]) transforms((,newability[phaseaction[endofturn once] moveTo(opponentBattlefield)]))
|
||||
auto=@movedTo(creature[fresh]|myBattlefield) from(opponentGraveyard):all(trigger[to]) transforms((,newability[counter(1/1)]))
|
||||
auto=@movedTo(creature[fresh]|myBattlefield) from(opponentGraveyard):all(trigger[to]) transforms((Zombie,black)) forever
|
||||
text=Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types.
|
||||
mana={5}{B}{B}
|
||||
type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Grave Birthing
|
||||
target=opponent
|
||||
auto=ability$!moveto(exile) notatarget(*|mygraveyard)!$ targetedplayer
|
||||
@@ -50225,7 +50233,7 @@ subtype=Equipment
|
||||
name=Grim Affliction
|
||||
target=creature
|
||||
auto=counter(-1/-1,1)
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Put a -1/-1 counter on target creature, then proliferate.
|
||||
mana={2}{B}
|
||||
type=Instant
|
||||
@@ -50593,9 +50601,10 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Grixis Panorama
|
||||
auto={T}:Add{1}
|
||||
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;island;swamp]|myLibrary)
|
||||
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;island;swamp]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
|
||||
auto={T}:Add{C}
|
||||
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search island) target(island[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Grixis Panorama: Search your library for a basic Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -51513,6 +51522,14 @@ power=2
|
||||
toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Gutter Grime
|
||||
auto=@movedTo(creature[-token]|myGraveyard) from(myBattlefield):counter(0/0,1,Slime)
|
||||
auto=@counteradded(0/0,1,Slime) from(this):token(Ooze,Creature Ooze,type:enchantment{counter(0/0,1,Slime)}:mybattlefield/type:enchantment{counter(0/0,1,Slime)}:mybattlefield cdaactive,green)
|
||||
text=Whenever a notoken creature you control dies, put a slime counter on Gutter Grime, then create a green Ooze creature token with "This creature's power and toughness are each equal to the number of slime counters on Gutter Grime."
|
||||
mana={4}{G}
|
||||
type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Gutter Skulk
|
||||
mana={1}{B}
|
||||
type=Creature
|
||||
@@ -56951,7 +56968,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Ignorant Bliss
|
||||
auto=hand(blink)ueot all(*|myhand)
|
||||
auto=all(*|myhand) moveto(myexile) and!( transforms((,newability[phaseaction[endofturn once checkex] moveto(myhand)])) ueot )!
|
||||
auto=phaseaction[endofturn once] draw:1
|
||||
text=Exile all cards from your hand face down. At the beginning of the next end step, return those cards to your hand, then draw a card.
|
||||
mana={1}{R}
|
||||
@@ -57864,7 +57881,7 @@ toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Inexorable Tide
|
||||
auto=@movedto(mystack) from(*|myhand):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=@movedto(mystack) from(*|myhand):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Whenever you cast a spell, proliferate.
|
||||
mana={3}{U}{U}
|
||||
type=Enchantment
|
||||
@@ -60686,9 +60703,10 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Jund Panorama
|
||||
auto={T}:Add{1}
|
||||
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;swamp]|myLibrary)
|
||||
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;forest;swamp]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
|
||||
auto={T}:Add{C}
|
||||
auto={1}{T}{S}:name(search swamp) target(swamp[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Jund Panorama: Search your library for a basic Swamp, Mountain, or Forest card and put it onto the battlefield tapped. Then shuffle your library.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -61148,7 +61166,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Kalastria Nightwatch
|
||||
auto=@lifeof(player) from(*[-lifefaker]):flying ueot
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):flying ueot
|
||||
text=Whenever you gain life, Kalastria Nightwatch gains flying until end of turn.
|
||||
mana={4}{B}
|
||||
type=Creature
|
||||
@@ -61545,7 +61563,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Karlov of the Ghost Council
|
||||
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,2)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,2)
|
||||
auto={W}{B}{C(1/1,-6)}:moveto(exile) target(creature)
|
||||
text=Whenever you gain life, put two +1/+1 counters on Karlov of the Ghost Council. -- {W}{B}, Remove six +1/+1 counters from Karlov of the Ghost Council: Exile target creature.
|
||||
mana={W}{B}
|
||||
@@ -69763,8 +69781,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Magus of the Future
|
||||
abilities=showfromtoplibrary
|
||||
auto=canplayfromlibrarytop
|
||||
abilities=showfromtoplibrary,canplayfromlibrarytop
|
||||
text=Play with the top card of your library revealed. -- You may play the top card of your library.
|
||||
mana={2}{U}{U}{U}
|
||||
type=Creature
|
||||
@@ -70052,7 +70069,7 @@ toughness=1
|
||||
[card]
|
||||
name=Malakir Familiar
|
||||
abilities=flying,deathtouch
|
||||
auto=@lifeof(player) from(*[-lifefaker]):1/1 ueot
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):1/1 ueot
|
||||
text=Flying, deathtouch -- Whenever you gain life, Malakir Familiar gets +1/+1 until end of turn.
|
||||
mana={2}{B}
|
||||
type=Creature
|
||||
@@ -72274,8 +72291,7 @@ subtype=Aura
|
||||
[/card]
|
||||
[card]
|
||||
name=Melek, Izzet Paragon
|
||||
abilities=showfromtoplibrary
|
||||
auto=canplayinstantsorcerylibrarytop
|
||||
abilities=showfromtoplibrary,canplayinstantsorcerylibrarytop
|
||||
auto=@movedto(instant,sorcery|mystack) from(mylibrary):all(trigger[to]) castcard(copied noevent)
|
||||
text=Play with the top card of your library revealed. -- You may cast the top card of your library if it's an instant or sorcery card. -- Whenever you cast an instant or sorcery spell from your library, copy it. You may choose new targets for the copy.
|
||||
mana={4}{U}{R}
|
||||
@@ -78387,9 +78403,10 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Naya Panorama
|
||||
auto={T}:Add{1}
|
||||
aicode=activate moveTo(myBattlefield) and!(tap(noevent))! target(*[basic;mountain;forest;plains]|myLibrary)
|
||||
auto={1}{T}{S}:name(search card) reveal:plibrarycount optionone name(choose card) target(*[basic;mountain;forest;plains]|reveal) moveto(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveto(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(ownerlibrary) and!(moveTo(myBattlefield) and!(tap(noevent))!)! afterrevealedend revealend
|
||||
auto={T}:Add{C}
|
||||
auto={1}{T}{S}:name(search plains) target(plains[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search mountain) target(mountain[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
auto={1}{T}{S}:name(search forest) target(forest[basic]|myLibrary) moveTo(myBattlefield) and!( tap(noevent) )!
|
||||
text={T}: Add {1} to your mana pool. -- {1}, {T}, Sacrifice Naya Panorama: Search your library for a basic Mountain, Forest, or Plains card and put it onto the battlefield tapped. Then shuffle your library.
|
||||
type=Land
|
||||
[/card]
|
||||
@@ -80034,7 +80051,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Nirkana Assassin
|
||||
auto=@lifeof(player) from(*[-lifefaker]):deathtouch ueot
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):deathtouch ueot
|
||||
text=Whenever you gain life, Nirkana Assassin gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.)
|
||||
mana={2}{B}
|
||||
type=Creature
|
||||
@@ -82302,26 +82319,7 @@ toughness=4
|
||||
[/card]
|
||||
[card]
|
||||
name=Opalescence
|
||||
auto=lord(other enchantment[-aura;manacost=1]) transforms((,newability[becomes(Creature)],setpower=1,settoughness=1))
|
||||
auto=lord(other enchantment[-aura;manacost=2]) transforms((,newability[becomes(Creature)],setpower=2,settoughness=2))
|
||||
auto=lord(other enchantment[-aura;manacost=3]) transforms((,newability[becomes(Creature)],setpower=3,settoughness=3))
|
||||
auto=lord(other enchantment[-aura;manacost=4]) transforms((,newability[becomes(Creature)],setpower=4,settoughness=4))
|
||||
auto=lord(other enchantment[-aura;manacost=5]) transforms((,newability[becomes(Creature)],setpower=5,settoughness=5))
|
||||
auto=lord(other enchantment[-aura;manacost=6]) transforms((,newability[becomes(Creature)],setpower=6,settoughness=6))
|
||||
auto=lord(other enchantment[-aura;manacost=7]) transforms((,newability[becomes(Creature)],setpower=7,settoughness=7))
|
||||
auto=lord(other enchantment[-aura;manacost=8]) transforms((,newability[becomes(Creature)],setpower=8,settoughness=8))
|
||||
auto=lord(other enchantment[-aura;manacost=9]) transforms((,newability[becomes(Creature)],setpower=9,settoughness=9))
|
||||
auto=lord(other enchantment[-aura;manacost=10]) transforms((,newability[becomes(Creature)],setpower=10,settoughness=10))
|
||||
auto=lord(other enchantment[-aura;manacost=11]) transforms((,newability[becomes(Creature)],setpower=11,settoughness=11))
|
||||
auto=lord(other enchantment[-aura;manacost=12]) transforms((,newability[becomes(Creature)],setpower=12,settoughness=12))
|
||||
auto=lord(other enchantment[-aura;manacost=13]) transforms((,newability[becomes(Creature)],setpower=13,settoughness=13))
|
||||
auto=lord(other enchantment[-aura;manacost=14]) transforms((,newability[becomes(Creature)],setpower=14,settoughness=14))
|
||||
auto=lord(other enchantment[-aura;manacost=15]) transforms((,newability[becomes(Creature)],setpower=15,settoughness=15))
|
||||
auto=lord(other enchantment[-aura;manacost=16]) transforms((,newability[becomes(Creature)],setpower=16,settoughness=16))
|
||||
auto=lord(other enchantment[-aura;manacost=17]) transforms((,newability[becomes(Creature)],setpower=17,settoughness=17))
|
||||
auto=lord(other enchantment[-aura;manacost=18]) transforms((,newability[becomes(Creature)],setpower=18,settoughness=18))
|
||||
auto=lord(other enchantment[-aura;manacost=19]) transforms((,newability[becomes(Creature)],setpower=19,settoughness=19))
|
||||
auto=lord(other enchantment[-aura;manacost=20]) transforms((,newability[becomes(Creature)],setpower=20,settoughness=20))
|
||||
auto=lord(other enchantment[-aura]) transforms((creature,newability[manacost/manacost]))
|
||||
mana={2}{W}{W}
|
||||
type=Enchantment
|
||||
text=Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost. It's still an enchantment.
|
||||
@@ -82470,9 +82468,8 @@ toughness=5
|
||||
[/card]
|
||||
[card]
|
||||
name=Oracle of Mul Daya
|
||||
abilities=showfromtoplibrary
|
||||
abilities=showfromtoplibrary,canplaylandlibrarytop
|
||||
auto=maxPlay(land)+1
|
||||
auto=canplaylandlibrarytop
|
||||
text=You may play an additional land on each of your turns. -- Play with the top card of your library revealed. -- You may play the top card of your library if it's a land card.
|
||||
mana={3}{G}
|
||||
type=Creature
|
||||
@@ -87050,7 +87047,7 @@ toughness=1
|
||||
[/card]
|
||||
[card]
|
||||
name=Plaguemaw Beast
|
||||
auto={T}{S(creature|mybattlefield)}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto={T}{S(creature|mybattlefield)}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text={T}, Sacrifice a creature: Proliferate.
|
||||
mana={3}{G}{G}
|
||||
type=Creature
|
||||
@@ -89585,7 +89582,7 @@ toughness=2
|
||||
[/card]
|
||||
[card]
|
||||
name=Puppet's Verdict
|
||||
auto=flipacoin winability destroy all(creature[power<=2]) winabilityend loseability destroy all(creature[power>=3]) loseabilityend flipend
|
||||
auto=all(*[zpos=1]|mylibrary) transforms((,newability[@coinflipped(this|mylibrary) once:if compare(lastflipresult)~equalto~compare(lastflipchoice) then all(creature[power<=2]) destroy else all(creature[power>=3]) destroy],newability[name(Filp a coin) flipacoin winability donothing winabilityend loseability donothing loseabilityend flipend])) oneshot
|
||||
text=Flip a coin. If you win the flip, destroy all creatures with power 2 or less. If you lose the flip, destroy all creatures with power 3 or greater.
|
||||
mana={1}{R}{R}
|
||||
type=Instant
|
||||
@@ -101131,7 +101128,7 @@ type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Searing Meditation
|
||||
auto=@lifeof(player) from(*[-lifefaker]):pay({2}) target(creature,player) damage:2
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):pay({2}) target(creature,player) damage:2
|
||||
text=Whenever you gain life, you may pay {2}. If you do, Searing Meditation deals 2 damage to target creature or player.
|
||||
mana={1}{R}{W}
|
||||
type=Enchantment
|
||||
@@ -102337,7 +102334,7 @@ type=Sorcery
|
||||
[/card]
|
||||
[card]
|
||||
name=Serene Steward
|
||||
auto=@lifeof(player) from(*[-lifefaker]):pay({W}) counter(1/1) target(creature)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):pay({W}) counter(1/1) target(creature)
|
||||
text=Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature.
|
||||
mana={1}{W}
|
||||
type=Creature
|
||||
@@ -111876,7 +111873,7 @@ toughness=3
|
||||
name=Spread the Sickness
|
||||
target=creature
|
||||
auto=destroy
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Destroy target creature, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={4}{B}
|
||||
type=Sorcery
|
||||
@@ -112835,7 +112832,7 @@ type=Sorcery
|
||||
[card]
|
||||
name=Steady Progress
|
||||
auto=draw:1 controller
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Draw a card, then proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={2}{U}
|
||||
type=Instant
|
||||
@@ -119276,7 +119273,7 @@ type=Sorcery
|
||||
[card]
|
||||
name=Tezzeret's Gambit
|
||||
auto=draw:2 controller
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Draw two cards, then proliferate.
|
||||
color=blue
|
||||
mana={3}{p(U)}
|
||||
@@ -120842,7 +120839,7 @@ type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Throne of Geth
|
||||
auto={S(artifact|mybattlefield)}{T}:_PROLIFERATE_
|
||||
auto={S(artifact|mybattlefield)}{T}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text={T},Sacrifice an artifact: Proliferate.
|
||||
mana={2}
|
||||
type=Artifact
|
||||
@@ -120900,7 +120897,7 @@ toughness=1
|
||||
[card]
|
||||
name=Thrummingbird
|
||||
abilities=flying
|
||||
auto=@combatdamaged(player) from(this):notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=@combatdamaged(player) from(this):name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Flying -- Whenever Thrummingbird deals combat damage to a player, proliferate.
|
||||
mana={1}{U}
|
||||
type=Creature
|
||||
@@ -129085,7 +129082,7 @@ subtype=Aura
|
||||
[card]
|
||||
name=Viral Drake
|
||||
abilities=flying,infect
|
||||
auto={3}{U}:notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto={3}{U}:name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Flying -- Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -- {3}{U}: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.)
|
||||
mana={3}{U}
|
||||
type=Creature
|
||||
@@ -130171,7 +130168,7 @@ type=Legendary Land
|
||||
name=Volt Charge
|
||||
target=creature,player
|
||||
auto=damage:3
|
||||
auto=notatarget(<anyamount>*[artifact;creature;enchantment;land;planeswalker;player]) proliferate
|
||||
auto=name(Proliferate) NotATarget(<anyamount>*) duplicatecounters(single)
|
||||
text=Volt Charge deals 3 damage to target creature or player. Proliferate.
|
||||
mana={2}{R}
|
||||
type=Instant
|
||||
@@ -131076,7 +131073,7 @@ toughness=5
|
||||
[card]
|
||||
name=Wall of Limbs
|
||||
abilities=defender
|
||||
auto=@lifeof(player) from(*[-lifefaker]):counter(1/1,1)
|
||||
auto=@lifeof(player) from(*[-lifefaker]|*):counter(1/1,1)
|
||||
auto={5}{B}{B}{S}:name(Lose Life) target(player) life:-storedpower
|
||||
text=Defender (This creature can't attack.) -- Whenever you gain life, put a +1/+1 counter on Wall of Limbs. -- {5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power.
|
||||
mana={2}{B}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
grade=borderline
|
||||
#Planeswalkers Primitives Pack for Wagic the Homebrew.
|
||||
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
|
||||
#We sorted this in alphabetical order - Luruz & Vitty85 16-06-2021
|
||||
#We sorted this in alphabetical order - Luruz & Vitty85 16-07-2021
|
||||
[card]
|
||||
name=Abian, Luvion Usurper
|
||||
auto=counter(0/0,5,loyalty)
|
||||
@@ -84,7 +84,7 @@ subtype=Ajani
|
||||
[card]
|
||||
name=Ajani, Mentor of Heroes
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto=activate transforms((,newability[if type(*[creature;aura;planeswalker;zpos<=4]|myLibrary)~morethan~0 then target(*[creature;aura;planeswalker;zpos<=4]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot
|
||||
aicode=activate transforms((,newability[if type(*[creature;aura;planeswalker;zpos<=4]|myLibrary)~morethan~0 then target(*[creature;aura;planeswalker;zpos<=4]|myLibrary) moveTo(myHand) and!( all(other *[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! )! else all(*[zpos<=4]|mylibrary) moveto(myreveal) and!( bottomoflibrary )! ])) oneshot
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Distribute three +1/+1 counters) ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller && ability$!counter(1/1,1) target(creature)!$ controller
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Look 4 cards for creature, aura or planeswalker) reveal:4 optionone name(Get a card) target(<1>*[creature;planeswalker;aura]|reveal) moveto(myhand) optiononeend optiontwo name(put on bottom) target(<4>*|reveal) bottomoflibrary optiontwoend revealend
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Gain 100 life) life:100 controller
|
||||
@@ -739,6 +739,18 @@ type=Legendary Planeswalker
|
||||
subtype=Dovin
|
||||
[/card]
|
||||
[card]
|
||||
name=Ellywick Tumblestrum
|
||||
aicode=activate transforms((,newability[target(creature[zpos<=6]|myLibrary) moveTo(myHand) and!( transforms((,newability[if cantargetcard(*[legendary]|*) then life:3 controller],newability[all(other *[zpos<=6]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )!])) oneshot
|
||||
auto=counter(0/0,4,Loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Venture into the dungeon) if compare(type:*[nodngplr]:mybattlefieldplustype:*[nodngopp]:opponentbattlefieldplusend)~equalto~0 then name(Venture into dungeon) name(Venture into dungeon) transforms((,newability[if type(*[dungeon]|mycommandzone)~morethan~0 then name(Explore the dungeon) name(Explore the dungeon) all(*[dungeon]|mycommandzone) counter(0/0.1.Explore)],newability[if type(*[dungeon]|mycommandzone)~equalto~0 then name(Choose a new dungeon) name(Choose a new dungeon) target(*[dungeon]|mysideboard) moveTo(mycommandzone) and!( counter(0/0.1.Explore) )!])) oneshot asSorcery
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Look top 6 cards) reveal:6 optionone name(Get a creature) target(<upto:1>creature|reveal) moveto(myhand) and!( transforms((,newability[if cantargetcard(*[legendary]|*) then life:3 controller])) oneshot )! optiononeend optiontwo name(Put on bottom) target(*|reveal) bottomoflibrary and!( all(*|reveal) bottomoflibrary )! optiontwoend revealend
|
||||
auto={C(0/0,-7,Loyalty)}:name(-7: Get emblem on your creatures) emblem transforms((,newability[lord(creature|mybattlefield) trample],newability[lord(creature|mybattlefield) foreach(*[dungeoncompleted]|myzones) 2/2])) forever dontremove
|
||||
text=+1: Venture into the dungeon. (Enter the first room or advance to the next room.) -- -2: Look at the top six cards of your library. You may reveal a creature card from among them and put it into your hand. If 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
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Create a 1/1 soldier) create(Soldier:creature Soldier:1/1:white)
|
||||
@@ -1024,6 +1036,18 @@ subtype=Gideon
|
||||
color=white
|
||||
[/card]
|
||||
[card]
|
||||
name=Grand Master of Flowers
|
||||
auto=counter(0/0,3,Loyalty)
|
||||
auto=this(counter{0/0.1.Loyalty}>=7) becomes(Creature Dragon God,7/7,flying,indestructible)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Creature can't attack) target(creature[-first strike;-double strike;-vigilance]|battlefield) transforms((,newability[cantblock],newability[cantattack],newability[cantpwattack])) uynt
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Search Monk in library) target(Monk of the Open Hand|mylibrary) moveto(myhand) and!( shuffle )!
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Search Monk in graveyard) target(Monk of the Open Hand|mygraveyard) moveto(myhand)
|
||||
text=As long as Grand Master of Flowers has seven or more loyalty counters on him, 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
|
||||
auto=counter(0/0,3,loyalty)
|
||||
auto=transforms((removealltypes,newability[becomes(Legendary Planeswalker Grist)])) forever
|
||||
@@ -1105,6 +1129,18 @@ type=Legendary Planeswalker
|
||||
subtype=Huatli
|
||||
[/card]
|
||||
[card]
|
||||
name=Inzerva, Master of Insights
|
||||
aicode=activate target(*[zpos<=2]|opponentLibrary) moveto(opponentreveal) and!( bottomoflibrary )!
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,+2,Loyalty)}:name(+2: Draw 2 cards and discard) draw:2 && reject target(*|myhand)
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Look at opponent library and scry 2) reveal:2 revealzone(opponentlibrary) optionone name(Put on top) target(<upto:2>*|reveal) moveto(ownerlibrary) optiononeend optiontwo name(Put on bottom) target(<2>*|reveal) bottomoflibrary optiontwoend afterrevealed name(Scry 2) scry:2 scrycore delayed dontshow donothing scrycoreend scryend afterrevealedend revealend
|
||||
auto={C(0/0,-4,Loyalty)}:name(-4: Emblem: Draw to deal damage) token(Inzerva Emblem,Inzerva Emblem,0/0,shroud,indestructible) and!( transforms((,newability[{0}:name(Look opponent hand) target(*|opponenthand) moveTo(myreveal) and!( moveto(opponenthand) )!],newability[@drawfoeof(player):damage:1 opponent] )) forever )!
|
||||
text=+2: Draw two cards, then discard a card. -- −2: Look at the top two cards of each other 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
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto=@drawof(player):transforms((,newability[@drawof(player) restriction{once}:counter(1/1,1) target(creature|myBattlefield)])) ueot
|
||||
@@ -1118,9 +1154,11 @@ subtype=Jace
|
||||
[card]
|
||||
name=Jace, Architect of Thought
|
||||
auto=counter(0/0,4,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Attacking creatures get -1/-0) all(creature|opponentbattlefield) transforms((,newability[@combat(attacking) source(this):all(trigger[from]) -1/-0 ueot])) uynt oneshot
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: CANNOT BE CODED) donothing
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Exile a card from library and cast it) moveto(exile) target(*|opponentLibrary) and!( transforms((,canplayfromexile,castcard(normal))) ueot )!
|
||||
aicode=activate target(*[zpos<=3]|mylibrary) moveto(myhand) and!( transforms((,newability[all(*[zpos<=3]|mylibrary) moveto(myreveal) and!( bottomoflibrary )!])) oneshot )!
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Attacking creatures get -1/-0) transforms((,newability[counter(0/0.1.JaceEffect)],newability[phaseaction[my untap once sourceinplay] counter(0/0.-1.JaceEffect)])) forever
|
||||
auto=this(counter{0/0.1.JaceEffect}>0) lord(creature|opponentbattlefield) transforms((,newability[@combat(attacking) source(this):-1/0 ueot]))
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Look top 3 cards) reveal:3 optionone name(Put in hand) target(*|reveal) moveto(myhand) optiononeend optiontwo all(*|reveal) bottomoflibrary optiontwoend revealend
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Exile cards from libraries) target(*[-land]|mylibrary) moveto(exile) and!( transforms((,newability[zerocast],newability[canplayfromexile],newability[name(Search opponent library) target(*[-land]|opponentlibrary) moveto(myexile) and!( transforms((,newability[choice name(Cast opponent exiled card) activate castcard(normal)],newability[choice name(Don't cast opponent exiled card) moveto(ownerExile)])) ueot )!])) ueot )!
|
||||
text=+1: Until your next turn, whenever a creature an opponent controls attacks, it gets -1/-0 until end of turn. -- -2: Reveal the top three cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other on the bottom of your library in any order. -- -8: For each player, search that 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}
|
||||
type=Legendary Planeswalker
|
||||
@@ -1518,8 +1556,8 @@ name=Kiora, the Crashing Wave
|
||||
auto=counter(0/0,2,loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Prevention all damamge dealt by and to) target(*|opponentbattlefield) transforms((,newability[preventalldamage from(this)],newability[preventalldamage to(this)])) uynt
|
||||
auto={C(0/0,-1,Loyalty)}:name(-1: Draw a card and may play additional land) draw:1 controller && maxPlay(land)+1 ueot
|
||||
auto={C(0/0,-5,Loyalty)}:name(-5: Emblem: "Each my end of turn create a 9/9 Kraken") emblem transforms((,newability[@each my endofturn:token(Kraken,Creature Kraken,9/9,blue) controller])) forever dontremove
|
||||
text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield." -- Starting Loyalty (2)
|
||||
auto={C(0/0,-5,Loyalty)}:name(-5: Emblem: "Each my end of turn create a 9/9 Kraken") emblem transforms((,newability[@each my endofturn:token(Kraken^Creature Kraken^9/9^blue) controller])) forever dontremove
|
||||
text=+1: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. -- -1: Draw a card. You may play an additional land this turn. -- -5: You get an emblem with "At the beginning of your end step, put a 9/9 blue Kraken creature token onto the battlefield."
|
||||
mana={2}{G}{U}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Kiora
|
||||
@@ -1693,6 +1731,18 @@ type=Legendary Planeswalker
|
||||
subtype=Liliana
|
||||
[/card]
|
||||
[card]
|
||||
name=Lolth, Spider Queen
|
||||
auto=counter(0/0,4,Loyalty)
|
||||
auto=@movedto(creature|graveyard) from(mybattlefield):name(Put loyalty counter) counter(0/0,1,Loyalty)
|
||||
auto={C(0/0,0,Loyalty)}:name(+0: Draw card and lose life) draw:1 controller && life:-1 controller
|
||||
auto={C(0/0,-3,Loyalty)}:name(-3: Create spiders) token(Spider,Creature Spider,2/1,black,reach,menace)*2
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Get emblem on combat damage) emblem transforms((,newability[@combatdamagefoeof(player) from(creature|mybattlefield) restriction{compare(oplifelost)~lessthan~8} turnlimited:phaseaction[my combatdamage once] name(Damage opponent) damage:8minusoplifelostminusend opponent])) forever dontremove
|
||||
text=Whenever a creature you control dies, put a loyalty counter on Lolth, Spider Queen. -- 0: You draw a card and you lose 1 life. -- -3: Create two 2/1 black Spider creature tokens with menace and reach. -- -8: You get an emblem with "Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference."
|
||||
mana={3}{B}{B}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Lolth
|
||||
[/card]
|
||||
[card]
|
||||
name=Lord Windgrace
|
||||
abilities=canbecommander
|
||||
auto=counter(0/0,5,Loyalty)
|
||||
@@ -1729,6 +1779,17 @@ type=Legendary Planeswalker
|
||||
subtype=Lukka
|
||||
[/card]
|
||||
[card]
|
||||
name=Mordenkainen
|
||||
auto=counter(0/0,5,Loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Draw 2 cards) draw:2 && transforms((,newability[name(Put on bottom) target(*|myhand) bottomoflibrary])) forever
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Create Dog Illusion) token(Dog Mor)
|
||||
auto={C(0/0,-10,Loyalty)}:name(-10: Exchange hand and library) token(Mordenkainen Emblem,Emblem,0/0,shroud,indestructible) and!( transforms((,newability[nomaxhand],newability[all(*|myhand) moveto(myreveal) and!( all(*|mylibrary) moveto(myhand) and!( all(*|myreveal) moveto(mylibrary) and!( shuffle )! )! )!])) forever
|
||||
text=+2: Draw two cards, then put a card from your hand on the bottom of your library. -- -2: Create a blue Dog Illusion creature token with "This 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
|
||||
auto=counter(0/0,5,loyalty)
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Target creature can't be blocked) unblockable target(creature)
|
||||
@@ -1795,10 +1856,11 @@ subtype=Nahiri
|
||||
[card]
|
||||
name=Nahiri, the Harbinger
|
||||
auto=counter(0/0,4,loyalty)
|
||||
aicode=activate moveto(myBattlefield) notAtarget(artifact,creature|myLibrary) and!( transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerhand)])) forever )!
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: May discard and draw a card) may notAtarget(*|myHand) transforms((,newability[reject and!(draw:1)!])) forever
|
||||
aicode=activate target(*[artifact;creature]|myLibrary) moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerhand)])) ueot )!
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Don't discard any card) donothing
|
||||
auto={C(0/0,2,Loyalty)}:name(+2: Discard and draw a card) target(*|myHand) reject and!( draw:1 controller )!
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Exile target enchantment, tapped Artifact or Creature) ability$!name(Choose one) choice name(Exile target enchantment) moveTo(exile) target(enchantment) _ choice name(Exile target tapped creature) moveTo(exile) target(creature[tapped]) _ choice name(Exile target tapped artifact) moveTo(exile) target(artifact[tapped])!$ controller
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Search a creature or artifact) reveal:plibrarycount optionone name(choose a creature or artifact) target(artifact,creature|reveal) moveTo(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(<1>*|reveal) moveTo(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!(shuffle)! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveTo(ownerlibrary) and!(moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn sourceinplay] moveTo(ownerhand)])) oneshot )!)! afterrevealedend revealend
|
||||
auto={C(0/0,-8,Loyalty)}:name(-8: Search a creature or artifact) reveal:plibrarycount optionone name(choose a creature or artifact) target(*[artifact;creature]|reveal) moveTo(ownerlibrary) and!( becomes(tobecast) ueot )! optiononeend optiontwo name(put back) target(*|reveal) moveTo(ownerlibrary) and!( all(*|reveal) moveto(ownerlibrary) and!( shuffle )! )! optiontwoend afterrevealed all(tobecast|mylibrary) moveto(myBattlefield) and!( transforms((,newability[haste],newability[phaseaction[endofturn once sourceinplay] moveTo(ownerhand)])) ueot )! afterrevealedend revealend
|
||||
text=+2: You may discard a card. If you do, draw a card. -- -2: Exile target enchantment, tapped artifact, or tapped creature. -- -8: Search your library for an artifact or creature card, put it onto the battlefield, then shuffle your library. It gains haste. Return it to your hand at the beginning of the next end step.
|
||||
mana={2}{R}{W}
|
||||
type=Legendary Planeswalker
|
||||
@@ -2835,9 +2897,8 @@ subtype=Vivien
|
||||
[/card]
|
||||
[card]
|
||||
name=Vivien, Monsters' Advocate
|
||||
abilities=showfromtoplibrary
|
||||
abilities=showfromtoplibrary,canplaycreaturelibrarytop
|
||||
aicode=activate moveto(myBattlefield) target(creature[manacost<=storedmanacost]|mylibrary)
|
||||
auto=canplaycreaturelibrarytop
|
||||
auto=counter(0/0,3,Loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Create a Creature Beast 3/3) token(Beast Viv)
|
||||
auto={C(0/0,-2,Loyalty)}:name(-2: Cast a creature to search a lesser creature) emblem transforms((,newability[@movedTo(creature|myStak):moveTo(myBattlefield) target(creature[manacost<=storedmanacost]|myLibrary) && shuffle])) oneshot
|
||||
@@ -2996,4 +3057,15 @@ text=+1: Add X mana in any combination of {R} and/or {G} to your mana pool, wher
|
||||
mana={2}{R}{G}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Xenagos
|
||||
[/card]
|
||||
[/card]
|
||||
[card]
|
||||
name=Zariel, Archduke of Avernus
|
||||
auto=counter(0/0,4,Loyalty)
|
||||
auto={C(0/0,1,Loyalty)}:name(+1: Creatures get 1/0 and haste) all(creature|myBattlefield) transforms((,newability[1/0],newability[haste])) ueot
|
||||
auto={C(0/0,0,Loyalty)}:name(+0: Create devil) token(Devil,Creature Devil,1/1,red) and!( transforms((,newability[@movedTo(this|graveyard) from(battlefield):name(Deal 1 damage) damage:1 target(player^creature^planeswalker)])) forever )!
|
||||
auto={C(0/0,-6,Loyalty)}:name(-6: Get emblem on combat phase) emblem transforms((,newability[@combat(attacking) source(creature|myBattlefield) turnlimited:name(Gain new combat phae) nextphasealter(add^combatphases^controller^after<combatends>)],newability[@combat(attacking) source(creature|myBattlefield) turnlimited:name(Untap all creatures after combat ends) all(creature[attacking]|myBattlefield) transforms((,newability[phaseaction[my combatends once sourceinplay] untap])) ueot])) forever dontremove
|
||||
text=+1: Creatures you control get +1/+0 and gain haste until end of turn. -- 0: Create a 1/1 red Devil creature token with "When this creature dies, it deals 1 damage to any target." -- -6: You get an emblem with "At the end of the first combat phase on your turn, untap target creature you control. After this phase, there is an additional combat phase."
|
||||
mana={2}{R}{R}
|
||||
type=Legendary Planeswalker
|
||||
subtype=Zariel
|
||||
[/card]
|
||||
|
||||
@@ -2,7 +2,7 @@ grade=unsupported
|
||||
#The cards in this file are not implemented/incomplete yet.
|
||||
#Updated Card lists not in primitives (Borderline, Crappy, Unsupported and Missing Cards up to Aether Revolt) as of 3/14/2017
|
||||
#Please keep these card alphabetized, and try to have the "name=" line at the top of each card
|
||||
#I sorted this programatically - Vitty85 16-06-2021
|
||||
#I sorted this programatically - Vitty85 16-07-2021
|
||||
[card]
|
||||
name="Ach! Hans, Run!"
|
||||
text=At the beginning of your upkeep, you may say "Ach Hans, run It's the . . ." and name a creature card. If you do, search your library for the named card, put it into play, then shuffle your library. That creature has haste. Remove it from the game at end of turn.
|
||||
@@ -64,15 +64,6 @@ mana={3}
|
||||
type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Absolver Thrull
|
||||
text=Haunt (When this creature dies, exile it haunting target creature.) -- When Absolver Thrull enters the battlefield or the creature it haunts dies, destroy target enchantment.
|
||||
mana={3}{W}
|
||||
type=Creature
|
||||
subtype=Thrull Cleric
|
||||
power=2
|
||||
toughness=3
|
||||
[/card]
|
||||
[card]
|
||||
name=Abstract Iguanart
|
||||
text=Whenever you cast a spell, note the first letter of its artist's name. If that letter wasn't already noted, put a +1/+1 counter on Abstract Iguanart.
|
||||
mana={1}{R}
|
||||
@@ -4730,12 +4721,6 @@ mana={2}{G}
|
||||
type=Instant
|
||||
[/card]
|
||||
[card]
|
||||
name=Grave Betrayal
|
||||
text=Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types.
|
||||
mana={5}{B}{B}
|
||||
type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Grave Servitude
|
||||
text=You may cast Grave Servitude as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step. -- Enchant creature -- Enchanted creature gets +3/-1 and is black.
|
||||
mana={1}{B}
|
||||
@@ -4889,12 +4874,6 @@ mana={0}
|
||||
type=Artifact
|
||||
[/card]
|
||||
[card]
|
||||
name=Gutter Grime
|
||||
text=Whenever a nontoken creature you control dies, put a slime counter on Gutter Grime, then put a green Ooze creature token onto the battlefield with "This creature's power and toughness are each equal to the number of slime counters on Gutter Grime."
|
||||
mana={4}{G}
|
||||
type=Enchantment
|
||||
[/card]
|
||||
[card]
|
||||
name=Gyruda, Doom of Depths
|
||||
text=Companion — Your starting deck contains only cards with even converted mana costs. (If this card is your chosen companion, you may cast it once from outside the game.) -- When Gyruda enters the battlefield, each player puts the top four cards of their library into their graveyard. Put a creature card with an even converted mana cost from among those cards onto the battlefield under your control.
|
||||
mana={4}{UB}{UB}
|
||||
|
||||
@@ -729,6 +729,39 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class TrCardDungeonCompleted: public Trigger
|
||||
{
|
||||
public:
|
||||
bool limitOnceATurn;
|
||||
int triggeredTurn;
|
||||
int totaldng;
|
||||
string playerName;
|
||||
TrCardDungeonCompleted(GameObserver* observer, int id, MTGCardInstance * source, TargetChooser * tc, bool once = false, bool limitOnceATurn = false, int totaldng = 0, string playerName = "") :
|
||||
Trigger(observer, id, source,once, tc),limitOnceATurn(limitOnceATurn), totaldng(totaldng), playerName(playerName)
|
||||
{
|
||||
}
|
||||
|
||||
int triggerOnEventImpl(WEvent * event)
|
||||
{
|
||||
WEventCardDungeonCompleted * e = dynamic_cast<WEventCardDungeonCompleted *> (event);
|
||||
if (!e) return 0;
|
||||
if (limitOnceATurn && triggeredTurn == game->turn)
|
||||
return 0;
|
||||
if (totaldng > 0 && totaldng != e->totaldng)
|
||||
return 0;
|
||||
if (playerName != "" && playerName != e->playerName)
|
||||
return 0;
|
||||
if (!tc->canTarget(e->card)) return 0;
|
||||
triggeredTurn = game->turn;
|
||||
return 1;
|
||||
}
|
||||
|
||||
TrCardDungeonCompleted * clone() const
|
||||
{
|
||||
return NEW TrCardDungeonCompleted(*this);
|
||||
}
|
||||
};
|
||||
|
||||
class TrCardRolledDie: public Trigger
|
||||
{
|
||||
public:
|
||||
@@ -747,6 +780,8 @@ public:
|
||||
if (!e) return 0;
|
||||
if (limitOnceATurn && triggeredTurn == game->turn)
|
||||
return 0;
|
||||
if (rollresult == -1 && e->card->dieNumFaces != e->card->lastRollResult)
|
||||
return 0;
|
||||
if (rollresult > 0 && rollresult != e->card->lastRollResult)
|
||||
return 0;
|
||||
if (playerName != "" && playerName != e->playerName)
|
||||
@@ -4027,6 +4062,19 @@ public:
|
||||
AAExploresEvent * clone() const;
|
||||
~AAExploresEvent();
|
||||
};
|
||||
//Dungeon Completed
|
||||
class AAAlterDungeonCompleted: public ActivatedAbilityTP
|
||||
{
|
||||
public:
|
||||
int dungeoncounter;
|
||||
|
||||
AAAlterDungeonCompleted(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int dungeoncounter, ManaCost * _cost = NULL,
|
||||
int who = TargetChooser::UNSET);
|
||||
int resolve();
|
||||
const string getMenuText();
|
||||
AAAlterDungeonCompleted * clone() const;
|
||||
~AAAlterDungeonCompleted();
|
||||
};
|
||||
//Yidaro Counter
|
||||
class AAAlterYidaroCount: public ActivatedAbilityTP
|
||||
{
|
||||
@@ -6566,11 +6614,12 @@ class AASetDie: public InstantAbility
|
||||
{
|
||||
public:
|
||||
int side;
|
||||
int diefaces;
|
||||
string abilityToAlter;
|
||||
string abilityWin;
|
||||
string abilityLose;
|
||||
MTGAbility * abilityAltered;
|
||||
AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1,string toAdd = "");
|
||||
AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * target, int side = -1, int diefaces = 6, string toAdd = "");
|
||||
int resolve();
|
||||
const string getMenuText();
|
||||
AASetDie * clone() const;
|
||||
@@ -6582,7 +6631,8 @@ public:
|
||||
string baseAbility;
|
||||
AASetDie * setDie;
|
||||
int userchoice;
|
||||
GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL, int userchoice = 0);
|
||||
int diefaces;
|
||||
GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable * target, string toAdd = "", ManaCost * cost = NULL, int userchoice = 0, int diefaces = 6);
|
||||
int resolve();
|
||||
const string getMenuText();
|
||||
GenericRollDie * clone() const;
|
||||
|
||||
@@ -34,7 +34,8 @@ enum
|
||||
SBMENU_ADD_NORMAL = 803,
|
||||
SBMENU_ADD_SB = 804,
|
||||
SBMENU_ADD_CMD = 805,
|
||||
SBMENU_ADD_CANCEL = 806
|
||||
SBMENU_ADD_DNG = 806,
|
||||
SBMENU_ADD_CANCEL = 807
|
||||
};
|
||||
|
||||
// enums for menu options
|
||||
@@ -76,7 +77,7 @@ private:
|
||||
DeckViewerStages mStage;
|
||||
JMusic * bgMusic;
|
||||
|
||||
InteractiveButton *toggleDeckButton, *sb_cmd_Button, *sellCardButton, *statsPrevButton, *filterButton, *toggleViewButton, *toggleUpButton, *toggleDownButton, *toggleLeftButton, *toggleRightButton;
|
||||
InteractiveButton *toggleDeckButton, *sb_cmd_dng_Button, *sellCardButton, *statsPrevButton, *filterButton, *toggleViewButton, *toggleUpButton, *toggleDownButton, *toggleLeftButton, *toggleRightButton;
|
||||
|
||||
WGuiFilters * filterMenu;
|
||||
WSrcDeckViewer * source;
|
||||
@@ -91,6 +92,7 @@ private:
|
||||
DeckDataWrapper * myCollection;
|
||||
DeckDataWrapper * mySideboard;
|
||||
DeckDataWrapper * myCommandZone;
|
||||
DeckDataWrapper * myDungeonZone;
|
||||
StatsWrapper * mStatsWrapper;
|
||||
|
||||
int hudAlpha;
|
||||
@@ -115,6 +117,7 @@ private:
|
||||
void toggleView();
|
||||
void insertSideBoard();
|
||||
void insertCommandZone();
|
||||
void insertDungeonZone();
|
||||
public:
|
||||
GameStateDeckViewer(GameApp* parent);
|
||||
virtual ~GameStateDeckViewer();
|
||||
@@ -122,12 +125,13 @@ public:
|
||||
void updateFilters();
|
||||
void rebuildFilters();
|
||||
void toggleCollection();
|
||||
void toggleSB_CMD();
|
||||
void toggleSB_CMD_DNG();
|
||||
void Start();
|
||||
virtual void End();
|
||||
void addRemove(MTGCard * card);
|
||||
void SBaddRemove(MTGCard * card);
|
||||
void CMDaddRemove(MTGCard * card);
|
||||
void DNGaddRemove(MTGCard * card);
|
||||
void choiceAddRemove(MTGCard * card);
|
||||
virtual void Update(float dt);
|
||||
void renderOnScreenBasicInfo();
|
||||
|
||||
@@ -117,6 +117,7 @@ public:
|
||||
int lastFlipResult;
|
||||
int dieSide;
|
||||
int lastRollResult;
|
||||
int dieNumFaces;
|
||||
int scryedCards;
|
||||
|
||||
int stillInUse();
|
||||
|
||||
@@ -221,6 +221,7 @@ public:
|
||||
vector<string> meta_AIHints;
|
||||
vector<string> Sideboard;
|
||||
vector<string> CommandZone;
|
||||
vector<string> DungeonZone;
|
||||
string meta_unlockRequirements;
|
||||
|
||||
int meta_id;
|
||||
@@ -239,6 +240,7 @@ public:
|
||||
int remove(MTGCard * card);
|
||||
void replaceSB(vector<string> newSB = vector<string>());
|
||||
void replaceCMD(vector<string> newCMD = vector<string>());
|
||||
void replaceDNG(vector<string> newDNG = vector<string>());
|
||||
string getFilename();
|
||||
int save();
|
||||
int save(const string& destFileName, bool useExpandedDescriptions, const string& deckTitle, const string& deckDesc);
|
||||
|
||||
@@ -308,7 +308,13 @@ class Constants
|
||||
LIFEFAKER = 181,
|
||||
DOUBLEFACEDEATH = 182,
|
||||
GAINEDDOUBLEFACEDEATH = 183,
|
||||
NB_BASIC_ABILITIES = 184,
|
||||
TWODNGTRG = 184,
|
||||
NODNGOPP = 185,
|
||||
NODNGPLR = 186,
|
||||
CANPLAYAURAEQUIPTOPLIBRARY = 187,//aurasequipment
|
||||
COUNTERDEATH = 188,
|
||||
DUNGEONCOMPLETED = 189,
|
||||
NB_BASIC_ABILITIES = 190,
|
||||
|
||||
RARITY_S = 'S', //Special Rarity
|
||||
RARITY_M = 'M', //Mythics
|
||||
|
||||
@@ -250,6 +250,7 @@ public:
|
||||
MTGCardInstance * putInExile(MTGCardInstance * card);
|
||||
MTGCardInstance * putInLibrary(MTGCardInstance * card);
|
||||
MTGCardInstance * putInHand(MTGCardInstance * card);
|
||||
MTGCardInstance * putInSideboard(MTGCardInstance * card);
|
||||
MTGCardInstance * putInZone(MTGCardInstance * card, MTGGameZone * from, MTGGameZone * to, bool asCopy = false);
|
||||
int isInPlay(MTGCardInstance * card);
|
||||
int isInGrave(MTGCardInstance * card);
|
||||
|
||||
@@ -44,6 +44,7 @@ public:
|
||||
int drawCounter;
|
||||
int energyCount;
|
||||
int yidaroCount;
|
||||
int dungeonCompleted;
|
||||
int numOfCommandCast;
|
||||
int monarch;
|
||||
int surveilOffset;
|
||||
|
||||
@@ -390,6 +390,14 @@ struct WEventCardExplored : public WEventCardUpdate {
|
||||
virtual Targetable * getTarget(int target);
|
||||
};
|
||||
|
||||
//dungeon completed event
|
||||
struct WEventCardDungeonCompleted : public WEventCardUpdate {
|
||||
int totaldng;
|
||||
string playerName;
|
||||
WEventCardDungeonCompleted(MTGCardInstance * card, int totaldng, string playerName);
|
||||
virtual Targetable * getTarget(int target);
|
||||
};
|
||||
|
||||
//roll die event
|
||||
struct WEventCardRollDie : public WEventCardUpdate {
|
||||
string playerName;
|
||||
|
||||
@@ -605,9 +605,14 @@ int PutInGraveyard::resolve()
|
||||
}
|
||||
if (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
{
|
||||
card->controller()->game->putInZone(card, zone, card->owner->game->battlefield);
|
||||
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
|
||||
bool addCounter = card->basicAbilities[(int)Constants::COUNTERDEATH];
|
||||
card = card->controller()->game->putInZone(card, zone, card->owner->game->graveyard);
|
||||
card = card->controller()->game->putInZone(card, card->owner->game->graveyard, card->owner->game->battlefield);
|
||||
if(toTap)
|
||||
card->tap(true);
|
||||
if(addCounter)
|
||||
card->counters->addCounter(1, 1, false);
|
||||
return 1;
|
||||
}
|
||||
if (zone == observer->players[0]->game->inPlay || zone == observer->players[1]->game->inPlay)
|
||||
|
||||
@@ -1240,6 +1240,48 @@ AAAlterDevotionOffset::~AAAlterDevotionOffset()
|
||||
{
|
||||
}
|
||||
|
||||
//AA Dungeon Completed
|
||||
AAAlterDungeonCompleted::AAAlterDungeonCompleted(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int dungeoncounter, ManaCost * _cost,
|
||||
int who) :
|
||||
ActivatedAbilityTP(observer, _id, _source, _target, _cost, who), dungeoncounter(dungeoncounter)
|
||||
{
|
||||
}
|
||||
|
||||
int AAAlterDungeonCompleted::resolve()
|
||||
{
|
||||
Damageable * _target = (Damageable *) getTarget();
|
||||
if (_target)
|
||||
{
|
||||
Player * pTarget = (Player*)_target;
|
||||
if(pTarget)
|
||||
{
|
||||
source = pTarget->game->putInSideboard(source);
|
||||
source->basicAbilities[Constants::DUNGEONCOMPLETED] = 1;
|
||||
pTarget->dungeonCompleted += dungeoncounter;
|
||||
if(pTarget->dungeonCompleted < 0)
|
||||
pTarget->dungeonCompleted = 0;
|
||||
WEvent * e = NEW WEventCardDungeonCompleted(source, pTarget->dungeonCompleted, source->controller()->getDisplayName());
|
||||
game->receiveEvent(e);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const string AAAlterDungeonCompleted::getMenuText()
|
||||
{
|
||||
WParsedInt parsedNum(dungeoncounter);
|
||||
return _(parsedNum.getStringValue() + " Dungeon Completed Counter ").c_str();
|
||||
}
|
||||
|
||||
AAAlterDungeonCompleted * AAAlterDungeonCompleted::clone() const
|
||||
{
|
||||
return NEW AAAlterDungeonCompleted(*this);
|
||||
}
|
||||
|
||||
AAAlterDungeonCompleted::~AAAlterDungeonCompleted()
|
||||
{
|
||||
}
|
||||
|
||||
//AA Yidaro Count
|
||||
AAAlterYidaroCount::AAAlterYidaroCount(GameObserver* observer, int _id, MTGCardInstance * _source, Targetable * _target, int yidarocount, ManaCost * _cost,
|
||||
int who) :
|
||||
@@ -3188,9 +3230,9 @@ AASetCoin::~AASetCoin()
|
||||
}
|
||||
|
||||
//
|
||||
//rolling a 6 side die
|
||||
GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice) :
|
||||
ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice)
|
||||
//rolling a generic die
|
||||
GenericRollDie::GenericRollDie(GameObserver* observer, int id, MTGCardInstance * source, Targetable *, string _toAdd, ManaCost * cost, int userchoice, int diefaces) :
|
||||
ActivatedAbility(observer, id, source, cost, 0), baseAbility(_toAdd), userchoice(userchoice), diefaces(diefaces)
|
||||
{
|
||||
this->GetId();
|
||||
setDie = NULL;
|
||||
@@ -3201,17 +3243,17 @@ int GenericRollDie::resolve()
|
||||
if (!target)
|
||||
return 0;
|
||||
vector<MTGAbility*>selection;
|
||||
if(userchoice > 0 && userchoice < 7){
|
||||
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, baseAbility);
|
||||
if(userchoice > 0 && userchoice <= diefaces){
|
||||
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, userchoice, diefaces, baseAbility);
|
||||
MTGAbility * set = setDie->clone();
|
||||
set->oneShot = true;
|
||||
game->mLayers->actionLayer()->currentActionCard = (MTGCardInstance *)target;
|
||||
set->resolve();
|
||||
SAFE_DELETE(setDie);
|
||||
} else{
|
||||
for (int i = 1; i < 7; ++i)
|
||||
for (int i = 1; i <= diefaces; ++i)
|
||||
{
|
||||
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i, baseAbility);
|
||||
setDie = NEW AASetDie(game, game->mLayers->actionLayer()->getMaxId(), source,(MTGCardInstance*)target, i, diefaces, baseAbility);
|
||||
MTGAbility * set = setDie->clone();
|
||||
set->oneShot = true;
|
||||
selection.push_back(set);
|
||||
@@ -3230,7 +3272,9 @@ int GenericRollDie::resolve()
|
||||
|
||||
const string GenericRollDie::getMenuText()
|
||||
{
|
||||
return "Roll a Die";
|
||||
std::stringstream msg;
|
||||
msg << "Roll a " << diefaces << " faced Die";
|
||||
return msg.str();
|
||||
}
|
||||
|
||||
GenericRollDie * GenericRollDie::clone() const
|
||||
@@ -3243,9 +3287,9 @@ GenericRollDie::~GenericRollDie()
|
||||
{
|
||||
}
|
||||
|
||||
//set color choosen
|
||||
AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, string toAlter):
|
||||
InstantAbility(observer, id, source),side(_side), abilityToAlter(toAlter)
|
||||
//set die result
|
||||
AASetDie::AASetDie(GameObserver* observer, int id, MTGCardInstance * source, MTGCardInstance * _target, int _side, int _diefaces, string toAlter):
|
||||
InstantAbility(observer, id, source),side(_side), diefaces(_diefaces), abilityToAlter(toAlter)
|
||||
{
|
||||
this->target = _target;
|
||||
abilityAltered = NULL;
|
||||
@@ -3256,8 +3300,9 @@ int AASetDie::resolve()
|
||||
MTGCardInstance * _target = (MTGCardInstance *)target;
|
||||
_target->dieSide = side;
|
||||
|
||||
int roll = 1 + game->getRandomGenerator()->random() % 6;
|
||||
int roll = 1 + game->getRandomGenerator()->random() % diefaces;
|
||||
_target->lastRollResult = roll;
|
||||
_target->dieNumFaces = diefaces;
|
||||
WEvent * e = NEW WEventCardRollDie(_target, source->controller()->getDisplayName());
|
||||
game->receiveEvent(e);
|
||||
vector<string>Win = parseBetween(abilityToAlter,"winability "," winabilityend");
|
||||
@@ -4473,6 +4518,8 @@ int AAFlip::resolve()
|
||||
MTGCardInstance * myParent = NULL;
|
||||
if(_target->target)
|
||||
myParent = _target->target;
|
||||
if(_target->nameOrig == "")
|
||||
_target->nameOrig = _target->name; // Saves the orignal card name before to flip the card.
|
||||
_target->name = myFlip->name;
|
||||
_target->setName(myFlip->name);
|
||||
if(!isflipcard)//transform card
|
||||
|
||||
@@ -39,6 +39,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
|
||||
myDeck = NULL;
|
||||
mySideboard = NULL;
|
||||
myCommandZone = NULL;
|
||||
myDungeonZone = NULL;
|
||||
filterMenu = NULL;
|
||||
source = NULL;
|
||||
hudAlpha = 0;
|
||||
@@ -50,7 +51,7 @@ GameStateDeckViewer::GameStateDeckViewer(GameApp* parent) :
|
||||
statsPrevButton = NEW InteractiveButton(NULL, kPrevStatsButtonId, Fonts::MAIN_FONT, "Stats", SCREEN_WIDTH_F - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_PREV);
|
||||
toggleDeckButton = NEW InteractiveButton(NULL, kToggleDeckActionId, Fonts::MAIN_FONT, "View Deck", 10, SCREEN_HEIGHT_F - 20, JGE_BTN_PRI);
|
||||
sellCardButton = NEW InteractiveButton(NULL, kSellCardActionId, Fonts::MAIN_FONT, "Sell Card", (SCREEN_WIDTH_F/ 2) - 125, SCREEN_HEIGHT_F - 20, JGE_BTN_SEC);
|
||||
sb_cmd_Button = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB/CMD", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
|
||||
sb_cmd_dng_Button = NEW InteractiveButton(NULL, kSBActionId, Fonts::MAIN_FONT, "View SB", (SCREEN_WIDTH_F/ 2) - 35, SCREEN_HEIGHT_F - 20, JGE_BTN_SOUND);
|
||||
filterButton = NEW InteractiveButton(NULL, kFilterButtonId, Fonts::MAIN_FONT, "Filter", (SCREEN_WIDTH_F - 116), SCREEN_HEIGHT_F - 20, JGE_BTN_CTRL);
|
||||
//TODO: Check if that button is available:
|
||||
toggleViewButton = NEW InteractiveButton(NULL, kSwitchViewButton, Fonts::MAIN_FONT, "Grid", (SCREEN_WIDTH_F/ 2) + 50, SCREEN_HEIGHT_F - 20, JGE_BTN_MAX);
|
||||
@@ -65,7 +66,7 @@ GameStateDeckViewer::~GameStateDeckViewer()
|
||||
SAFE_DELETE(bgMusic);
|
||||
SAFE_DELETE(toggleDeckButton);
|
||||
SAFE_DELETE(sellCardButton);
|
||||
SAFE_DELETE(sb_cmd_Button);
|
||||
SAFE_DELETE(sb_cmd_dng_Button);
|
||||
SAFE_DELETE(statsPrevButton);
|
||||
SAFE_DELETE(filterButton);
|
||||
SAFE_DELETE(toggleViewButton);
|
||||
@@ -90,6 +91,11 @@ GameStateDeckViewer::~GameStateDeckViewer()
|
||||
SAFE_DELETE(myCommandZone->parent);
|
||||
SAFE_DELETE(myCommandZone);
|
||||
}
|
||||
if (myDungeonZone)
|
||||
{
|
||||
SAFE_DELETE(myDungeonZone->parent);
|
||||
SAFE_DELETE(myDungeonZone);
|
||||
}
|
||||
if (myCollection)
|
||||
{
|
||||
SAFE_DELETE(myCollection->parent);
|
||||
@@ -125,7 +131,7 @@ void GameStateDeckViewer::updateFilters()
|
||||
|
||||
void GameStateDeckViewer::toggleCollection()
|
||||
{
|
||||
if(mView->deck() == mySideboard || mView->deck() == myCommandZone)
|
||||
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
|
||||
return;
|
||||
|
||||
if (mView->deck() == myCollection)
|
||||
@@ -142,7 +148,7 @@ void GameStateDeckViewer::toggleCollection()
|
||||
updateFilters();
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::toggleSB_CMD()
|
||||
void GameStateDeckViewer::toggleSB_CMD_DNG()
|
||||
{
|
||||
if(mView->deck() == myDeck)
|
||||
return;
|
||||
@@ -150,17 +156,22 @@ void GameStateDeckViewer::toggleSB_CMD()
|
||||
if (mView->deck() == myCollection)
|
||||
{
|
||||
mView->SetDeck(mySideboard);
|
||||
sb_cmd_Button->setText("View CMD");
|
||||
sb_cmd_dng_Button->setText("View CMD");
|
||||
}
|
||||
else if (mView->deck() == mySideboard)
|
||||
{
|
||||
mView->SetDeck(myCommandZone);
|
||||
sb_cmd_Button->setText("View Coll.");
|
||||
sb_cmd_dng_Button->setText("View DNG");
|
||||
}
|
||||
else if (mView->deck() == myCommandZone)
|
||||
{
|
||||
mView->SetDeck(myDungeonZone);
|
||||
sb_cmd_dng_Button->setText("View Coll.");
|
||||
}
|
||||
else
|
||||
{
|
||||
mView->SetDeck(myCollection);
|
||||
sb_cmd_Button->setText("View SB/CMD");
|
||||
sb_cmd_dng_Button->setText("View SB");
|
||||
}
|
||||
//source->swapSrc();
|
||||
//updateFilters();
|
||||
@@ -210,6 +221,7 @@ void GameStateDeckViewer::Start()
|
||||
myDeck = NULL;
|
||||
mySideboard = NULL;
|
||||
myCommandZone = NULL;
|
||||
myDungeonZone = NULL;
|
||||
mStage = STAGE_WELCOME;
|
||||
|
||||
last_user_activity = NO_USER_ACTIVITY_HELP_DELAY + 1;
|
||||
@@ -282,6 +294,11 @@ void GameStateDeckViewer::End()
|
||||
SAFE_DELETE(myCommandZone->parent);
|
||||
SAFE_DELETE(myCommandZone);
|
||||
}
|
||||
if (myDungeonZone)
|
||||
{
|
||||
SAFE_DELETE(myDungeonZone->parent);
|
||||
SAFE_DELETE(myDungeonZone);
|
||||
}
|
||||
SAFE_DELETE(pricelist);
|
||||
SAFE_DELETE(playerdata);
|
||||
SAFE_DELETE(filterMenu);
|
||||
@@ -354,6 +371,28 @@ void GameStateDeckViewer::CMDaddRemove(MTGCard * card)
|
||||
mView->reloadIndexes();
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::DNGaddRemove(MTGCard * card)
|
||||
{
|
||||
if (!card) return;
|
||||
if ((card->getRarity() != Constants::RARITY_T) || (card->getId() < 1)) return;
|
||||
if (mView->deck()->Remove(card, 1, (mView->deck() == myDungeonZone)))
|
||||
{
|
||||
if (mView->deck() == myCollection)
|
||||
{
|
||||
myDungeonZone->Add(card);
|
||||
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
myCollection->Add(card);
|
||||
}
|
||||
}
|
||||
myCollection->validate();
|
||||
myDungeonZone->validate();
|
||||
mStatsWrapper->needUpdate = true;
|
||||
mView->reloadIndexes();
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
|
||||
{
|
||||
if (!card) return;
|
||||
@@ -366,19 +405,37 @@ void GameStateDeckViewer::choiceAddRemove(MTGCard * card)
|
||||
if (mView->deck() == myCollection)
|
||||
{
|
||||
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
|
||||
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
|
||||
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
|
||||
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
|
||||
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
|
||||
if(!card->data->hasType("Dungeon")){
|
||||
sbMenu->Add(SBMENU_ADD_NORMAL, "Add to Deck");
|
||||
sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
|
||||
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
|
||||
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
|
||||
} else
|
||||
sbMenu->Add(SBMENU_ADD_DNG, "Add to Dungeons");
|
||||
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
|
||||
}
|
||||
else
|
||||
else if (mView->deck() == myCommandZone)
|
||||
{
|
||||
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
|
||||
sbMenu->Add(SBMENU_ADD_CMD, "Remove as Commander");
|
||||
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
|
||||
}
|
||||
else if (mView->deck() == mySideboard)
|
||||
{
|
||||
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
|
||||
sbMenu->Add(SBMENU_ADD_SB, "Remove from Sideboard");
|
||||
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
|
||||
}
|
||||
else if (mView->deck() == myDungeonZone)
|
||||
{
|
||||
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
|
||||
sbMenu->Add(SBMENU_ADD_DNG, "Remove from Dungeons");
|
||||
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
|
||||
}
|
||||
else if (mView->deck() == myDeck)
|
||||
{
|
||||
sbMenu = NEW SimpleMenu(JGE::GetInstance(), WResourceManager::Instance(), SBMENU_CHOICE, this, Fonts::MAIN_FONT, menuXOffset, menuYOffset, "Add/Remove Cards");
|
||||
sbMenu->Add(SBMENU_ADD_NORMAL, "Remove Card");
|
||||
//sbMenu->Add(SBMENU_ADD_SB, "Add to Sideboard");
|
||||
if(card->data->hasType("Legendary") && (card->data->hasType("Creature") || card->data->basicAbilities[Constants::CANBECOMMANDER]))
|
||||
sbMenu->Add(SBMENU_ADD_CMD, "Choose as Commander");
|
||||
sbMenu->Add(SBMENU_ADD_CANCEL, "Cancel");
|
||||
}
|
||||
}
|
||||
@@ -425,6 +482,26 @@ void GameStateDeckViewer::insertCommandZone()
|
||||
}
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::insertDungeonZone()
|
||||
{
|
||||
if(myDungeonZone->getCount())
|
||||
{
|
||||
vector<string> newDNG;
|
||||
for (int i = 0; i < myDungeonZone->Size(true); i++)
|
||||
{
|
||||
MTGCard * current = myDungeonZone->getCard(i, true);
|
||||
int howmanyinDeck = myDungeonZone->count(current);
|
||||
for (int i = 0; i < howmanyinDeck; i++)
|
||||
{
|
||||
stringstream cid;
|
||||
cid << current->getMTGId();
|
||||
newDNG.push_back(cid.str());
|
||||
}
|
||||
}
|
||||
myDeck->parent->replaceDNG(newDNG);
|
||||
}
|
||||
}
|
||||
|
||||
void GameStateDeckViewer::saveDeck()
|
||||
{
|
||||
//update the corresponding meta data object
|
||||
@@ -436,6 +513,8 @@ void GameStateDeckViewer::saveDeck()
|
||||
insertSideBoard();
|
||||
//insert commanders to mydeck parents
|
||||
insertCommandZone();
|
||||
//insert dungeons to mydeck parents
|
||||
insertDungeonZone();
|
||||
//save deck
|
||||
myDeck->save();
|
||||
playerdata->save();
|
||||
@@ -491,7 +570,7 @@ bool GameStateDeckViewer::userPressedButton()
|
||||
{
|
||||
return ((toggleDeckButton->ButtonPressed())
|
||||
|| (sellCardButton->ButtonPressed())
|
||||
|| (sb_cmd_Button->ButtonPressed())
|
||||
|| (sb_cmd_dng_Button->ButtonPressed())
|
||||
|| (statsPrevButton->ButtonPressed())
|
||||
|| (filterButton->ButtonPressed())
|
||||
|| (toggleViewButton->ButtonPressed())
|
||||
@@ -506,7 +585,7 @@ void GameStateDeckViewer::setButtonState(bool state)
|
||||
{
|
||||
toggleDeckButton->setIsSelectionValid(state);
|
||||
sellCardButton->setIsSelectionValid(state);
|
||||
sb_cmd_Button->setIsSelectionValid(state);
|
||||
sb_cmd_dng_Button->setIsSelectionValid(state);
|
||||
statsPrevButton->setIsSelectionValid(state);
|
||||
filterButton->setIsSelectionValid(state);
|
||||
toggleViewButton->setIsSelectionValid(state);
|
||||
@@ -518,12 +597,12 @@ void GameStateDeckViewer::setButtonState(bool state)
|
||||
|
||||
void GameStateDeckViewer::RenderButtons()
|
||||
{
|
||||
if(mView->deck() != mySideboard && mView->deck() != myCommandZone)
|
||||
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
|
||||
toggleDeckButton->Render();
|
||||
sellCardButton->Render();
|
||||
if(mView->deck() != myDeck)
|
||||
sb_cmd_Button->Render();
|
||||
if(mView->deck() != mySideboard && mView->deck() != myCommandZone)
|
||||
sb_cmd_dng_Button->Render();
|
||||
if(mView->deck() != mySideboard && mView->deck() != myCommandZone && mView->deck() != myDungeonZone)
|
||||
filterButton->Render();
|
||||
statsPrevButton->Render();
|
||||
toggleViewButton->Render();
|
||||
@@ -631,7 +710,7 @@ void GameStateDeckViewer::Update(float dt)
|
||||
if (last_user_activity > 0.2)
|
||||
{
|
||||
last_user_activity = 0;
|
||||
toggleSB_CMD();
|
||||
toggleSB_CMD_DNG();
|
||||
}
|
||||
break;
|
||||
case JGE_BTN_PRI:
|
||||
@@ -685,9 +764,9 @@ void GameStateDeckViewer::Update(float dt)
|
||||
break;
|
||||
|
||||
case JGE_BTN_MENU:
|
||||
if(mView->deck() == mySideboard || mView->deck() == myCommandZone)
|
||||
if(mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
|
||||
{
|
||||
toggleSB_CMD();
|
||||
toggleSB_CMD_DNG();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -696,7 +775,7 @@ void GameStateDeckViewer::Update(float dt)
|
||||
}
|
||||
break;
|
||||
case JGE_BTN_CTRL:
|
||||
if (mView->deck() == mySideboard || mView->deck() == myCommandZone)
|
||||
if (mView->deck() == mySideboard || mView->deck() == myCommandZone || mView->deck() == myDungeonZone)
|
||||
break;//SB is for viewing add or remove only
|
||||
else if(!mView->ButtonPressed(JGE_BTN_CTRL))
|
||||
{
|
||||
@@ -985,7 +1064,8 @@ void GameStateDeckViewer::renderOnScreenMenu()
|
||||
int value = myDeck->getCount(WSrcDeck::UNFILTERED_COPIES);
|
||||
int sb_value = mySideboard->getCount(WSrcDeck::UNFILTERED_COPIES);
|
||||
int cmd_value = myCommandZone->getCount(WSrcDeck::UNFILTERED_COPIES);
|
||||
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards.\nCommanders: %i cards").c_str(), value, sb_value,cmd_value);
|
||||
int dng_value = myDungeonZone->getCount(WSrcDeck::UNFILTERED_COPIES);
|
||||
sprintf(buffer, _("Your Deck: %i cards.\nSideboard: %i cards.\nCommanders: %i cards.\nDungeons: %i cards").c_str(), value, sb_value,cmd_value,dng_value);
|
||||
font->DrawString(buffer, SCREEN_WIDTH - 200 + rightTransition, SCREEN_HEIGHT / 2 + 15);
|
||||
|
||||
for (int j = 0; j < Constants::NB_Colors; j++)
|
||||
@@ -1625,6 +1705,12 @@ int GameStateDeckViewer::loadDeck(int deckid)
|
||||
SAFE_DELETE(myCommandZone->parent);
|
||||
SAFE_DELETE(myCommandZone);
|
||||
}
|
||||
//dng
|
||||
if (myDungeonZone)
|
||||
{
|
||||
SAFE_DELETE(myDungeonZone->parent);
|
||||
SAFE_DELETE(myDungeonZone);
|
||||
}
|
||||
//temp deck for sb?
|
||||
MTGDeck * sbtempDeck = NEW MTGDeck(MTGCollection());
|
||||
if(myDeck->parent)
|
||||
@@ -1707,10 +1793,52 @@ int GameStateDeckViewer::loadDeck(int deckid)
|
||||
myCollection->validate();
|
||||
}
|
||||
//endcmd
|
||||
//temp deck for dng?
|
||||
MTGDeck * dngtempDeck = NEW MTGDeck(MTGCollection());
|
||||
if(myDeck->parent)
|
||||
{//add cards from commanders lists
|
||||
if(myDeck->parent->DungeonZone.size())
|
||||
{
|
||||
for(unsigned int j = 0; j < myDeck->parent->DungeonZone.size(); j++)
|
||||
{
|
||||
string cardID = myDeck->parent->DungeonZone[j];
|
||||
dngtempDeck->add(atoi(cardID.c_str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
myDungeonZone = NEW DeckDataWrapper(dngtempDeck);
|
||||
for (int i = 0; i < myDungeonZone->Size(true); i++)
|
||||
{
|
||||
MTGCard * current = myDungeonZone->getCard(i, true);
|
||||
int howmanyinDeck = myDungeonZone->count(current);
|
||||
for (int i = myCollection->count(current); i < howmanyinDeck; i++)
|
||||
{
|
||||
cPure = false;
|
||||
if (cheatmode)
|
||||
{ //Are we cheating?
|
||||
playerdata->collection->add(current); //Yup, add it to collection permanently.
|
||||
myCollection->Add(current);
|
||||
}
|
||||
else
|
||||
{
|
||||
myDungeonZone->Remove(current,howmanyinDeck-i); //Nope. Remove it from sb.
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
myCollection->Remove(current, myDungeonZone->count(current));
|
||||
}
|
||||
if (!cPure)
|
||||
{
|
||||
myDungeonZone->validate();
|
||||
myCollection->validate();
|
||||
}
|
||||
//enddng
|
||||
|
||||
myDeck->Sort(WSrcCards::SORT_ALPHA);
|
||||
mySideboard->Sort(WSrcCards::SORT_ALPHA);
|
||||
myCommandZone->Sort(WSrcCards::SORT_ALPHA);
|
||||
myDungeonZone->Sort(WSrcCards::SORT_ALPHA);
|
||||
SAFE_DELETE(filterMenu);
|
||||
rebuildFilters();
|
||||
mView->reloadIndexes();
|
||||
@@ -1877,6 +2005,14 @@ void GameStateDeckViewer::ButtonPressed(int controllerId, int controlId)
|
||||
sbMenu->Close();
|
||||
break;
|
||||
}
|
||||
case SBMENU_ADD_DNG:
|
||||
{
|
||||
MTGCard * card = mView->getActiveCard();
|
||||
if (card)
|
||||
DNGaddRemove(card);
|
||||
sbMenu->Close();
|
||||
break;
|
||||
}
|
||||
case SBMENU_ADD_CANCEL:
|
||||
sbMenu->Close();
|
||||
break;
|
||||
|
||||
@@ -147,7 +147,7 @@ GameState(parent, "duel")
|
||||
menu = NULL;
|
||||
popupScreen = NULL;
|
||||
mGamePhase = DUEL_STATE_UNSET;
|
||||
taskList = NEW TaskList(options.profileFile(PLAYER_TASKS).c_str());
|
||||
taskList = NEW TaskList();
|
||||
|
||||
#ifdef TESTSUITE
|
||||
testSuite = NULL;
|
||||
@@ -190,6 +190,8 @@ void GameStateDuel::Start()
|
||||
OpponentsDeckid = 0;
|
||||
bool createDeckMenu=true; // create only a deckmenu if not in tournament
|
||||
|
||||
SAFE_DELETE(taskList);
|
||||
taskList = NEW TaskList();
|
||||
|
||||
#ifdef NETWORK_SUPPORT
|
||||
if(!mParent->mpNetwork) {
|
||||
@@ -358,6 +360,7 @@ void GameStateDuel::End()
|
||||
SAFE_DELETE(opponentMenu);
|
||||
SAFE_DELETE(deckmenu);
|
||||
SAFE_DELETE(popupScreen);
|
||||
SAFE_DELETE(taskList);
|
||||
|
||||
//reset player for next match (only if actual match is finished)
|
||||
tournament->End();
|
||||
@@ -1682,7 +1685,6 @@ void GameStateDuel::ButtonPressed(int controllerId, int controlId)
|
||||
// break;
|
||||
case MENUITEM_TASKBOARD:
|
||||
if(taskList->getState() != TaskList::TASKS_ACTIVE){
|
||||
taskList->load(options.profileFile(PLAYER_TASKS).c_str());
|
||||
taskList->Start();
|
||||
} else {
|
||||
taskList->End();
|
||||
|
||||
@@ -1245,12 +1245,33 @@ TriggeredAbility * AbilityFactory::parseTrigger(string s, string, int id, Spell
|
||||
if (TargetChooser * tc = parseSimpleTC(s, "explored", card))
|
||||
return NEW TrCardExplored(observer, id, card, tc, once, limitOnceATurn);
|
||||
|
||||
//Dungeon has been completer from a card
|
||||
if (TargetChooser * tc = parseSimpleTC(s, "dungeoncompleted", card)){
|
||||
int totaldng = 0;
|
||||
vector<string>res = parseBetween(s, "total(",")");
|
||||
if(res.size()){
|
||||
totaldng = atoi(res[1].c_str());
|
||||
}
|
||||
string playerName = "";
|
||||
vector<string>from = parseBetween(s, "from(",")");
|
||||
if(from.size() && from[1] == "opponent"){
|
||||
playerName = card->controller()->opponent()->getDisplayName();
|
||||
} else if(from.size() && from[1] == "controller"){
|
||||
playerName = card->controller()->getDisplayName();
|
||||
}
|
||||
return NEW TrCardDungeonCompleted(observer, id, card, tc, once, limitOnceATurn, totaldng, playerName);
|
||||
}
|
||||
|
||||
//Roll die has been performed from a card
|
||||
if (TargetChooser * tc = parseSimpleTC(s, "dierolled", card)){
|
||||
int rollresult = 0;
|
||||
vector<string>res = parseBetween(s, "result(",")");
|
||||
if(res.size()){
|
||||
rollresult = atoi(res[1].c_str());
|
||||
if(res[1] == "max"){
|
||||
rollresult = -1;
|
||||
} else {
|
||||
rollresult = atoi(res[1].c_str());
|
||||
}
|
||||
}
|
||||
string playerName = "";
|
||||
vector<string>from = parseBetween(s, "from(",")");
|
||||
@@ -1824,6 +1845,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
{
|
||||
size_t pos1 = s.find("transforms(("); // Try to handle pay ability inside ability$! or transforms keywords.
|
||||
size_t pos2 = s.find("ability$!");
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("winability"); // Try to handle pay ability inside winability or loseability keywords.
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("loseability");
|
||||
vector<string> splitMayPaystr = parseBetween(s, "pay(", ")", true);
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && found < pos1 && found < pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && found < pos1) || (pos1 == string::npos && pos2 != string::npos && found < pos2)){
|
||||
@@ -1844,9 +1869,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
storedAbilityString = splitGrant[1];
|
||||
size_t pos1 = s.find("transforms(("); // Try to handle grant ability inside ability$! or transforms keywords.
|
||||
size_t pos2 = s.find("ability$!");
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("winability"); // Try to handle grant ability inside winability or loseability keywords.
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("loseability");
|
||||
size_t pos3 = s.find(splitGrant[1]);
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
|
||||
s = splitGrant[0];
|
||||
s.append("grant ");
|
||||
s.append(splitGrant[2]);
|
||||
@@ -1860,9 +1889,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
storedAbilityString = splitRevealx[1];
|
||||
size_t pos1 = s.find("transforms(("); // Try to handle reveal ability inside ability$! or transforms keywords.
|
||||
size_t pos2 = s.find("ability$!");
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("winability"); // Try to handle reveal ability inside winability or loseability keywords.
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("loseability");
|
||||
size_t pos3 = s.find(splitRevealx[1]);
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
|
||||
s = splitRevealx[0];
|
||||
s.append("reveal: ");
|
||||
s.append(splitRevealx[2]);
|
||||
@@ -1876,9 +1909,13 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
storedAbilityString = splitScryx[1];
|
||||
size_t pos1 = s.find("transforms(("); // Try to handle scry ability inside ability$! or transforms keywords.
|
||||
size_t pos2 = s.find("ability$!");
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("winability"); // Try to handle scry ability inside winability or loseability keywords.
|
||||
if(pos2 == string::npos)
|
||||
pos2 = s.find("loseability");
|
||||
size_t pos3 = s.find(splitScryx[1]);
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 < pos1 && pos3 < pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 < pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 < pos2)){
|
||||
if((pos1 == string::npos && pos2 == string::npos) || (pos2 != string::npos && pos1 != string::npos && pos3 <= pos1 && pos3 <= pos2) ||
|
||||
(pos2 == string::npos && pos1 != string::npos && pos3 <= pos1) || (pos1 == string::npos && pos2 != string::npos && pos3 <= pos2)){
|
||||
s = splitScryx[0];
|
||||
s.append("scry: ");
|
||||
s.append(splitScryx[2]);
|
||||
@@ -1890,6 +1927,10 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
if (found != string::npos && storedString.empty())
|
||||
{
|
||||
size_t pos1 = s.find("ability$!"); // Try to handle transforms ability inside ability$! keyword.
|
||||
if(pos1 == string::npos)
|
||||
pos1 = s.find("winability"); // Try to handle transforms ability inside winability or loseability keywords.
|
||||
if(pos1 == string::npos)
|
||||
pos1 = s.find("loseability");
|
||||
if(pos1 == string::npos || found < pos1){
|
||||
size_t real_end = s.find("))", found);
|
||||
size_t stypesStartIndex = found + 12;
|
||||
@@ -2687,13 +2728,6 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
return a;
|
||||
}
|
||||
|
||||
//Phase based actions
|
||||
found = s.find("phaseaction");
|
||||
if (found != string::npos)
|
||||
{
|
||||
return parsePhaseActionAbility(s,card,spell,target,restrictions,id);
|
||||
}
|
||||
|
||||
//flip a coin
|
||||
vector<string> splitFlipCoin = parseBetween(s, "flipacoin ", " flipend");
|
||||
if (splitFlipCoin.size())
|
||||
@@ -2705,22 +2739,124 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a die
|
||||
vector<string> splitRollDie = parseBetween(s, "rolladie ", " rollend");
|
||||
if (splitRollDie.size())
|
||||
//roll a d4 die
|
||||
vector<string> splitRollD4 = parseBetween(s, "rolld4 ", " rolld4end");
|
||||
if (splitRollD4.size())
|
||||
{
|
||||
string a1 = splitRollDie[1];
|
||||
string a1 = splitRollD4[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
userchoice = a1[0] - 48;
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice);
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 4);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a d6 die
|
||||
vector<string> splitRollD6 = parseBetween(s, "rolld6 ", " rolld6end");
|
||||
if (splitRollD6.size())
|
||||
{
|
||||
string a1 = splitRollD6[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 6);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a d8 die
|
||||
vector<string> splitRollD8 = parseBetween(s, "rolld8 ", " rolld8end");
|
||||
if (splitRollD8.size())
|
||||
{
|
||||
string a1 = splitRollD8[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 8);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a d10 die
|
||||
vector<string> splitRollD10 = parseBetween(s, "rolld10 ", " rolld10end");
|
||||
if (splitRollD10.size())
|
||||
{
|
||||
string a1 = splitRollD10[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
if(a1[1] >= 48 && a1[1] <= 57){
|
||||
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
|
||||
a1 = a1.substr(3);
|
||||
} else {
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 10);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a d12 die
|
||||
vector<string> splitRollD12 = parseBetween(s, "rolld12 ", " rolld12end");
|
||||
if (splitRollD12.size())
|
||||
{
|
||||
string a1 = splitRollD12[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
if(a1[1] >= 48 && a1[1] <= 57){
|
||||
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
|
||||
a1 = a1.substr(3);
|
||||
} else {
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 12);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//roll a d20 die
|
||||
vector<string> splitRollD20 = parseBetween(s, "rolld20 ", " rolld20end");
|
||||
if (splitRollD20.size())
|
||||
{
|
||||
string a1 = splitRollD20[1];
|
||||
int userchoice = 0;
|
||||
if(a1[0] >= 48 && a1[0] <= 57){
|
||||
if(a1[1] >= 48 && a1[1] <= 57){
|
||||
userchoice = (a1[0] - 48)*10 + (a1[1] - 48);
|
||||
a1 = a1.substr(3);
|
||||
} else {
|
||||
userchoice = (a1[0] - 48);
|
||||
a1 = a1.substr(2);
|
||||
}
|
||||
}
|
||||
MTGAbility * a = NEW GenericRollDie(observer, id, card, target, a1, NULL, userchoice, 20);
|
||||
a->oneShot = 1;
|
||||
a->canBeInterrupted = false;
|
||||
return a;
|
||||
}
|
||||
|
||||
//Phase based actions
|
||||
found = s.find("phaseaction");
|
||||
if (found != string::npos)
|
||||
{
|
||||
return parsePhaseActionAbility(s,card,spell,target,restrictions,id);
|
||||
}
|
||||
|
||||
//may pay ability
|
||||
vector<string> splitMayPaysub = parseBetween(s, "pay[[","]]", true);
|
||||
if (splitMayPaysub.size())
|
||||
@@ -3554,6 +3690,17 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
return a;
|
||||
}
|
||||
|
||||
//alter dungeon completed
|
||||
vector<string> splitDungeonCompleted = parseBetween(s, "completedungeon:", " ", false);
|
||||
if (splitDungeonCompleted.size())
|
||||
{
|
||||
int dungeoncompleted = atoi(splitDungeonCompleted[1].c_str());
|
||||
Targetable * t = spell ? spell->getNextTarget() : NULL;
|
||||
MTGAbility * a = NEW AAAlterDungeonCompleted(observer, id, card, t, dungeoncompleted, NULL, who);
|
||||
a->oneShot = 1;
|
||||
return a;
|
||||
}
|
||||
|
||||
//alter yidaro counter
|
||||
vector<string> splitYidaroCounter = parseBetween(s, "alteryidarocount:", " ", false);
|
||||
if (splitYidaroCounter.size())
|
||||
@@ -4312,6 +4459,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
if (splitMeldFrom[1].size())
|
||||
{
|
||||
splitMeldNames = splitMeldFrom[1];
|
||||
replace(splitMeldNames.begin(), splitMeldNames.end(), '^', ','); // To allow the usage of ^ instead of , char (e.g. using meldfrom keyword inside transforms)
|
||||
}
|
||||
MTGAbility * a = NEW AAMeldFrom(observer, id, card, target, splitMeldNames);
|
||||
a->oneShot = true;
|
||||
@@ -4326,6 +4474,7 @@ MTGAbility * AbilityFactory::parseMagicLine(string s, int id, Spell * spell, MTG
|
||||
if (splitMeld[1].size())
|
||||
{
|
||||
splitMeldName = splitMeld[1];
|
||||
replace(splitMeldName.begin(), splitMeldName.end(), '^', ','); // To allow the usage of ^ instead of , char (e.g. using meld keyword inside transforms)
|
||||
}
|
||||
MTGAbility * a = NEW AAMeld(observer, id, card, target, splitMeldName);
|
||||
a->oneShot = true;
|
||||
@@ -5135,6 +5284,7 @@ int AbilityFactory::abilityEfficiency(MTGAbility * a, Player * p, int mode, Targ
|
||||
badAbilities[(int)Constants::HANDDEATH] = true;
|
||||
badAbilities[(int)Constants::GAINEDHANDDEATH] = true;
|
||||
badAbilities[(int)Constants::INPLAYDEATH] = true;
|
||||
badAbilities[(int)Constants::COUNTERDEATH] = true;
|
||||
badAbilities[(int)Constants::INPLAYTAPDEATH] = true;
|
||||
badAbilities[(int)Constants::DOUBLEFACEDEATH] = true;
|
||||
badAbilities[(int)Constants::GAINEDDOUBLEFACEDEATH] = true;
|
||||
|
||||
@@ -267,6 +267,7 @@ void MTGCardInstance::initMTGCI()
|
||||
lastFlipResult = -1;
|
||||
dieSide = 0;
|
||||
lastRollResult = 0;
|
||||
dieNumFaces = 0;
|
||||
scryedCards = 0;
|
||||
isAttacking = NULL;
|
||||
storedCard = NULL;
|
||||
@@ -529,9 +530,14 @@ int MTGCardInstance::toGrave( bool forced )
|
||||
}
|
||||
if (basicAbilities[(int)Constants::INPLAYDEATH] || basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
{
|
||||
p->game->putInZone(this, p->game->inPlay, owner->game->battlefield);
|
||||
if(basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
tap(true);
|
||||
bool toTap = basicAbilities[(int)Constants::INPLAYTAPDEATH];
|
||||
bool addCounter = basicAbilities[(int)Constants::COUNTERDEATH];
|
||||
MTGCardInstance* ret = p->game->putInZone(this, p->game->inPlay, owner->game->graveyard);
|
||||
ret = p->game->putInZone(ret, owner->game->graveyard, owner->game->battlefield);
|
||||
if(toTap)
|
||||
ret->tap(true);
|
||||
if(addCounter)
|
||||
ret->counters->addCounter(1, 1, false);
|
||||
return 1;
|
||||
}
|
||||
if (!basicAbilities[(int)Constants::INDESTRUCTIBLE])
|
||||
@@ -1028,6 +1034,9 @@ bool MTGCardInstance::canPlayFromLibrary()
|
||||
if(isSorceryorInstant() && (has(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYINSTANTSORCERYTOPLIBRARY))))
|
||||
found++;
|
||||
if((hasSubtype(Subtypes::TYPE_EQUIPMENT) || hasSubtype(Subtypes::TYPE_AURA)) && (has(Constants::CANPLAYAURAEQUIPTOPLIBRARY)
|
||||
|| (controller()->game->inPlay->nb_cards && controller()->game->inPlay->hasAbility(Constants::CANPLAYAURAEQUIPTOPLIBRARY))))
|
||||
found++;
|
||||
|
||||
if(found > 0)
|
||||
return true;
|
||||
|
||||
@@ -920,9 +920,11 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
|
||||
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
|
||||
std::string::const_iterator it = s.begin();
|
||||
while (it != s.end() && std::isdigit(*it)) ++it;
|
||||
if(!s.empty() && it == s.end())
|
||||
Sideboard.push_back(s);
|
||||
else {
|
||||
if(!s.empty() && it == s.end()){
|
||||
MTGCard * card = database->getCardById(atoi(s.c_str()));
|
||||
if(card && !card->data->hasType("Dungeon")) // To add Dungeons in Sideboard you need to use #DNG tag.
|
||||
Sideboard.push_back(s);
|
||||
} else {
|
||||
int numberOfCopies = 1;
|
||||
size_t found = s.find(" *");
|
||||
if (found != string::npos){
|
||||
@@ -934,9 +936,10 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
|
||||
for (int i = 0; i < numberOfCopies; i++){
|
||||
std::stringstream str_id;
|
||||
str_id << card->getId();
|
||||
Sideboard.push_back(str_id.str());
|
||||
if(!card->data->hasType("Dungeon")) // To add Dungeons in Sideboard you need to use #DNG tag.
|
||||
Sideboard.push_back(str_id.str());
|
||||
}
|
||||
}else {
|
||||
} else {
|
||||
DebugTrace("could not add to Sideboard any card with name: " << s);
|
||||
}
|
||||
}
|
||||
@@ -963,7 +966,7 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
|
||||
CommandZone.push_back(s);
|
||||
}
|
||||
}
|
||||
}else {
|
||||
} else {
|
||||
size_t found = s.find(" *");
|
||||
if (found != string::npos)
|
||||
s = s.substr(0, found);
|
||||
@@ -980,12 +983,61 @@ MTGDeck::MTGDeck(const string& config_file, MTGAllCards * _allcards, int meta_on
|
||||
CommandZone.push_back(str_id.str());
|
||||
}
|
||||
}
|
||||
}else {
|
||||
} else {
|
||||
DebugTrace("could not add to CommandZone any card with name: " << s);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
found = s.find("DNG:"); // Now it's possible to add Dungeons even using their Name instead of ID such as normal deck cards.
|
||||
if (found != string::npos)
|
||||
{
|
||||
if(!database) continue;
|
||||
s = s.substr(found + 4);
|
||||
s.erase(s.find_last_not_of("\t\n\v\f\r ") + 1);
|
||||
s.erase(0, s.find_first_not_of("\t\n\v\f\r "));
|
||||
std::string::const_iterator it = s.begin();
|
||||
while (it != s.end() && std::isdigit(*it)) ++it;
|
||||
if(!s.empty() && it == s.end()){
|
||||
MTGCard * newcard = database->getCardById(atoi(s.c_str()));
|
||||
if(!DungeonZone.size() && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T) // If no dungeon has been added you can add one.
|
||||
DungeonZone.push_back(s);
|
||||
else if(DungeonZone.size() > 0 && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T){ // Try to add the dungeon.
|
||||
bool found = false;
|
||||
for(unsigned int i = 0; i < DungeonZone.size(); i++){
|
||||
MTGCard * oldcard = database->getCardById(atoi((DungeonZone.at(i)).c_str()));
|
||||
if(oldcard && oldcard->data->name == newcard->data->name)
|
||||
found = true;
|
||||
}
|
||||
if(!found)
|
||||
DungeonZone.push_back(s);
|
||||
}
|
||||
} else {
|
||||
size_t found = s.find(" *");
|
||||
if (found != string::npos)
|
||||
s = s.substr(0, found);
|
||||
MTGCard * newcard = database->getCardByName(s);
|
||||
if (newcard){
|
||||
std::stringstream str_id;
|
||||
str_id << newcard->getId();
|
||||
if(!DungeonZone.size() && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T) // If no dungeon has been added you can add one.
|
||||
DungeonZone.push_back(str_id.str());
|
||||
else if(DungeonZone.size() > 0 && newcard && newcard->data->hasType("Dungeon") && newcard->getRarity() == Constants::RARITY_T){ // Try to add the dungeon.
|
||||
bool found = false;
|
||||
for(unsigned int i = 0; i < DungeonZone.size() && !found; i++){
|
||||
MTGCard * oldcard = database->getCardById(atoi((DungeonZone.at(i)).c_str()));
|
||||
if(oldcard && oldcard->data->name == newcard->data->name)
|
||||
found = true;
|
||||
}
|
||||
if(!found)
|
||||
DungeonZone.push_back(str_id.str());
|
||||
}
|
||||
} else {
|
||||
DebugTrace("could not add to Dungeons any card with name: " << s);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (meta_only) continue; //Changed from break in order to read the command tag in metafile.
|
||||
@@ -1227,6 +1279,16 @@ void MTGDeck::replaceCMD(vector<string> newCMD)
|
||||
return;
|
||||
}
|
||||
|
||||
void MTGDeck::replaceDNG(vector<string> newDMG)
|
||||
{
|
||||
if(newDMG.size())
|
||||
{
|
||||
DungeonZone.clear();
|
||||
DungeonZone = newDMG;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int MTGDeck::remove(int cardid)
|
||||
{
|
||||
if (cards.find(cardid) == cards.end() || cards[cardid] == 0) return 0;
|
||||
@@ -1318,6 +1380,17 @@ int MTGDeck::save(const string& destFileName, bool useExpandedDescriptions, cons
|
||||
file << "#CMD:" << checkID << "\n";
|
||||
}
|
||||
}
|
||||
//save dungeons
|
||||
if(DungeonZone.size())
|
||||
{
|
||||
sort(DungeonZone.begin(), DungeonZone.end());
|
||||
for(unsigned int k = 0; k < DungeonZone.size(); k++)
|
||||
{
|
||||
int checkID = atoi(DungeonZone[k].c_str());
|
||||
if(checkID)
|
||||
file << "#DNG:" << checkID << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
file.close();
|
||||
JFileSystem::GetInstance()->Rename(tmp, destFileName);
|
||||
|
||||
@@ -214,7 +214,13 @@ const char* Constants::MTGBasicAbilities[] = {
|
||||
"undamageable", //It cannot be damaged by any source
|
||||
"lifefaker", //It's a card wich modify the life increasement when a @lifeof triggers occours (e.g. Angel of Vitality)
|
||||
"doublefacedeath", //It goes to temp zone after death (e.g. Double face card)
|
||||
"gaineddoublefacedeath" //It goes to temp after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
|
||||
"gaineddoublefacedeath", //It goes to temp after death (use just to give add ability to instants and sorceries which originally have not, e.g. with transforms keyword)
|
||||
"twodngtrg", //It makes rooms abilities trigger twice (e.g. Hama Pashar, Ruin Seeker)
|
||||
"nodngopp", //Opponent can't venture (e.g. "Keen-Eared Sentry")
|
||||
"nodngplr", //Controller can't venture
|
||||
"canplayauraequiplibrarytop", //auras and equipment
|
||||
"counterdeath", //It gains a 1/1 counter when it returns from graveyard (to use with inplaydeath and inplaytapdeath)"
|
||||
"dungeoncompleted" //This dungeon has been completed
|
||||
};
|
||||
|
||||
map<string,int> Constants::MTGBasicAbilitiesMap;
|
||||
|
||||
@@ -145,6 +145,21 @@ void MTGPlayerCards::initDeck(MTGDeck * deck)
|
||||
}
|
||||
}
|
||||
}
|
||||
//dungeon init
|
||||
if(deck->DungeonZone.size())
|
||||
{
|
||||
for(unsigned int j = 0; j < deck->DungeonZone.size(); j++)
|
||||
{
|
||||
string cardID = deck->DungeonZone[j];
|
||||
MTGCard * card = MTGCollection()->getCardById(atoi(cardID.c_str()));
|
||||
if(card)
|
||||
{
|
||||
MTGCardInstance * newCard = NEW MTGCardInstance(card, this);
|
||||
//Dungeons will be added to sideboard zone...
|
||||
sideboard->addCard(newCard);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MTGPlayerCards::~MTGPlayerCards()
|
||||
@@ -412,14 +427,25 @@ MTGCardInstance * MTGPlayerCards::putInGraveyard(MTGCardInstance * card)
|
||||
}
|
||||
else if (card->getCurrentZone() != card->controller()->game->hand && (card->basicAbilities[(int)Constants::INPLAYDEATH] || card->basicAbilities[(int)Constants::INPLAYTAPDEATH]))
|
||||
{
|
||||
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->battlefield);
|
||||
if(card->basicAbilities[(int)Constants::INPLAYTAPDEATH])
|
||||
bool toTap = card->basicAbilities[(int)Constants::INPLAYTAPDEATH];
|
||||
bool addCounter = card->basicAbilities[(int)Constants::COUNTERDEATH];
|
||||
MTGCardInstance* ret = putInZone(card, card->getCurrentZone(), card->owner->game->graveyard);
|
||||
ret = putInZone(ret, ret->getCurrentZone(), ret->owner->game->battlefield);
|
||||
if(toTap)
|
||||
ret->tap(true);
|
||||
if(addCounter)
|
||||
ret->counters->addCounter(1, 1, false);
|
||||
return ret;
|
||||
}
|
||||
return putInZone(card, card->currentZone, card->owner->game->graveyard);
|
||||
}
|
||||
|
||||
// Moves a card to its owner's sideboard
|
||||
MTGCardInstance * MTGPlayerCards::putInSideboard(MTGCardInstance * card)
|
||||
{
|
||||
return putInZone(card, card->currentZone, card->owner->game->sideboard);
|
||||
}
|
||||
|
||||
// Moves a card to its owner's exile
|
||||
MTGCardInstance * MTGPlayerCards::putInExile(MTGCardInstance * card)
|
||||
{
|
||||
@@ -836,6 +862,7 @@ MTGCardInstance * MTGGameZone::removeCard(MTGCardInstance * card, int createCopy
|
||||
copy->basicAbilities[Constants::GAINEDEXILEDEATH] = card->basicAbilities[Constants::GAINEDEXILEDEATH];
|
||||
copy->basicAbilities[Constants::GAINEDHANDDEATH] = card->basicAbilities[Constants::GAINEDHANDDEATH];
|
||||
copy->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH] = card->basicAbilities[Constants::GAINEDDOUBLEFACEDEATH];
|
||||
copy->basicAbilities[Constants::DUNGEONCOMPLETED] = card->basicAbilities[Constants::DUNGEONCOMPLETED];
|
||||
copy->damageInflictedAsCommander = card->damageInflictedAsCommander;
|
||||
copy->numofcastfromcommandzone = card->numofcastfromcommandzone;
|
||||
for (int i = 0; i < ManaCost::MANA_PAID_WITH_BESTOW +1; i++)
|
||||
|
||||
@@ -36,6 +36,7 @@ Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck *
|
||||
drawCounter = 0;
|
||||
energyCount = 0;
|
||||
yidaroCount = 0;
|
||||
dungeonCompleted = 0;
|
||||
numOfCommandCast = 0;
|
||||
monarch = 0;
|
||||
surveilOffset = 0;
|
||||
|
||||
@@ -603,6 +603,7 @@ void Rules::initGame(GameObserver *g, bool currentPlayerSet)
|
||||
p->preventable = initState.playerData[i].player->preventable;
|
||||
p->energyCount = initState.playerData[i].player->energyCount;
|
||||
p->yidaroCount = initState.playerData[i].player->yidaroCount;
|
||||
p->dungeonCompleted = initState.playerData[i].player->dungeonCompleted;
|
||||
p->numOfCommandCast = initState.playerData[i].player->numOfCommandCast;
|
||||
p->monarch = initState.playerData[i].player->monarch;
|
||||
p->surveilOffset = initState.playerData[i].player->surveilOffset;
|
||||
|
||||
@@ -317,6 +317,11 @@ WEventCardExplored::WEventCardExplored(MTGCardInstance * card) :
|
||||
{
|
||||
}
|
||||
|
||||
WEventCardDungeonCompleted::WEventCardDungeonCompleted(MTGCardInstance * card, int totaldng, string playerName) :
|
||||
WEventCardUpdate(card), totaldng(totaldng), playerName(playerName)
|
||||
{
|
||||
}
|
||||
|
||||
WEventCardRollDie::WEventCardRollDie(MTGCardInstance * card, string playerName) :
|
||||
WEventCardUpdate(card), playerName(playerName)
|
||||
{
|
||||
@@ -570,6 +575,12 @@ Targetable * WEventCardExplored::getTarget(int target)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Targetable * WEventCardDungeonCompleted::getTarget(int target)
|
||||
{
|
||||
if (target) return card;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Targetable * WEventCardRollDie::getTarget(int target)
|
||||
{
|
||||
if (target) return card;
|
||||
|
||||
@@ -594,9 +594,21 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
|
||||
{
|
||||
intValue = (s == "mypoisoncount")?target->controller()->poisonCount:target->controller()->opponent()->poisonCount;
|
||||
}
|
||||
else if(s == "lastrollresult" || s == "lastrollchoice")
|
||||
else if(s == "lastrollresult" || s == "lastrollchoice" || s == "lastdiefaces" || s == "srclastrollresult" || s == "srclastrollchoice" || s == "srclastdiefaces")
|
||||
{
|
||||
intValue = (s == "lastrollresult")?target->lastRollResult:target->dieSide;
|
||||
intValue = 0;
|
||||
if(s == "lastrollresult")
|
||||
intValue = target->lastRollResult;
|
||||
else if(s == "srclastrollresult")
|
||||
intValue = card->lastRollResult;
|
||||
else if(s == "lastrollchoice")
|
||||
intValue = target->dieSide;
|
||||
else if(s == "srclastrollchoice")
|
||||
intValue = card->dieSide;
|
||||
else if(s == "lastdiefaces")
|
||||
intValue = target->dieNumFaces;
|
||||
else if(s == "srclastdiefaces")
|
||||
intValue = card->dieNumFaces;
|
||||
}
|
||||
else if(s == "lastflipresult" || s == "lastflipchoice")
|
||||
{
|
||||
@@ -926,6 +938,31 @@ void WParsedInt::init(string s, Spell * spell, MTGCardInstance * card)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (s.find("cardcountabil") != string::npos)//Count Total cards with specific ability
|
||||
{
|
||||
intValue = 0;
|
||||
bool different_names = (s.find("diffcardcountabil")!=string::npos)?true:false;
|
||||
string ability = (s.find("diffcardcountabil")!=string::npos)?s.substr(17):s.substr(13);
|
||||
vector<string> list;
|
||||
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
|
||||
{
|
||||
if (card->controller()->game->inPlay->cards[j]->basicAbilities[Constants::GetBasicAbilityIndex(ability)] == 1){
|
||||
if(!different_names)
|
||||
intValue += 1;
|
||||
else{
|
||||
bool name_found = false;
|
||||
for(unsigned int i = 0; i < list.size() && !name_found; i++){
|
||||
if(list[i] == card->controller()->game->inPlay->cards[j]->name)
|
||||
name_found = true;
|
||||
}
|
||||
if(!name_found){
|
||||
list.push_back(card->controller()->game->inPlay->cards[j]->name);
|
||||
intValue += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (s.find("cardcounttype") != string::npos)//Count Total cards of specific type
|
||||
{
|
||||
intValue = 0;
|
||||
@@ -1222,6 +1259,50 @@ void WParsedInt::extendedParse(string s, Spell * spell, MTGCardInstance * card)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (s.find("totalmana") != string::npos)//find the cards with specified total mana in target player library
|
||||
{
|
||||
intValue = 0;
|
||||
bool opponent = (s.find("oppototalmana")!=string::npos)?true:false;
|
||||
int manavalue = atoi((s.find("oppototalmana")!=string::npos)?s.substr(13).c_str():s.substr(9).c_str());
|
||||
int totalmana = 0;
|
||||
Player* p = card->controller();
|
||||
if (opponent)
|
||||
p = card->controller()->opponent();
|
||||
for (int j = p->game->library->nb_cards - 1; j >= 0 && totalmana < manavalue; --j){
|
||||
totalmana += p->game->library->cards[j]->getManaCost()->getConvertedCost();
|
||||
intValue = p->game->library->nb_cards - j;
|
||||
}
|
||||
}
|
||||
else if (s == "pdungeoncompleted" || s == "odungeoncompleted")
|
||||
{
|
||||
intValue = (s == "pdungeoncompleted")?card->controller()->dungeonCompleted:card->controller()->opponent()->dungeonCompleted;
|
||||
}
|
||||
else if (s == "pwrtotatt" || s == "thstotatt")//count Total Power or toughness of attacking creatures (e.g. Battle Cry Goblin)
|
||||
{
|
||||
intValue = 0;
|
||||
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
|
||||
{
|
||||
if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && card->controller()->game->inPlay->cards[j]->attacker){
|
||||
if(s == "pwrtotatt")
|
||||
intValue += card->controller()->game->inPlay->cards[j]->getCurrentPower();
|
||||
else
|
||||
intValue += card->controller()->game->inPlay->cards[j]->getCurrentToughness();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (s == "pwrtotblo" || s == "thstotblo")//count Total Power or toughness of blocking creatures
|
||||
{
|
||||
intValue = 0;
|
||||
for (int j = card->controller()->game->inPlay->nb_cards - 1; j >= 0; --j)
|
||||
{
|
||||
if (card->controller()->game->inPlay->cards[j]->hasType(Subtypes::TYPE_CREATURE) && card->controller()->game->inPlay->cards[j]->defenser){
|
||||
if(s == "pwrtotblo")
|
||||
intValue += card->controller()->game->inPlay->cards[j]->getCurrentPower();
|
||||
else
|
||||
intValue += card->controller()->game->inPlay->cards[j]->getCurrentToughness();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(!intValue)//found nothing, try parsing a atoi
|
||||
{
|
||||
intValue = atoi(s.c_str());
|
||||
|
||||
Reference in New Issue
Block a user