forked from External/mage
Compare commits
942 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d43ac44ada | |||
|
|
9d9896bd4c | ||
|
|
bb69fe2595 | ||
|
|
a5d14f91f6 | ||
|
|
436ac5bbbd | ||
|
|
97738afb9e | ||
|
|
0fc8d0871c | ||
|
|
f1d86a569f | ||
|
|
bbb9a8f656 | ||
|
|
95f1e00fee | ||
|
|
c5c42abb59 | ||
|
|
395a327cd3 | ||
|
|
b32a786236 | ||
|
|
69e20b1061 | ||
|
|
29557f4334 | ||
|
|
1700a06b00 | ||
|
|
b15e8b314a | ||
|
|
a3dea879f0 | ||
|
|
210f93a7cc | ||
|
|
1f21d6e716 | ||
|
|
edbb5b0209 | ||
|
|
10c5351b60 | ||
|
|
54e23ac3f4 | ||
|
|
9d46ecaf7f | ||
|
|
bb0cc796f1 | ||
|
|
252707f947 | ||
|
|
83e99022e1 | ||
|
|
04af8e94ab | ||
|
|
26488bf6e2 | ||
|
|
bb5536b458 | ||
|
|
074f58d341 | ||
|
|
934d8e13f5 | ||
|
|
9c5e4b0698 | ||
|
|
153cac5587 | ||
|
|
d744b347f2 | ||
|
|
4f8cc385fd | ||
|
|
d1b3dd3877 | ||
|
|
823ba6d849 | ||
|
|
3dfc836f14 | ||
|
|
589a02ae85 | ||
|
|
e8d5fb8c59 | ||
|
|
b715043d4a | ||
|
|
b33ecac6bd | ||
|
|
74305ee3fb | ||
|
|
898e3a37d1 | ||
|
|
36c6210cee | ||
|
|
ebf82309fc | ||
|
|
e38c199177 | ||
|
|
b8062c4131 | ||
|
|
440ece463a | ||
|
|
6b4acfe5ce | ||
|
|
4772658527 | ||
|
|
80d58a35f7 | ||
|
|
a656f0292a | ||
|
|
85b5f91936 | ||
|
|
832ebf0096 | ||
|
|
9b0f09ce91 | ||
|
|
6ba8c6fb90 | ||
|
|
3b978aa258 | ||
|
|
d6cc23ff95 | ||
|
|
7f06b7e3f7 | ||
|
|
603ad33d0e | ||
|
|
e97718c6a8 | ||
|
|
965bf8bea3 | ||
|
|
e7e6623ec9 | ||
|
|
a2a4af7981 | ||
|
|
46452b252e | ||
|
|
bc3240e94d | ||
|
|
4dcf37e007 | ||
|
|
2893fb43fc | ||
|
|
aa1e2342e4 | ||
|
|
426583ce83 | ||
|
|
5bf14e2add | ||
|
|
07a1875561 | ||
|
|
1f0b829522 | ||
|
|
761818c90f | ||
|
|
790361f59f | ||
|
|
00c5daa5ea | ||
|
|
7aa91ab43e | ||
|
|
0ecd425069 | ||
|
|
f81b0645f5 | ||
| 0171e2bbff | |||
|
|
08a0fa285e | ||
|
|
aa2fd2534e | ||
|
|
f0370c4759 | ||
|
|
0445d65777 | ||
|
|
9cfbcf6f84 | ||
|
|
31b682644a | ||
|
|
abb348ac1c | ||
|
|
5c8a185411 | ||
|
|
1ae2ba93a7 | ||
|
|
cb2e37c6a7 | ||
|
|
1abee5d86b | ||
|
|
f82f465c00 | ||
|
|
6fbdc86ed8 | ||
|
|
3f0b37ea99 | ||
|
|
0c9ce259bd | ||
|
|
fad886d48b | ||
|
|
037e30f802 | ||
|
|
b16fba2ceb | ||
|
|
886dd1f0b2 | ||
|
|
7f85e6ef3f | ||
|
|
6b4b938713 | ||
|
|
49442b7caf | ||
|
|
25cd45c8b8 | ||
|
|
be04d9b28f | ||
|
|
a4adf6f844 | ||
|
|
c193ff994b | ||
|
|
1447f467c3 | ||
|
|
dc458681cc | ||
|
|
ad61edd559 | ||
|
|
6c45ec6004 | ||
|
|
7322bf784f | ||
|
|
2fd0065e7e | ||
|
|
a59d57ae93 | ||
|
|
6b5fb2d4c2 | ||
|
|
4e2c4ec1f0 | ||
|
|
79afaa0fbb | ||
|
|
67dc571224 | ||
|
|
76605e2a9d | ||
|
|
80f604943d | ||
|
|
d10863b844 | ||
|
|
88fc3b9045 | ||
|
|
b5954c90a5 | ||
|
|
31b023a003 | ||
|
|
70ffc77a5b | ||
|
|
7d482d7a44 | ||
|
|
cc330ac3b8 | ||
| 4f714203ae | |||
|
|
5bfd0ae796 | ||
|
|
62ad2a1545 | ||
|
|
c76ffbb3f5 | ||
|
|
3d4454c7da | ||
|
|
5c62f53b08 | ||
|
|
7a0142867a | ||
|
|
ab2980116d | ||
|
|
5ce393f617 | ||
|
|
998b737ab5 | ||
|
|
09d3d89045 | ||
|
|
694f5332cc | ||
|
|
13f4a314a7 | ||
|
|
ee77746db8 | ||
|
|
1cb72d0efb | ||
|
|
ac71e5d5d8 | ||
|
|
d7b5c21894 | ||
|
|
70444ba7de | ||
|
|
74f7a4fcbe | ||
|
|
3c3b6b4353 | ||
|
|
d63b816a5f | ||
|
|
096795be00 | ||
|
|
f5ce27f6c8 | ||
|
|
c0e10f0569 | ||
|
|
c602edeca3 | ||
|
|
6efb4e5df4 | ||
|
|
d83e1f1e4e | ||
|
|
473df7ac12 | ||
|
|
626317cf68 | ||
|
|
4c3af32a50 | ||
|
|
c76dd063f2 | ||
|
|
e338f5c3f2 | ||
|
|
7bd6c157a8 | ||
|
|
e6cb3fe68e | ||
|
|
b87735aa49 | ||
|
|
ad063f7874 | ||
|
|
e562c20f1d | ||
|
|
d88f7c68d4 | ||
|
|
6cdc989c04 | ||
|
|
019e3ecf1c | ||
|
|
4eaf1233c9 | ||
|
|
522e54e215 | ||
|
|
6fc4a5fbba | ||
|
|
0ff60c91c1 | ||
|
|
43e7d31cc5 | ||
|
|
697a914892 | ||
|
|
c9af0467b9 | ||
|
|
9057461c29 | ||
|
|
32d9c6887c | ||
|
|
47246ee381 | ||
|
|
9bdda9c5fd | ||
|
|
654a29cba9 | ||
|
|
4c3a48b5f9 | ||
|
|
6cd0c9d500 | ||
|
|
58206f24d5 | ||
|
|
b412b9dd9a | ||
|
|
04bd66b638 | ||
|
|
81592ac710 | ||
|
|
4742d414eb | ||
|
|
defa5e20f5 | ||
|
|
ee99f7b094 | ||
|
|
97f57fc0e0 | ||
|
|
25e010ee01 | ||
|
|
eafc6600da | ||
|
|
4cc7a079ec | ||
|
|
d64e8b9194 | ||
|
|
f5802be133 | ||
|
|
6fb84830b3 | ||
|
|
bea75d55af | ||
|
|
8794545c9f | ||
|
|
7bb5e54eec | ||
|
|
bfed992bf8 | ||
|
|
3bca2e4eab | ||
|
|
9d49f601c2 | ||
|
|
f2bf831e61 | ||
|
|
646d34a90e | ||
|
|
97fd15d7a6 | ||
|
|
2799c3f1c0 | ||
|
|
71269f972e | ||
|
|
1fb0d26db9 | ||
|
|
0ae2c2b86e | ||
|
|
1a1f7ec588 | ||
|
|
b8394f99e2 | ||
|
|
03100a932e | ||
|
|
24785b6d81 | ||
|
|
9f663f2a23 | ||
|
|
7a6dfb7a2f | ||
|
|
06c51bd829 | ||
|
|
cd1f3985fd | ||
|
|
f7855dda8b | ||
|
|
00ff663c40 | ||
|
|
d785193b97 | ||
|
|
066fb6dd46 | ||
|
|
f0e551dafb | ||
|
|
caf7a2b8a9 | ||
|
|
865b05781e | ||
|
|
784bea734f | ||
|
|
df20c64c58 | ||
|
|
86d0910e1e | ||
|
|
eb69df1623 | ||
|
|
70327c70c7 | ||
|
|
f0d1fb8fa4 | ||
|
|
1bd3963079 | ||
|
|
3c75bd4889 | ||
|
|
67004140ff | ||
|
|
a986cdf31e | ||
|
|
cff73aa9f8 | ||
|
|
6a2bc8f2ee | ||
|
|
f744712d92 | ||
|
|
da4c97acbe | ||
|
|
b69a4c1616 | ||
|
|
504d8d375f | ||
|
|
71f642acc4 | ||
|
|
6a5fb5dd51 | ||
|
|
e996131ea9 | ||
|
|
401b70e616 | ||
|
|
7a71bf70aa | ||
|
|
80fdc8f88b | ||
|
|
1c95a93af2 | ||
|
|
a03e971090 | ||
|
|
8ac800b08b | ||
|
|
39a8945589 | ||
|
|
d2559333e8 | ||
|
|
1327fe2b99 | ||
|
|
7e34363954 | ||
|
|
67660374cb | ||
|
|
2b288cfd00 | ||
|
|
aac1aa55cc | ||
|
|
6e68121897 | ||
|
|
0d21b67057 | ||
|
|
90815541f9 | ||
|
|
a17635564a | ||
|
|
3a92c32e48 | ||
|
|
b69fb2f4cd | ||
|
|
9c4bd210d7 | ||
|
|
a502ee94d5 | ||
|
|
4494bdddbb | ||
|
|
93ebabf443 | ||
|
|
d41d9693b4 | ||
|
|
cc9a7bafc3 | ||
|
|
69c018fd3f | ||
|
|
b77d6cd8fd | ||
|
|
fbf6fe6ae6 | ||
|
|
b05f749be4 | ||
|
|
e43cef514b | ||
|
|
6e3d278fc8 | ||
|
|
52dbd96147 | ||
|
|
49aab3a855 | ||
|
|
08130d98b1 | ||
|
|
1c56342485 | ||
|
|
a50095e784 | ||
|
|
e4fcca82dd | ||
|
|
9c630578f1 | ||
|
|
6e0dc4f5f6 | ||
|
|
835d4ae465 | ||
|
|
c9e4b33e4c | ||
|
|
d8b32308e8 | ||
|
|
35eeb2cb2d | ||
|
|
9d1d27c9a5 | ||
|
|
d4635eb060 | ||
|
|
6b482f2afc | ||
|
|
dc07b24ed3 | ||
|
|
143efd64cb | ||
|
|
d968fb9f70 | ||
|
|
c3f359c5e8 | ||
|
|
dcf1ab14d7 | ||
|
|
4c0270a5d5 | ||
|
|
34ddd612b3 | ||
|
|
ac7f33a156 | ||
|
|
a13c339df2 | ||
|
|
ddb7e133c6 | ||
|
|
f880a683f9 | ||
|
|
63b01b10d7 | ||
|
|
c473b7a189 | ||
|
|
f0ba075d56 | ||
|
|
6e5116b673 | ||
|
|
da6ba92ba2 | ||
|
|
171ea63bc0 | ||
|
|
793c8d1daa | ||
|
|
a0f0c0f6be | ||
|
|
10db510c35 | ||
|
|
0168db7a57 | ||
|
|
269162bf32 | ||
|
|
64cde5ec17 | ||
|
|
5ff8881d19 | ||
|
|
cbd6d11087 | ||
|
|
1ec0897101 | ||
|
|
777bb176bf | ||
|
|
6e0d6dfc36 | ||
|
|
698f1d4668 | ||
|
|
a205bba849 | ||
|
|
ff79d9503e | ||
|
|
48ee8eefc3 | ||
|
|
5bf5bda8e5 | ||
|
|
7caf775696 | ||
|
|
3d6d30561d | ||
|
|
6a36947e65 | ||
|
|
08fc3bbdc1 | ||
|
|
44e6cf999e | ||
|
|
0fc84fca38 | ||
|
|
dfc91bf8cf | ||
|
|
19274aa8f0 | ||
|
|
fffead4da5 | ||
|
|
f4d4e80ed1 | ||
|
|
d2918e69f4 | ||
|
|
717baabdc3 | ||
|
|
46fa105b7e | ||
|
|
6766c7b45d | ||
|
|
76c6f4e2ec | ||
|
|
852d1d4351 | ||
|
|
ffb270eac7 | ||
|
|
9ba96ddf11 | ||
|
|
a0bdfda912 | ||
|
|
064c102590 | ||
|
|
654dda8f74 | ||
|
|
5e5b28151a | ||
|
|
621e7cd454 | ||
|
|
639944d796 | ||
|
|
b915d63787 | ||
|
|
379cd5b7b7 | ||
|
|
99bdfe3a1a | ||
|
|
bcba45652f | ||
|
|
d4b8c75619 | ||
|
|
b7416356aa | ||
|
|
48fa39256e | ||
|
|
0b796ea276 | ||
|
|
55cc7dc36d | ||
|
|
42a9cd8497 | ||
|
|
411eeab868 | ||
|
|
c7fb5fd495 | ||
|
|
5d051f02ea | ||
|
|
a19dbf129b | ||
|
|
531f2e3c38 | ||
|
|
8425601562 | ||
|
|
9f214bf0a3 | ||
|
|
1551492939 | ||
|
|
0e21b91fd3 | ||
|
|
4b5b2e191e | ||
|
|
5c1c402fbf | ||
|
|
75f26e3453 | ||
|
|
3ebe6ec782 | ||
|
|
4e46920b50 | ||
|
|
2218ec0ae4 | ||
|
|
955fe40172 | ||
|
|
87b040b86f | ||
|
|
ed34fa4061 | ||
|
|
ba4c030009 | ||
|
|
fb4317a988 | ||
|
|
b1ca3804cc | ||
|
|
6db11cc000 | ||
|
|
3c0593a7fa | ||
|
|
d98d59cc55 | ||
|
|
37ade28c31 | ||
|
|
13bf2126d3 | ||
|
|
b489efa05c | ||
| dd34dc9b0b | |||
|
|
4b3cacbf2b | ||
|
|
d3b0531777 | ||
|
|
9d2d7827ef | ||
|
|
3188c157df | ||
|
|
8cd27af5a5 | ||
|
|
085fe11160 | ||
|
|
459fe81ee4 | ||
|
|
9c799b432d | ||
|
|
4ad97ef48c | ||
|
|
ac055bb808 | ||
|
|
e47b17828b | ||
|
|
f5893a5c05 | ||
|
|
df68b4b4b1 | ||
|
|
67dfb64b01 | ||
|
|
051440784f | ||
|
|
566bb511a6 | ||
|
|
a32a5caaa7 | ||
|
|
8778088016 | ||
|
|
f43e0a72f4 | ||
|
|
774a3553fd | ||
|
|
0e589914de | ||
|
|
09a423ae65 | ||
|
|
4bcb17a40e | ||
|
|
6718c744e5 | ||
|
|
313651cfc8 | ||
|
|
ef4d48a654 | ||
|
|
5bbcda3d4e | ||
|
|
45e43fabd4 | ||
| 4065f20b2c | |||
| eef561112e | |||
| a142cc6abe | |||
| a713d8d584 | |||
| ca9f3f3e1f | |||
| 1ad521d340 | |||
|
|
b839c7bf87 | ||
|
|
4a458800aa | ||
|
|
b235e5e99d | ||
|
|
496f147c15 | ||
|
|
2092f3857e | ||
|
|
9e475fccd1 | ||
|
|
b5118f2a5b | ||
|
|
78281dbe69 | ||
|
|
94471f3126 | ||
|
|
d63cfa56f8 | ||
|
|
7e0fdcbe64 | ||
|
|
cbf70893a8 | ||
|
|
967e8e6bcb | ||
|
|
f7be842008 | ||
|
|
cb900eb799 | ||
|
|
a8aef445fd | ||
|
|
003fe945a2 | ||
|
|
b8a65a31f4 | ||
|
|
98fbbb25b6 | ||
|
|
4a41b0415a | ||
|
|
e8c8b72a07 | ||
|
|
8a3c6e1523 | ||
|
|
3cf6da1735 | ||
|
|
102b5b519d | ||
|
|
f012b18d8d | ||
|
|
e9a115fca0 | ||
|
|
7cad86e90f | ||
|
|
89f5e84ba7 | ||
|
|
41c5076755 | ||
|
|
60addceff9 | ||
|
|
ad1866e4f0 | ||
|
|
8bb8eba43d | ||
|
|
747730568e | ||
|
|
159933cc8a | ||
|
|
1c134ac2c2 | ||
|
|
89c5b54d32 | ||
|
|
c2b22aba4a | ||
|
|
b9f003ab8c | ||
|
|
891be73d87 | ||
|
|
27f9105c9f | ||
|
|
8375d6b606 | ||
|
|
fec3599b73 | ||
|
|
14fe52124c | ||
|
|
35bed32770 | ||
|
|
085b450e62 | ||
|
|
b4cc09a7a0 | ||
| 31839c4eca | |||
|
|
4e29f4f241 | ||
|
|
d4ffa1e376 | ||
|
|
cbf47baf09 | ||
|
|
a098cb7849 | ||
|
|
911ab58fb9 | ||
|
|
2884c898b3 | ||
|
|
9caa43dfac | ||
|
|
90bdec8f3d | ||
|
|
28409fefd4 | ||
|
|
df7187f09a | ||
|
|
2c97aa8688 | ||
|
|
dba03e67ee | ||
|
|
8bae73cea3 | ||
|
|
d6d75edf34 | ||
|
|
d0ae249d93 | ||
|
|
d247df8515 | ||
|
|
b06039a437 | ||
|
|
559690f15b | ||
|
|
39d3b6995c | ||
|
|
21f2ad43b7 | ||
|
|
30ee9dc22f | ||
|
|
f8e4defff8 | ||
|
|
b19adec4bc | ||
|
|
6ec4a2b781 | ||
|
|
bbca3f342e | ||
|
|
7a3888e1ca | ||
|
|
ee149c9bdc | ||
|
|
9e464d3af1 | ||
|
|
e912e47640 | ||
|
|
68908db387 | ||
|
|
33ca328b38 | ||
|
|
29ab28fd74 | ||
|
|
265fbcfe82 | ||
|
|
db8b2927a7 | ||
|
|
2a81886bc7 | ||
|
|
1498dded50 | ||
|
|
d46a258044 | ||
|
|
dba77b9858 | ||
|
|
4a81ca7c78 | ||
|
|
8749dcc2d4 | ||
|
|
8bdf3378dc | ||
|
|
5f6c8a6faf | ||
|
|
a695de10ee | ||
|
|
11f7e6347a | ||
|
|
7c114272d7 | ||
|
|
7b131673be | ||
|
|
1c0525d058 | ||
|
|
3ca0101495 | ||
|
|
dd316ee61f | ||
|
|
454c7e0116 | ||
|
|
d7dec3baa5 | ||
|
|
8cd1bec19d | ||
| d44ecab868 | |||
|
|
95f53fc671 | ||
|
|
d95f77d352 | ||
|
|
fba06baf3c | ||
|
|
807f69f548 | ||
|
|
db823de8cd | ||
|
|
23f32bcd61 | ||
|
|
355a0972c0 | ||
|
|
aa6c97f8f2 | ||
| a240168e52 | |||
| 3f29618d03 | |||
|
|
287afad212 | ||
|
|
14c41875df | ||
|
|
11ff92e3cc | ||
|
|
d886da6e52 | ||
| 466f6ed385 | |||
|
|
ef7a511f0c | ||
|
|
bba214c1f8 | ||
|
|
078e702a75 | ||
|
|
4229d7fb13 | ||
|
|
ff5e7f2d16 | ||
|
|
49d65c1a88 | ||
|
|
18a050fb70 | ||
|
|
9a6504c1fa | ||
|
|
10a8059eae | ||
|
|
95c326b200 | ||
|
|
4ce2e561fb | ||
|
|
35e906513c | ||
|
|
4d5971c946 | ||
|
|
7a4c82cd52 | ||
|
|
8056dd3887 | ||
|
|
652ca6c9e1 | ||
|
|
6d0dc2f0df | ||
|
|
03679f84fe | ||
|
|
b41a4872a5 | ||
|
|
34c26f09c8 | ||
|
|
32af4a0671 | ||
|
|
6b7a757c2f | ||
|
|
c03f3502df | ||
|
|
bf6a7684d6 | ||
|
|
441ea0fa89 | ||
|
|
38c0cc973d | ||
|
|
7e7b519f49 | ||
|
|
c7a79197e5 | ||
|
|
5f22d4e5cd | ||
|
|
41b8f57883 | ||
|
|
4dd7e963bc | ||
|
|
432de6f9fe | ||
|
|
d2a7991f8e | ||
|
|
d46ccdd8bc | ||
|
|
0b4d8d02d7 | ||
|
|
f92af2b9cd | ||
|
|
457a5303f3 | ||
|
|
199652463c | ||
|
|
53382bd6c9 | ||
|
|
2cd89bb2db | ||
|
|
8f1050a834 | ||
|
|
d0ee2fef06 | ||
|
|
4dd5054314 | ||
|
|
401e09830d | ||
|
|
f7c239c1fe | ||
|
|
3fc3b9da1a | ||
|
|
3ac86997b2 | ||
|
|
2e70279485 | ||
|
|
d5a0a139a5 | ||
|
|
7df3985dd9 | ||
|
|
988c661ccf | ||
|
|
7df7286a27 | ||
|
|
1fc6abc08e | ||
|
|
2a39c13f4a | ||
|
|
59b4a5d766 | ||
|
|
54975d8051 | ||
|
|
721b9b90c9 | ||
|
|
2f15477214 | ||
|
|
32282a42b7 | ||
|
|
388635140f | ||
|
|
50e0d200cb | ||
|
|
7539ba7a4f | ||
|
|
bd769d651e | ||
|
|
9092518aa9 | ||
|
|
33852c72e7 | ||
|
|
76708eaa9f | ||
|
|
595e40850c | ||
|
|
5e0b79d021 | ||
|
|
c485d70dcf | ||
|
|
b63660e022 | ||
|
|
f663f5e002 | ||
|
|
d5fa369e4d | ||
|
|
fec244c675 | ||
|
|
91d67ba81b | ||
|
|
73205c4be2 | ||
|
|
54a8e8ef31 | ||
|
|
2fb8a97e6a | ||
|
|
d1b11cad4f | ||
|
|
37cffc3895 | ||
|
|
ed134cbfc6 | ||
|
|
8b6b90c8d8 | ||
|
|
43d315861d | ||
|
|
411e25661a | ||
|
|
4cac317907 | ||
|
|
52a2165697 | ||
|
|
cf34f859b7 | ||
|
|
d60bd053fa | ||
|
|
823d80bf0d | ||
|
|
9ca98bb108 | ||
|
|
2144d76895 | ||
|
|
7f4759f708 | ||
|
|
6c45e5606a | ||
|
|
84526973d9 | ||
|
|
c091795a97 | ||
|
|
30ca433785 | ||
|
|
fe005e9477 | ||
|
|
c952311df0 | ||
|
|
0df165604b | ||
|
|
1fe8097307 | ||
|
|
d37ee2edc4 | ||
|
|
fb4303fbe6 | ||
|
|
d5b496c7f1 | ||
|
|
0b5638fbae | ||
|
|
0f1c19900c | ||
|
|
9e60c50771 | ||
|
|
34cf4617f0 | ||
|
|
502b08762f | ||
|
|
5bbeb9391f | ||
|
|
4b8b1a95ad | ||
|
|
00180cffa6 | ||
|
|
538debf2e0 | ||
|
|
6e29b8e7fa | ||
|
|
e19c454aa3 | ||
|
|
e7636fb17d | ||
|
|
5bb8ff2c7f | ||
|
|
ace21c67c1 | ||
|
|
a740a2b2dc | ||
|
|
06543904f2 | ||
|
|
9aafd4a14e | ||
|
|
95b8fc92ef | ||
|
|
f919c56da7 | ||
|
|
4bfa4c82a6 | ||
|
|
971f83b19c | ||
|
|
f7e1f1d346 | ||
|
|
a95f6f88d5 | ||
|
|
2db53973f9 | ||
|
|
1b345c58ac | ||
|
|
0cb3646960 | ||
|
|
b3fc051a3d | ||
|
|
f2700a5448 | ||
|
|
7681433faf | ||
|
|
e94ff0949f | ||
|
|
02ccf58bdd | ||
|
|
3062be1e44 | ||
|
|
2c2e37e792 | ||
|
|
e26c094b26 | ||
|
|
edad932077 | ||
|
|
785b45fdf8 | ||
|
|
f9be1e4abe | ||
|
|
953f9b54fa | ||
|
|
f5c3d01d70 | ||
|
|
28174827df | ||
|
|
c5bd744c00 | ||
|
|
17014b2dd4 | ||
|
|
0eee8fbb3f | ||
|
|
6086a04ece | ||
|
|
9b295448cd | ||
|
|
cf586d0b8f | ||
|
|
f02bd66852 | ||
|
|
9462bd89a8 | ||
|
|
fa21c0e619 | ||
|
|
bd0fbaeef9 | ||
|
|
58d672462a | ||
|
|
5faf68144a | ||
|
|
26ab143ccb | ||
|
|
5b8103003c | ||
|
|
0a4f2be833 | ||
|
|
482c7a9443 | ||
|
|
693a6f2213 | ||
|
|
8656548676 | ||
|
|
78694fce0b | ||
|
|
811bf61ca7 | ||
|
|
7b0c3c8801 | ||
|
|
9e54ac477e | ||
|
|
e22055b697 | ||
|
|
238e78c811 | ||
|
|
45aa4717ad | ||
|
|
2edd2e7926 | ||
|
|
186d4a5f23 | ||
|
|
0254fc0d2a | ||
|
|
4a6f3baca2 | ||
|
|
2093091da2 | ||
|
|
60c56aab2f | ||
|
|
ef249d1ada | ||
|
|
e65e67c125 | ||
|
|
ce8f7d9493 | ||
|
|
9021a7bd8a | ||
|
|
480ac32cb0 | ||
|
|
454683682d | ||
|
|
1a550b48d7 | ||
|
|
86cd18beb9 | ||
|
|
7b9a72f758 | ||
|
|
c0fc991f6a | ||
|
|
1b08a2e2f7 | ||
|
|
897fb087c1 | ||
|
|
2db69b4ba5 | ||
|
|
49a3b1176e | ||
|
|
8e0a222f9b | ||
|
|
642362e99d | ||
|
|
963e516666 | ||
|
|
90f860c64a | ||
|
|
0adbc7c0c3 | ||
|
|
5d034fcb0c | ||
|
|
17ffb8afe9 | ||
|
|
37c4d00395 | ||
|
|
1427a6de1c | ||
|
|
51b386baa6 | ||
|
|
56ad1fb16e | ||
|
|
7b3102af5d | ||
|
|
0ee188226f | ||
|
|
03d4fb70a6 | ||
|
|
6a562ea431 | ||
|
|
ffdc2a9129 | ||
|
|
fe7b9e3e98 | ||
|
|
8716606f0c | ||
|
|
0bb9b4468d | ||
|
|
6700e777f5 | ||
|
|
37fb493de1 | ||
|
|
82e08b244a | ||
|
|
f142d07440 | ||
|
|
d13a0e6e6b | ||
|
|
71cd3ce3fc | ||
|
|
33c19fbc0f | ||
|
|
3c6a18f24e | ||
|
|
d59136cc33 | ||
|
|
55ded952bc | ||
|
|
9921648522 | ||
|
|
ef9f917c59 | ||
|
|
c3420bbc89 | ||
|
|
3fa021a295 | ||
|
|
7129c02d86 | ||
|
|
1ed4f5a373 | ||
|
|
df216677cd | ||
|
|
d3957259ac | ||
|
|
31ef208f34 | ||
|
|
36aaf3460f | ||
|
|
0835f49ba3 | ||
|
|
47f2eb4c94 | ||
|
|
366ffbb1e0 | ||
|
|
ef475de29e | ||
|
|
60be7070d6 | ||
|
|
f674034cdf | ||
|
|
924585cb86 | ||
|
|
2ec9b8efa9 | ||
|
|
ae7e6a9c10 | ||
|
|
3dea6f9a84 | ||
| 220763b685 | |||
|
|
3c33531243 | ||
|
|
65dae3e97b | ||
|
|
f5b6c31152 | ||
|
|
848ea5a903 | ||
|
|
370ce47303 | ||
|
|
c7f92a093b | ||
|
|
b085446d04 | ||
|
|
f3d6855965 | ||
|
|
dd67682c12 | ||
|
|
ca8b02d5ab | ||
|
|
895c99d282 | ||
|
|
8b636b9926 | ||
|
|
0651825e6d | ||
|
|
b0ee19d782 | ||
|
|
c16b3d6056 | ||
|
|
4410374840 | ||
|
|
e6da7ed600 | ||
|
|
abe8a4356e | ||
|
|
985390b7c3 | ||
|
|
b6de7f8406 | ||
|
|
64558dc5fd | ||
|
|
910dbe0f0a | ||
|
|
f304cc545a | ||
|
|
d38d0d8719 | ||
|
|
f0572e6099 | ||
|
|
13d4ee1d65 | ||
|
|
b3c0090fba | ||
|
|
faedb81a5c | ||
|
|
168e2a27ec | ||
|
|
6008dc279e | ||
|
|
b470f0b679 | ||
|
|
b64f1dce45 | ||
| 01ef3b0957 | |||
| 09f78c6240 | |||
|
|
96dbfc757e | ||
|
|
ea2dca6410 | ||
|
|
c28facf759 | ||
|
|
5a78f79f32 | ||
|
|
855bfabf24 | ||
|
|
0df1c4b128 | ||
|
|
5f8f0c96f3 | ||
|
|
2202bd4453 | ||
|
|
f3447ffc87 | ||
|
|
d0fa2bc125 | ||
|
|
5d5ce4e0ab | ||
|
|
3b5ee47175 | ||
|
|
37b4146171 | ||
|
|
b3c699ef6e | ||
|
|
ef2e4858a3 | ||
|
|
1b87743605 | ||
|
|
65616841cb | ||
|
|
6549368417 | ||
|
|
ee7ce743e4 | ||
|
|
d7e5dee77e | ||
|
|
10989bc86c | ||
|
|
66d0a81264 | ||
|
|
416e64f3a0 | ||
|
|
ffa1ef10b7 | ||
|
|
2cbae4a9ee | ||
|
|
6d295a1777 | ||
|
|
ea09727e96 | ||
|
|
47c70bdc2d | ||
|
|
8aceff16b0 | ||
|
|
f452640a71 | ||
|
|
c7f2bae792 | ||
|
|
268a1c8339 | ||
|
|
a9d728080e | ||
|
|
8474f739e2 | ||
|
|
a23d5f82e2 | ||
|
|
505a0b66f7 | ||
|
|
78237b6b8b | ||
|
|
e10b9fb7b9 | ||
|
|
935a389a05 | ||
|
|
93f1008170 | ||
|
|
cb28ffb1ab | ||
|
|
7be8f96063 | ||
|
|
1b396d68c6 | ||
|
|
4de08db7f5 | ||
|
|
309d7415a0 | ||
|
|
c2893d89a2 | ||
|
|
e8c04a5896 | ||
|
|
60ed1b7e6d | ||
|
|
366c038f6e | ||
|
|
e34613f11e | ||
|
|
31e9a2beb6 | ||
|
|
6677bd1754 | ||
|
|
936c0b3a9c | ||
|
|
f1e588faa3 | ||
|
|
82c0aab35a | ||
|
|
790e938f40 | ||
|
|
3c25c1931c | ||
|
|
6f05e94e5f | ||
|
|
23d7ba2293 | ||
|
|
4b2ea25e96 | ||
|
|
4c4137ac79 | ||
|
|
7f1c5c37a1 | ||
|
|
076dcf1cf9 | ||
|
|
0fc1eba02c | ||
|
|
c70fcbab79 | ||
| d73dbfba11 | |||
| 8926bcf5c2 | |||
| eaac06f1cb | |||
|
|
82a8d36558 | ||
|
|
bfe218dd05 | ||
|
|
7644d1895c | ||
|
|
aa1915cd13 | ||
|
|
5bede15130 | ||
|
|
f293ff51d9 | ||
|
|
4286704c5a | ||
|
|
5b2944a213 | ||
|
|
b457a2e559 | ||
|
|
8ff46a2b40 | ||
|
|
69de331df0 | ||
|
|
009298d1f1 | ||
|
|
dd6321abec | ||
|
|
9a43922b40 | ||
|
|
93e709cc82 | ||
|
|
174ccedfae | ||
|
|
6a175067cb | ||
|
|
014e21d035 | ||
|
|
3fd6ee8d6a | ||
|
|
c6b631a5b4 | ||
|
|
6d883b5a77 | ||
|
|
a598d92eb2 | ||
|
|
38bb4422a6 | ||
|
|
80ba2a2dd0 | ||
|
|
89702ad81d | ||
|
|
2f85f46e32 | ||
|
|
c5a52232d0 | ||
|
|
0ec783cfdc | ||
|
|
32080c731f | ||
|
|
9c6a2762bb | ||
|
|
5adff9bd51 | ||
|
|
3ecf58a3e1 | ||
|
|
12f52b24df | ||
|
|
35c5344a31 | ||
|
|
07cd325711 | ||
|
|
f0572c7551 | ||
|
|
498084c530 | ||
|
|
7e6185afa6 | ||
|
|
d349c8eea0 | ||
|
|
42291c75af | ||
|
|
2f594c8445 | ||
|
|
01944d39bb | ||
|
|
cfeb1af64a | ||
|
|
c80f70deeb | ||
|
|
5c0411d02e | ||
|
|
3367622d35 | ||
|
|
6067624df2 | ||
|
|
a877ab3f1a | ||
|
|
bfaba3069f | ||
|
|
ade5935d1a | ||
|
|
cac3be5c4a | ||
|
|
038c8f05ef | ||
|
|
a5068798a2 | ||
|
|
32a1ff367d | ||
|
|
355e8c15bc | ||
|
|
88dae5ff4b | ||
|
|
065a271f57 | ||
|
|
dd83ccb095 | ||
|
|
ec2c7e6ad6 | ||
|
|
b8504d56f2 | ||
|
|
05e304e621 | ||
|
|
ef270721a5 | ||
|
|
43ac278946 | ||
|
|
0865b94875 | ||
|
|
84a7e9f5b8 | ||
|
|
16c789aaf7 | ||
|
|
9828e56590 | ||
|
|
7a241a6f1e | ||
|
|
2552dcf633 | ||
|
|
4683e5c05a |
1910 changed files with 64695 additions and 16924 deletions
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-client</artifactId>
|
||||
|
|
@ -133,7 +133,7 @@
|
|||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
<artifactId>batik-transcoder</artifactId>
|
||||
<version>1.17</version>
|
||||
<version>1.19</version>
|
||||
</dependency>
|
||||
<!-- svg support END -->
|
||||
|
||||
|
|
|
|||
|
|
@ -575,7 +575,7 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
|||
|
||||
// Constants
|
||||
private static final int DEFAULT_COUNT_LABEL_HEIGHT = 40; // can contain 1 or 2 lines
|
||||
public static final int GRID_PADDING = 20;
|
||||
public static final int GRID_PADDING = 12;
|
||||
|
||||
private static final ImageIcon INSERT_ROW_ICON = new ImageIcon(DragCardGrid.class.getClassLoader().getResource("editor_insert_row.png"));
|
||||
private static final ImageIcon INSERT_COL_ICON = new ImageIcon(DragCardGrid.class.getClassLoader().getResource("editor_insert_col.png"));
|
||||
|
|
|
|||
|
|
@ -39,10 +39,9 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
private static final Logger logger = Logger.getLogger(BracketLegalityLabel.class);
|
||||
|
||||
private static final String GROUP_GAME_CHANGES = "Game Changers";
|
||||
private static final String GROUP_INFINITE_COMBOS = "Infinite Combos";
|
||||
private static final String GROUP_INFINITE_COMBOS = "Early-game 2-Card Combos";
|
||||
private static final String GROUP_MASS_LAND_DESTRUCTION = "Mass Land Destruction";
|
||||
private static final String GROUP_EXTRA_TURN = "Extra Turns";
|
||||
private static final String GROUP_TUTORS = "Tutors";
|
||||
|
||||
private static final Map<String, List<Integer>> MAX_GROUP_LIMITS = new LinkedHashMap<>();
|
||||
|
||||
|
|
@ -78,8 +77,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
Arrays.asList(0, 0, 0, 0, 99, 99));
|
||||
MAX_GROUP_LIMITS.put(GROUP_EXTRA_TURN,
|
||||
Arrays.asList(0, 0, 0, 3, 99, 99));
|
||||
MAX_GROUP_LIMITS.put(GROUP_TUTORS,
|
||||
Arrays.asList(0, 3, 3, 99, 99, 99));
|
||||
}
|
||||
|
||||
private static final String RESOURCE_INFINITE_COMBOS = "brackets/infinite-combos.txt";
|
||||
|
|
@ -92,7 +89,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
private final List<String> foundInfiniteCombos = new ArrayList<>();
|
||||
private final List<String> foundMassLandDestruction = new ArrayList<>();
|
||||
private final List<String> foundExtraTurn = new ArrayList<>();
|
||||
private final List<String> foundTutors = new ArrayList<>();
|
||||
|
||||
private final List<String> badCards = new ArrayList<>();
|
||||
private final List<String> fullGameChanges = new ArrayList<>();
|
||||
|
|
@ -126,9 +122,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
if (this.foundExtraTurn.size() > getMaxCardsLimit(GROUP_EXTRA_TURN)) {
|
||||
this.badCards.addAll(this.foundExtraTurn);
|
||||
}
|
||||
if (this.foundTutors.size() > getMaxCardsLimit(GROUP_TUTORS)) {
|
||||
this.badCards.addAll(this.foundTutors);
|
||||
}
|
||||
}
|
||||
|
||||
private Integer getMaxCardsLimit(String groupName) {
|
||||
|
|
@ -165,7 +158,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
groups.put(GROUP_INFINITE_COMBOS + getStats(GROUP_INFINITE_COMBOS), this.foundInfiniteCombos);
|
||||
groups.put(GROUP_MASS_LAND_DESTRUCTION + getStats(GROUP_MASS_LAND_DESTRUCTION), this.foundMassLandDestruction);
|
||||
groups.put(GROUP_EXTRA_TURN + getStats(GROUP_EXTRA_TURN), this.foundExtraTurn);
|
||||
groups.put(GROUP_TUTORS + getStats(GROUP_TUTORS), this.foundTutors);
|
||||
groups.forEach((group, cards) -> {
|
||||
showInfo.add("<br>");
|
||||
showInfo.add("<span style='font-weight:bold;font-size: " + infoFontTextSize + "px;'>" + group + "</span>");
|
||||
|
|
@ -199,9 +191,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
case GROUP_EXTRA_TURN:
|
||||
currentAmount = this.foundExtraTurn.size();
|
||||
break;
|
||||
case GROUP_TUTORS:
|
||||
currentAmount = this.foundTutors.size();
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown group " + groupName);
|
||||
}
|
||||
|
|
@ -222,7 +211,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
collectInfiniteCombos(deck);
|
||||
collectMassLandDestruction(deck);
|
||||
collectExtraTurn(deck);
|
||||
collectTutors(deck);
|
||||
}
|
||||
|
||||
private void collectGameChangers(Deck deck) {
|
||||
|
|
@ -244,12 +232,9 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
"Consecrated Sphinx",
|
||||
"Crop Rotation",
|
||||
"Cyclonic Rift",
|
||||
"Deflecting Swat",
|
||||
"Enlightened Tutor",
|
||||
"Expropriate",
|
||||
"Field of the Dead",
|
||||
"Fierce Guardianship",
|
||||
"Food Chain",
|
||||
"Force of Will",
|
||||
"Gaea's Cradle",
|
||||
"Gamble",
|
||||
|
|
@ -261,8 +246,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
"Imperial Seal",
|
||||
"Intuition",
|
||||
"Jeska's Will",
|
||||
"Jin-Gitaxias, Core Augur",
|
||||
"Kinnan, Bonder Prodigy",
|
||||
"Lion's Eye Diamond",
|
||||
"Mana Vault",
|
||||
"Mishra's Workshop",
|
||||
|
|
@ -280,18 +263,13 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
"Serra's Sanctum",
|
||||
"Smothering Tithe",
|
||||
"Survival of the Fittest",
|
||||
"Sway of the Stars",
|
||||
"Teferi's Protection",
|
||||
"Tergrid, God of Fright",
|
||||
"Thassa's Oracle",
|
||||
"The One Ring",
|
||||
"The Tabernacle at Pendrell Vale",
|
||||
"Underworld Breach",
|
||||
"Urza, Lord High Artificer",
|
||||
"Vampiric Tutor",
|
||||
"Vorinclex, Voice of Hunger",
|
||||
"Yuriko, the Tiger's Shadow",
|
||||
"Winota, Joiner of Forces",
|
||||
"Worldly Tutor"
|
||||
));
|
||||
}
|
||||
|
|
@ -393,19 +371,6 @@ public class BracketLegalityLabel extends LegalityLabel {
|
|||
.forEach(this.foundExtraTurn::add);
|
||||
}
|
||||
|
||||
private void collectTutors(Deck deck) {
|
||||
// edh power level uses search for land and non-land card, but bracket need only non-land cards searching
|
||||
this.foundTutors.clear();
|
||||
Stream.concat(deck.getCards().stream(), deck.getSideboard().stream())
|
||||
.filter(card -> card.getRules().stream()
|
||||
.map(s -> s.toLowerCase(Locale.ENGLISH))
|
||||
.anyMatch(s -> s.contains("search your library") && !isTextContainsLandCard(s))
|
||||
)
|
||||
.map(Card::getName)
|
||||
.sorted()
|
||||
.forEach(this.foundTutors::add);
|
||||
}
|
||||
|
||||
private boolean isTextContainsLandCard(String lowerText) {
|
||||
// TODO: share code with AbstractCommander and edh power level
|
||||
// TODO: add tests
|
||||
|
|
|
|||
|
|
@ -21,6 +21,19 @@ public final class Constants {
|
|||
}
|
||||
|
||||
public static final ImmutableList<Pair<String, String[]>> foulMagicsSets = ImmutableList.of(
|
||||
new Pair<String, String[]>("Set 3 - Old Fat Men", new String[] {
|
||||
"Ninth Edition",
|
||||
"Tenth Edition",
|
||||
"* Time Spiral Block",
|
||||
"* Lorwyn Block",
|
||||
"* Shards of Alara Block",
|
||||
"Scars of Mirrodin",
|
||||
"Zendikar",
|
||||
"Rise of the Eldrazi",
|
||||
"Worldwake",
|
||||
"* Innistrad Block",
|
||||
"Foul Magic Block 3 Extras"
|
||||
}),
|
||||
new Pair<String, String[]>("Set 2.5 - Ravnica Cultural Exchange", new String[] {
|
||||
"* March of the Machine Block",
|
||||
"* Phyrexia: All Will Be One Block",
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ public class TaggerModel extends AbstractTableModel {
|
|||
private int recentSortedColumn;
|
||||
private boolean recentAscending;
|
||||
private Runnable doSort;
|
||||
private int whitelistCount = 0;
|
||||
|
||||
|
||||
public TaggerModel(Runnable sortFn) {
|
||||
|
|
@ -46,14 +47,21 @@ public class TaggerModel extends AbstractTableModel {
|
|||
placeholder.id = "";
|
||||
placeholder.description = "Please download Scryfall tags from the 'download' tab & reopen";
|
||||
placeholder.label = "Data missing!";
|
||||
view.add(placeholder);
|
||||
|
||||
Tag placeholder2 = new Tag();
|
||||
placeholder2.id = "";
|
||||
placeholder2.description = "You may need do a Scryfall download to associate IDs";
|
||||
placeholder2.label = "Also!";
|
||||
view.add(placeholder2);
|
||||
}
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
view = TagRepository.instance.getAllTags();
|
||||
filtered.clear();
|
||||
this.whitelist.clear();
|
||||
this.blacklist.clear();
|
||||
fireTableDataChanged();
|
||||
doSort.run();
|
||||
}
|
||||
|
||||
|
|
@ -183,17 +191,32 @@ public class TaggerModel extends AbstractTableModel {
|
|||
|
||||
public Set<String> buildWhitelist() {
|
||||
whitelist.clear();
|
||||
whitelistCount = 0;
|
||||
// whitelists are a bit weird, each one needs to reduce the next
|
||||
Set<String> temp = new HashSet<String>();
|
||||
|
||||
boolean fresh = true;
|
||||
|
||||
for (String key : filtered.keySet()) {
|
||||
temp.clear();
|
||||
if (filtered.get(key)) {
|
||||
whitelistCount++;
|
||||
for (CardInfo card : TagRepository.instance.getCardsByTagId(key)) {
|
||||
whitelist.add(card.getName());
|
||||
temp.add(card.getName());
|
||||
}
|
||||
if (fresh) {
|
||||
whitelist.addAll(temp);
|
||||
} else {
|
||||
whitelist.retainAll(temp);
|
||||
}
|
||||
fresh = false;
|
||||
}
|
||||
}
|
||||
|
||||
return whitelist;
|
||||
}
|
||||
|
||||
|
||||
public Set<String> buildBlacklist() {
|
||||
blacklist.clear();
|
||||
for (String key : filtered.keySet()) {
|
||||
|
|
|
|||
|
|
@ -2120,6 +2120,9 @@
|
|||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="txtBackgroundImagePath">
|
||||
<Properties>
|
||||
<Property name="toolTipText" type="java.lang.String" value="The selected image will be used as the background picture. Requires client restart to see changes."/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="btnBrowseBackgroundImage">
|
||||
<Properties>
|
||||
|
|
@ -2259,16 +2262,13 @@
|
|||
<SubComponents>
|
||||
<Component class="javax.swing.JCheckBox" name="cbUseDefaultImageFolder">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" value="Use default location to save images"/>
|
||||
<Property name="text" type="java.lang.String" value="Use default location to save card images"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbUseDefaultImageFolderActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="txtImageFolderPath">
|
||||
<Properties>
|
||||
<Property name="toolTipText" type="java.lang.String" value="The selected image will be used as background picture. You have to restart MAGE to view a changed background image."/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="btnBrowseImageLocation">
|
||||
<Properties>
|
||||
|
|
|
|||
|
|
@ -2162,6 +2162,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
}
|
||||
});
|
||||
|
||||
txtBackgroundImagePath.setToolTipText("The selected image will be used as the background picture. Requires client restart to see changes.");
|
||||
|
||||
btnBrowseBackgroundImage.setText("Browse...");
|
||||
btnBrowseBackgroundImage.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
|
|
@ -2261,15 +2263,13 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
|
||||
panelCardImages.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEtchedBorder(), "Card images"));
|
||||
|
||||
cbUseDefaultImageFolder.setText("Use default location to save images");
|
||||
cbUseDefaultImageFolder.setText("Use default location to save card images");
|
||||
cbUseDefaultImageFolder.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
cbUseDefaultImageFolderActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
|
||||
txtImageFolderPath.setToolTipText("The selected image will be used as background picture. You have to restart MAGE to view a changed background image.");
|
||||
|
||||
btnBrowseImageLocation.setText("Browse...");
|
||||
btnBrowseImageLocation.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
|
|
@ -3523,7 +3523,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
dialog.txtImageFolderPath.setText(path);
|
||||
updateCache(KEY_CARD_IMAGES_PATH, path);
|
||||
}
|
||||
load(prefs, dialog.cbSaveToZipFiles, KEY_CARD_IMAGES_SAVE_TO_ZIP, "true");
|
||||
load(prefs, dialog.cbSaveToZipFiles, KEY_CARD_IMAGES_SAVE_TO_ZIP, "true", "false");
|
||||
dialog.cbPreferredImageLanguage.setSelectedItem(MageFrame.getPreferences().get(KEY_CARD_IMAGES_PREF_LANGUAGE, CardLanguage.ENGLISH.getCode()));
|
||||
|
||||
// rendering settings
|
||||
|
|
@ -3713,7 +3713,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
|
|||
}
|
||||
|
||||
public static boolean isSaveImagesToZip() {
|
||||
return PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_SAVE_TO_ZIP, "true").equals("true");
|
||||
return PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_IMAGES_SAVE_TO_ZIP, "false").equals("true");
|
||||
}
|
||||
|
||||
private static void load(Preferences prefs, JCheckBox checkBox, String propName, String yesValue) {
|
||||
|
|
|
|||
|
|
@ -1700,7 +1700,7 @@ public class TablesPanel extends javax.swing.JPanel {
|
|||
MatchOptions options = new MatchOptions(gameName, gameType, multiPlayer);
|
||||
options.getPlayerTypes().add(PlayerType.HUMAN);
|
||||
options.getPlayerTypes().add(aiType);
|
||||
for (int i=2 ; i < numPlayers ; i++) {
|
||||
for (int i = 2; i < numPlayers; i++) {
|
||||
options.getPlayerTypes().add(aiType);
|
||||
}
|
||||
options.setDeckType("Variant Magic - Freeform Commander");
|
||||
|
|
@ -1719,9 +1719,9 @@ public class TablesPanel extends javax.swing.JPanel {
|
|||
table = SessionHandler.createTable(roomId, options);
|
||||
|
||||
SessionHandler.joinTable(roomId, table.getTableId(), "Human", PlayerType.HUMAN, 1, testDeck, "");
|
||||
SessionHandler.joinTable(roomId, table.getTableId(), "Computer", aiType, 1, testDeck, "");
|
||||
for (int i=2 ; i < numPlayers ; i++) {
|
||||
SessionHandler.joinTable(roomId, table.getTableId(), "Computer" + i, aiType, 1, testDeck, "");
|
||||
SessionHandler.joinTable(roomId, table.getTableId(), "Computer" + (multiPlayer ? " 2" : ""), aiType, 1, testDeck, "");
|
||||
for (int i = 2; i < numPlayers; i++) {
|
||||
SessionHandler.joinTable(roomId, table.getTableId(), "Computer " + (i + 1), aiType, 1, testDeck, "");
|
||||
}
|
||||
SessionHandler.startMatch(roomId, table.getTableId());
|
||||
} catch (HeadlessException ex) {
|
||||
|
|
|
|||
|
|
@ -940,8 +940,13 @@ public abstract class CardPanel extends MagePermanent implements ComponentListen
|
|||
private void setGameCardSides(CardView gameCard) {
|
||||
if (this.cardSideMain == null) {
|
||||
// new card
|
||||
this.cardSideMain = gameCard;
|
||||
this.cardSideOther = gameCard.getSecondCardFace();
|
||||
if (gameCard instanceof PermanentView) {
|
||||
this.cardSideMain = gameCard;
|
||||
this.cardSideOther = gameCard.isTransformed() ? ((PermanentView) gameCard).getOriginal() : gameCard.getSecondCardFace();
|
||||
} else {
|
||||
this.cardSideMain = gameCard;
|
||||
this.cardSideOther = gameCard.getSecondCardFace();
|
||||
}
|
||||
} else {
|
||||
// updated card
|
||||
if (this.cardSideMain.getName().equals(gameCard.getName())) {
|
||||
|
|
|
|||
|
|
@ -109,11 +109,12 @@ public class GathererSets implements Iterable<DownloadJob> {
|
|||
"NEC", "YNEO", "NEO", "SNC", "NCC", "CLB", "2X2", "DMU", "DMC", "40K", "GN3",
|
||||
"UNF", "BRO", "BRC", "BOT", "J22", "DMR", "ONE", "ONC", "SCH",
|
||||
"MOM", "MOC", "MUL", "MAT", "LTR", "CMM", "WOE", "WHO", "RVR", "WOT",
|
||||
"WOC", "SPG", "LCI", "LCC", "REX", "PIP", "MKM", "MKC", "CLU", "OTJ",
|
||||
"WOC", "SPG", "LCI", "LCC", "REX", "PIP", "YMKM", "MKM", "MKC", "CLU", "OTJ",
|
||||
"OTC", "OTP", "BIG", "MH3", "M3C", "ACR", "BLB", "BLC", "DSK", "DSC",
|
||||
"MB2", "FDN", "INR", "J25", "DRC", "DFT", "TDC", "TDM", "FCA", "FIC",
|
||||
"FIN", "SIS", "SIR", "SLD", "AKR", "MD1", "ANB", "LTC", "BRR", "HA1",
|
||||
"HA2", "HA3", "HA4", "HA5", "ZNC", "EOE", "EOC", "SPE", "TLA", "EOS"
|
||||
"HA2", "HA3", "HA4", "HA5", "ZNC", "EOE", "EOC", "SPE", "TLA", "EOS",
|
||||
"MAR", "SPM"
|
||||
// "HHO", "ANA" -- do not exist on gatherer
|
||||
};
|
||||
|
||||
|
|
@ -181,6 +182,7 @@ public class GathererSets implements Iterable<DownloadJob> {
|
|||
codeReplacements.put("WTH", "WL");
|
||||
codeReplacements.put("YMID", "Y22");
|
||||
codeReplacements.put("YNEO", "Y22NEO");
|
||||
|
||||
}
|
||||
|
||||
public GathererSets() {
|
||||
|
|
|
|||
|
|
@ -2,10 +2,16 @@ package org.mage.plugins.card.dl.sources;
|
|||
|
||||
import org.tritonus.share.ArraySet;
|
||||
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.CardWithHalves;
|
||||
import mage.cards.ExpansionSet;
|
||||
import mage.cards.Sets;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
|
|
@ -28,6 +34,8 @@ public class ScryfallImageSupportCards {
|
|||
add("2ED"); // Unlimited Edition
|
||||
//add("CEI"); // Intl. Collectors’ Edition
|
||||
//add("CED"); // Collectors’ Edition
|
||||
add("RIN"); // Rinascimento
|
||||
add("REN"); // Renaissance
|
||||
add("ARN"); // Arabian Nights
|
||||
add("ATQ"); // Antiquities
|
||||
//add("FBB"); // Foreign Black Border
|
||||
|
|
@ -465,6 +473,7 @@ public class ScryfallImageSupportCards {
|
|||
// add("MD1"); // Modern Event Deck
|
||||
// add("DD3"); // Duel Decks Anthology
|
||||
// add("PZ1"); // Legendary Cube
|
||||
add("PLG20"); // Love Your LGS 2020
|
||||
add("IKO"); // Ikoria: Lair of Behemoths
|
||||
add("C20"); // Commander 2020
|
||||
add("M21"); // Core Set 2021
|
||||
|
|
@ -514,11 +523,13 @@ public class ScryfallImageSupportCards {
|
|||
add("NCC"); // New Capenna Commander
|
||||
add("SLX"); // Universes Within
|
||||
add("CLB"); // Commander Legends: Battle for Baldur's Gate
|
||||
add("PLG22"); // Love Your LGS 2022
|
||||
add("2X2"); // Double Masters 2022
|
||||
add("SCH"); // Store Championships
|
||||
add("DMU"); // Dominaria United
|
||||
add("DMC"); // Dominaria United Commander
|
||||
add("YDMU"); // Alchemy: Dominaria
|
||||
add("PRCQ"); // Regional Championship Qualifiers 2022
|
||||
add("40K"); // Warhammer 40,000 Commander
|
||||
add("UNF"); // Unfinity
|
||||
add("GN3"); // Game Night: Free-for-All
|
||||
|
|
@ -530,7 +541,7 @@ public class ScryfallImageSupportCards {
|
|||
add("SCD"); // Starter Commander Decks
|
||||
add("PW23"); // Wizards Play Network 2023
|
||||
add("P23"); // Judge Gift Cards 2023
|
||||
add("SLC"); // Secret Lair 30th Anniversary Countdown Kit
|
||||
add("SLC"); // Secret Lair Countdown
|
||||
add("DMR"); // Dominaria Remastered
|
||||
add("ONE"); // Phyrexia: All Will Be One
|
||||
add("ONC"); // Phyrexia: All Will Be One Commander
|
||||
|
|
@ -546,9 +557,11 @@ public class ScryfallImageSupportCards {
|
|||
add("30A"); // 30th Anniversary Edition
|
||||
add("P30A"); // 30th Anniversary Play Promos
|
||||
add("P30M"); // 30th Anniversary Misc Promos
|
||||
add("P30H"); // 30th Anniversary History Promos
|
||||
add("PEWK"); // Eternal Weekend
|
||||
add("LTR"); // The Lord of the Rings: Tales of Middle-Earth
|
||||
add("LTC"); // Tales of Middle-Earth Commander
|
||||
add("PF23"); // MagicFest 2023
|
||||
add("CMM"); // Commander Masters
|
||||
add("WHO"); // Doctor Who
|
||||
add("WOE"); // Wilds of Eldraine
|
||||
|
|
@ -559,10 +572,14 @@ public class ScryfallImageSupportCards {
|
|||
add("REX"); // Jurassic World Collection
|
||||
add("SPG"); // Special Guests
|
||||
add("PW24"); // Wizards Play Network 2024
|
||||
add("PF24"); // MagicFest 2024
|
||||
add("RVR"); // Ravnica Remastered
|
||||
add("PL24"); // Year of the Dragon 2024
|
||||
add("PIP"); // Fallout
|
||||
add("YMKM"); // Alchemy: Murders at Karlov Manor
|
||||
add("MKM"); // Murders at Karlov Manor
|
||||
add("MKC"); // Murders at Karlov Manor Commander
|
||||
add("PSS4"); // MKM Standard Showdown
|
||||
add("CLU"); // Ravnica: Clue Edition
|
||||
add("OTJ"); // Outlaws of Thunder Junction
|
||||
add("OTC"); // Outlaws of Thunder Junction Commander
|
||||
|
|
@ -574,6 +591,7 @@ public class ScryfallImageSupportCards {
|
|||
add("ACR"); // Assassin's Creed
|
||||
add("BLB"); // Bloomburrow
|
||||
add("BLC"); // Bloomburrow Commander
|
||||
add("PLG24"); // Love Your LGS 2024
|
||||
add("PCBB"); // Cowboy Bebop
|
||||
add("MB2"); // Mystery Booster 2
|
||||
add("DSK"); // Duskmourn: House of Horror
|
||||
|
|
@ -585,6 +603,7 @@ public class ScryfallImageSupportCards {
|
|||
add("PSPL"); // Spotlight Series
|
||||
add("INR"); // Innistrad Remastered
|
||||
add("PF25"); // MagicFest 2025
|
||||
add("PL25"); // Year of the Snake 2025
|
||||
add("DFT"); // Aetherdrift
|
||||
add("DRC"); // Aetherdrift Commander
|
||||
add("PLG25"); // Love Your LGS 2025
|
||||
|
|
@ -599,11 +618,19 @@ public class ScryfallImageSupportCards {
|
|||
add("EOS"); // Edge of Eternities: Stellar Sights
|
||||
add("SPM"); // Marvel's Spider-Man
|
||||
add("SPE"); // Marvel's Spider-Man Eternal
|
||||
add("LMAR"); // Marvel Legends Series Inserts
|
||||
add("MAR"); // Marvel Universe
|
||||
add("TLA"); // Avatar: The Last Airbender
|
||||
add("TLE"); // Avatar: The Last Airbender Eternal
|
||||
add("ECL"); // Lorwyn Eclipsed
|
||||
add("TMT"); // Teenage Mutant Ninja Turtles
|
||||
add("TMC"); // Teenage Mutant Ninja Turtles Eternal
|
||||
|
||||
// Custom sets using Scryfall images - must provide a direct link for each card in directDownloadLinks
|
||||
add("CALC"); // Custom Alchemized versions of existing cards
|
||||
|
||||
// Foul Magics sets
|
||||
add("FMB3E");
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -701,6 +728,7 @@ public class ScryfallImageSupportCards {
|
|||
put("SLD/Sol Ring/1512b", "https://api.scryfall.com/cards/sld/1512/en?format=image&face=back");
|
||||
put("SLD/Steely Resolve/1326b", "https://api.scryfall.com/cards/sld/1326/en?format=image&face=back");
|
||||
put("SLD/Stitch in Time/382b", "https://api.scryfall.com/cards/sld/382/en?format=image&face=back");
|
||||
put("SLD/Teferi's Ageless Insight/2214b", "https://api.scryfall.com/cards/sld/2214/en?format=image&face=back");
|
||||
put("SLD/Terror/750b", "https://api.scryfall.com/cards/sld/750/en?format=image&face=back");
|
||||
put("SLD/Tuvasa the Sunlit/1328b", "https://api.scryfall.com/cards/sld/1328/en?format=image&face=back");
|
||||
put("SLD/Ulamog, the Ceaseless Hunger/1122b", "https://api.scryfall.com/cards/sld/1122/en?format=image&face=back");
|
||||
|
|
@ -743,6 +771,32 @@ public class ScryfallImageSupportCards {
|
|||
put("TDM/Scavenger Regent/379b", "https://api.scryfall.com/cards/tdm/379/en?format=image&face=back");
|
||||
put("TDM/Ugin, Eye of the Storms/382b", "https://api.scryfall.com/cards/tdm/382/en?format=image&face=back");
|
||||
|
||||
for (ExpansionSet set : Sets.getInstance().values()) {
|
||||
for (Integer key : set.cardAliases.keySet()) {
|
||||
var value = set.cardAliases.get(key);
|
||||
|
||||
put(
|
||||
String.format("%s/%s/%s", set.getCode(), value.cardInfo.getName(), value.cardInfo.getCardNumber()),
|
||||
String.format("https://api.scryfall.com/cards/%s/%s/en?face=front&format=image", value.targetSet.toLowerCase(), value.targetSetNumber)
|
||||
);
|
||||
if (CardWithHalves.class.isAssignableFrom(value.cardInfo.getCardClass())) {
|
||||
try {
|
||||
UUID uid = UUID.randomUUID();
|
||||
CardSetInfo info = new CardSetInfo(set.getName(), set.getCode(), value.targetSet, value.cardInfo.getRarity());
|
||||
CardWithHalves backCard = (CardWithHalves) value.cardInfo.getCardClass().getDeclaredConstructor(UUID.class, CardSetInfo.class).newInstance(
|
||||
uid, info);
|
||||
|
||||
put(
|
||||
String.format("%s/%s/%s", set.getCode(), backCard.getRightHalfCard().getName(), value.cardInfo.getCardNumber()),
|
||||
String.format("https://api.scryfall.com/cards/%s/%s/en?face=back", value.targetSet.toLowerCase(), value.targetSetNumber)
|
||||
);
|
||||
} catch (Exception e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -766,6 +820,7 @@ public class ScryfallImageSupportCards {
|
|||
if (directDownloadLinks.containsKey(linkCode2)) {
|
||||
return linkCode2;
|
||||
}
|
||||
|
||||
|
||||
// default
|
||||
return null;
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
package org.mage.plugins.card.dl.sources;
|
||||
|
||||
import mage.cards.repository.TokenRepository;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import mage.cards.repository.TokenRepository;
|
||||
|
||||
/**
|
||||
* @author JayDi85
|
||||
*/
|
||||
|
|
@ -817,10 +817,13 @@ public class ScryfallImageSupportTokens {
|
|||
|
||||
// SLD
|
||||
put("SLD/Angel", "https://api.scryfall.com/cards/sld/1340?format=image");
|
||||
put("SLD/Blood", "https://api.scryfall.com/cards/sld/2180?format=image");
|
||||
put("SLD/Cat/1", "https://api.scryfall.com/cards/sld/1517?format=image");
|
||||
put("SLD/Cat/2", "https://api.scryfall.com/cards/sld/27?format=image");
|
||||
put("SLD/Cat/3", "https://api.scryfall.com/cards/sld/28?format=image");
|
||||
put("SLD/Clue", "https://api.scryfall.com/cards/sld/348/en?format=image");
|
||||
put("SLD/Cordyceps Infected/1", "https://api.scryfall.com/cards/sld/2201?format=image");
|
||||
put("SLD/Cordyceps Infected/2", "https://api.scryfall.com/cards/sld/2206?format=image");
|
||||
put("SLD/Dog", "https://api.scryfall.com/cards/sld/1516?format=image");
|
||||
put("SLD/Egg", "https://api.scryfall.com/cards/sld/1398?format=image");
|
||||
put("SLD/Faerie Rogue/1", "https://api.scryfall.com/cards/sld/13/en?format=image");
|
||||
|
|
@ -2221,7 +2224,7 @@ public class ScryfallImageSupportTokens {
|
|||
put("WHO/Treasure/2", "https://api.scryfall.com/cards/twho/29?format=image");
|
||||
put("WHO/Treasure/3", "https://api.scryfall.com/cards/twho/30?format=image");
|
||||
put("WHO/Treasure/4", "https://api.scryfall.com/cards/twho/31?format=image");
|
||||
put("WHO/Warrior", "https://api.scryfall.com/cards/twho/9?format=image");
|
||||
put("WHO/Warrior", "https://api.scryfall.com/cards/twho/9?format=image");
|
||||
|
||||
// 8ED
|
||||
put("8ED/Bird", "https://api.scryfall.com/cards/p03/7/en?format=image");
|
||||
|
|
@ -2398,7 +2401,7 @@ public class ScryfallImageSupportTokens {
|
|||
put("OTP/Human Warrior", "https://api.scryfall.com/cards/totp/3/en?format=image");
|
||||
put("OTP/Pest", "https://api.scryfall.com/cards/totp/4/en?format=image");
|
||||
|
||||
// SCD
|
||||
// SCD
|
||||
put("SCD/Beast", "https://api.scryfall.com/cards/tscd/19/en?format=image");
|
||||
put("SCD/Bird", "https://api.scryfall.com/cards/tscd/2/en?format=image");
|
||||
put("SCD/Cat", "https://api.scryfall.com/cards/tscd/3/en?format=image");
|
||||
|
|
@ -2546,6 +2549,7 @@ public class ScryfallImageSupportTokens {
|
|||
|
||||
// DSK
|
||||
put("DSK/Beast", "https://api.scryfall.com/cards/tdsk/3?format=image");
|
||||
put("DSK/Demon", "https://api.scryfall.com/cards/tdsk/9?format=image");
|
||||
put("DSK/Emblem Kaito", "https://api.scryfall.com/cards/tdsk/17/en?format=image");
|
||||
put("DSK/Everywhere", "https://api.scryfall.com/cards/tdsk/16?format=image");
|
||||
put("DSK/Glimmer", "https://api.scryfall.com/cards/tdsk/4?format=image");
|
||||
|
|
@ -2558,6 +2562,7 @@ public class ScryfallImageSupportTokens {
|
|||
put("DSK/Spider", "https://api.scryfall.com/cards/tdsk/12?format=image");
|
||||
put("DSK/Spirit/1", "https://api.scryfall.com/cards/tdsk/6?format=image");
|
||||
put("DSK/Spirit/2", "https://api.scryfall.com/cards/tdsk/8?format=image");
|
||||
put("DSK/Toy", "https://api.scryfall.com/cards/tdsk/7?format=image");
|
||||
put("DSK/Treasure", "https://api.scryfall.com/cards/tdsk/15?format=image");
|
||||
|
||||
// DSC
|
||||
|
|
@ -2738,7 +2743,7 @@ public class ScryfallImageSupportTokens {
|
|||
put("ACR/Treasure", "https://api.scryfall.com/cards/tacr/6?format=image");
|
||||
|
||||
// DD2
|
||||
put("DD2/Elemental Shaman", "https://api.scryfall.com/cards/tdd2/1?format=image");
|
||||
put("DD2/Elemental Shaman", "https://api.scryfall.com/cards/tdd2/1?format=image");
|
||||
|
||||
// FIN
|
||||
put("FIN/Hero/1", "https://api.scryfall.com/cards/tfin/2/en?format=image");
|
||||
|
|
@ -2818,6 +2823,43 @@ public class ScryfallImageSupportTokens {
|
|||
put("EOC/Shapeshifter", "https://api.scryfall.com/cards/teoc/2/en?format=image");
|
||||
put("EOC/Thopter", "https://api.scryfall.com/cards/teoc/16/en?format=image");
|
||||
|
||||
// SPM
|
||||
put("SPM/Food", "https://api.scryfall.com/cards/tspm/5?format=image");
|
||||
put("SPM/Human", "https://api.scryfall.com/cards/tspm/4?format=image");
|
||||
put("SPM/Illusion", "https://api.scryfall.com/cards/tspm/2?format=image");
|
||||
put("SPM/Robot", "https://api.scryfall.com/cards/tspm/6?format=image");
|
||||
put("SPM/Spider", "https://api.scryfall.com/cards/tspm/3?format=image");
|
||||
put("SPM/Treasure", "https://api.scryfall.com/cards/tspm/7?format=image");
|
||||
|
||||
// TLA
|
||||
put("TLA/Ally/1", "https://api.scryfall.com/cards/ttla/4/?format=image");
|
||||
put("TLA/Ally/2", "https://api.scryfall.com/cards/ttla/5/?format=image");
|
||||
put("TLA/Ally/3", "https://api.scryfall.com/cards/ttla/6/?format=image");
|
||||
put("TLA/Ally/4", "https://api.scryfall.com/cards/ttla/7/?format=image");
|
||||
put("TLA/Ally/5", "https://api.scryfall.com/cards/ttla/8/?format=image");
|
||||
put("TLA/Ballistic Boulder", "https://api.scryfall.com/cards/ttla/13/?format=image");
|
||||
put("TLA/Bear", "https://api.scryfall.com/cards/ttla/12/?format=image");
|
||||
put("TLA/Clue/1", "https://api.scryfall.com/cards/ttla/14/?format=image");
|
||||
put("TLA/Clue/2", "https://api.scryfall.com/cards/ttla/15/?format=image");
|
||||
put("TLA/Clue/3", "https://api.scryfall.com/cards/ttla/16/?format=image");
|
||||
put("TLA/Clue/4", "https://api.scryfall.com/cards/ttla/17/?format=image");
|
||||
put("TLA/Clue/5", "https://api.scryfall.com/cards/ttla/18/?format=image");
|
||||
put("TLA/Dragon", "https://api.scryfall.com/cards/ttla/9/?format=image");
|
||||
put("TLA/Food/1", "https://api.scryfall.com/cards/ttla/19/?format=image");
|
||||
put("TLA/Food/2", "https://api.scryfall.com/cards/ttla/20/?format=image");
|
||||
put("TLA/Food/3", "https://api.scryfall.com/cards/ttla/21/?format=image");
|
||||
put("TLA/Monk", "https://api.scryfall.com/cards/ttla/10/?format=image");
|
||||
put("TLA/Soldier", "https://api.scryfall.com/cards/ttla/11/?format=image");
|
||||
put("TLA/Spirit", "https://api.scryfall.com/cards/ttla/3/?format=image");
|
||||
put("TLA/Treasure", "https://api.scryfall.com/cards/ttla/22?format=image");
|
||||
|
||||
// TLE
|
||||
put("TLE/Marit Lage", "https://api.scryfall.com/cards/ttle/1/?format=image");
|
||||
put("TLE/Soldier", "https://api.scryfall.com/cards/ttle/2?format=image");
|
||||
|
||||
// TMT
|
||||
put("TMT/Mutagen", "https://api.scryfall.com/cards/ttmt/9?format=image");
|
||||
|
||||
// JVC
|
||||
put("JVC/Elemental Shaman", "https://api.scryfall.com/cards/tjvc/4?format=image");
|
||||
|
||||
|
|
@ -2931,6 +2973,12 @@ public class ScryfallImageSupportTokens {
|
|||
// PL23
|
||||
put("PL23/Food", "https://api.scryfall.com/cards/pl23/2?format=image");
|
||||
|
||||
// PL24
|
||||
put("PL24/Dragon", "https://api.scryfall.com/cards/pl24/3?format=image");
|
||||
|
||||
// PL25
|
||||
put("PL25/Snake", "https://api.scryfall.com/cards/pl25/2?format=image");
|
||||
|
||||
// generate supported sets
|
||||
supportedSets.clear();
|
||||
for (String cardName : this.keySet()) {
|
||||
|
|
|
|||
|
|
@ -558,12 +558,12 @@ public class DownloadPicturesService extends DefaultBoundedRangeModel implements
|
|||
);
|
||||
allCardsUrls.add(url);
|
||||
}
|
||||
if (card.isModalDoubleFacedCard()) {
|
||||
if (card.getModalDoubleFacedSecondSideName() == null || card.getModalDoubleFacedSecondSideName().trim().isEmpty()) {
|
||||
if (card.isDoubleFacedCard()) {
|
||||
if (card.getDoubleFacedSecondSideName() == null || card.getDoubleFacedSecondSideName().trim().isEmpty()) {
|
||||
throw new IllegalStateException("MDF card can't have empty name.");
|
||||
}
|
||||
CardDownloadData cardDownloadData = new CardDownloadData(
|
||||
card.getModalDoubleFacedSecondSideName(),
|
||||
card.getDoubleFacedSecondSideName(),
|
||||
card.getSetCode(),
|
||||
card.getCardNumber(),
|
||||
card.usesVariousArt(),
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ public class ThemePluginImpl implements ThemePlugin {
|
|||
}
|
||||
|
||||
if (ui.containsKey("gamePanel") && ui.containsKey("jLayeredPane")) {
|
||||
ImagePanel bgPanel = new ImagePanel(backgroundImage, ImagePanelStyle.TILED);
|
||||
ImagePanel bgPanel = new ImagePanel(backgroundImage, ImagePanelStyle.COVER);
|
||||
|
||||
// TODO: research - is all components used? And why it make transparent?
|
||||
unsetOpaque(ui.get("splitChatAndLogs"));
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-common</artifactId>
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ public class ImagePanel extends JPanel {
|
|||
case ACTUAL:
|
||||
drawActual(g);
|
||||
break;
|
||||
case COVER:
|
||||
drawCover(g);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -99,4 +102,25 @@ public class ImagePanel extends JPanel {
|
|||
float y = (d.height - image.getHeight(null)) * alignmentY;
|
||||
g.drawImage(image, (int) x, (int) y, this);
|
||||
}
|
||||
|
||||
private void drawCover(Graphics g) {
|
||||
Dimension d = getSize();
|
||||
int imageWidth = image.getWidth(null);
|
||||
int imageHeight = image.getHeight(null);
|
||||
|
||||
// Calculate scale to cover the entire panel while maintaining aspect ratio
|
||||
double scaleX = (double) d.width / imageWidth;
|
||||
double scaleY = (double) d.height / imageHeight;
|
||||
double scale = Math.max(scaleX, scaleY);
|
||||
|
||||
// Calculate the scaled dimensions
|
||||
int scaledWidth = (int) (imageWidth * scale);
|
||||
int scaledHeight = (int) (imageHeight * scale);
|
||||
|
||||
// Center the image
|
||||
int x = (d.width - scaledWidth) / 2;
|
||||
int y = (d.height - scaledHeight) / 2;
|
||||
|
||||
g.drawImage(image, x, y, scaledWidth, scaledHeight, null);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@ package mage.components;
|
|||
* Created by IGOUDT on 7-3-2017.
|
||||
*/
|
||||
public enum ImagePanelStyle {
|
||||
TILED, SCALED, ACTUAL
|
||||
TILED, SCALED, ACTUAL, COVER
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ public class MageVersion implements Serializable, Comparable<MageVersion> {
|
|||
// * launcher gives priority to 1.4.48 instead 1.4.48-any-text, so don't use empty release info
|
||||
public static final int MAGE_VERSION_MAJOR = 1;
|
||||
public static final int MAGE_VERSION_MINOR = 4;
|
||||
public static final int MAGE_VERSION_RELEASE = 57;
|
||||
public static final String MAGE_VERSION_RELEASE_INFO = "V2"; // V1, V1a, V1b for releases; V1-beta3, V1-beta4 for betas
|
||||
public static final int MAGE_VERSION_RELEASE = 58;
|
||||
public static final String MAGE_VERSION_RELEASE_INFO = "V1"; // V1, V1a, V1b for releases; V1-beta3, V1-beta4 for betas
|
||||
|
||||
// strict mode
|
||||
// Each update requires a strict version
|
||||
|
|
|
|||
|
|
@ -601,14 +601,13 @@ public final class SystemUtil {
|
|||
continue;
|
||||
}
|
||||
|
||||
Optional<Player> playerOptional = findPlayer(game, command.player);
|
||||
if (!playerOptional.isPresent()) {
|
||||
Player player = findPlayer(game, command.player, feedbackPlayer);
|
||||
if (player == null) {
|
||||
String mes = String.format("Unknown player: %s", line);
|
||||
errorsList.add(mes);
|
||||
logger.warn(mes);
|
||||
continue;
|
||||
}
|
||||
Player player = playerOptional.get();
|
||||
|
||||
// SPECIAL token/emblem call (without SET name)
|
||||
if ("token".equalsIgnoreCase(command.zone)) {
|
||||
|
|
@ -860,17 +859,54 @@ public final class SystemUtil {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find player by name.
|
||||
*
|
||||
* @param game
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
private static Optional<Player> findPlayer(Game game, String name) {
|
||||
return game.getPlayers().values().stream()
|
||||
.filter(player -> player.getName().equals(name)).findFirst();
|
||||
private static Player findPlayer(Game game, String needName, Player feedbackPlayer) {
|
||||
// real names
|
||||
Player res = game.getPlayerList().stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(player -> player.getName().equals(needName))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
||||
// test names - cheat commands will be compatible in both modes (quick test and normal)
|
||||
if (res == null) {
|
||||
switch (needName.toLowerCase(Locale.ENGLISH)) {
|
||||
case "me":
|
||||
case "human":
|
||||
case "human 1":
|
||||
res = feedbackPlayer;
|
||||
break;
|
||||
case "opponent":
|
||||
case "opponent 1":
|
||||
case "computer":
|
||||
case "computer 1": // multiplayer game uses Computer 2+ naming
|
||||
case "ai":
|
||||
case "ai 1":
|
||||
// try AI
|
||||
res = game.getPlayerList().stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(Player::isInGame)
|
||||
.filter(Player::isComputer)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (res == null) {
|
||||
// try opponent (human only games)
|
||||
res = game.getOpponents(feedbackPlayer.getId(), true).stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.filter(Player::isInGame)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// raise error message due unknown player name
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
public static String sanitize(String input) {
|
||||
|
|
|
|||
|
|
@ -27,11 +27,13 @@ import mage.counters.Counter;
|
|||
import mage.counters.CounterType;
|
||||
import mage.designations.Designation;
|
||||
import mage.filter.FilterMana;
|
||||
import mage.game.ControllableOrOwnerable;
|
||||
import mage.game.Game;
|
||||
import mage.game.command.Dungeon;
|
||||
import mage.game.command.Emblem;
|
||||
import mage.game.command.Plane;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.PermanentCard;
|
||||
import mage.game.permanent.PermanentToken;
|
||||
import mage.game.permanent.token.Token;
|
||||
import mage.game.stack.Spell;
|
||||
|
|
@ -115,7 +117,7 @@ public class CardView extends SimpleCardView {
|
|||
protected List<String> rightSplitRules;
|
||||
protected String rightSplitTypeLine;
|
||||
|
||||
protected boolean isModalDoubleFacedCard;
|
||||
protected boolean isDoubleFacedCard;
|
||||
|
||||
protected ArtRect artRect = ArtRect.NORMAL;
|
||||
|
||||
|
|
@ -237,7 +239,7 @@ public class CardView extends SimpleCardView {
|
|||
this.rightSplitRules = cardView.rightSplitRules == null ? null : new ArrayList<>(cardView.rightSplitRules);
|
||||
this.rightSplitTypeLine = cardView.rightSplitTypeLine;
|
||||
|
||||
this.isModalDoubleFacedCard = cardView.isModalDoubleFacedCard;
|
||||
this.isDoubleFacedCard = cardView.isDoubleFacedCard;
|
||||
|
||||
this.artRect = cardView.artRect;
|
||||
this.targets = cardView.targets == null ? null : new ArrayList<>(cardView.targets);
|
||||
|
|
@ -427,12 +429,18 @@ public class CardView extends SimpleCardView {
|
|||
this.manaCostLeftStr = splitCard.getLeftHalfCard().getManaCostSymbols();
|
||||
this.manaCostRightStr = splitCard.getRightHalfCard().getManaCostSymbols();
|
||||
} else if (card instanceof ModalDoubleFacedCard) {
|
||||
this.isModalDoubleFacedCard = true;
|
||||
ModalDoubleFacedCard mainCard = ((ModalDoubleFacedCard) card);
|
||||
this.isDoubleFacedCard = true;
|
||||
DoubleFacedCard mainCard = ((DoubleFacedCard) card);
|
||||
fullCardName = mainCard.getLeftHalfCard().getName() + MockCard.MODAL_DOUBLE_FACES_NAME_SEPARATOR + mainCard.getRightHalfCard().getName();
|
||||
this.manaCostLeftStr = mainCard.getLeftHalfCard().getManaCostSymbols();
|
||||
this.manaCostRightStr = mainCard.getRightHalfCard().getManaCostSymbols();
|
||||
} else if (card instanceof CardWithSpellOption) {
|
||||
} else if (card instanceof TransformingDoubleFacedCard) {
|
||||
this.isDoubleFacedCard = true;
|
||||
DoubleFacedCard mainCard = ((DoubleFacedCard) card);
|
||||
fullCardName = mainCard.getLeftHalfCard().getName() + MockCard.MODAL_DOUBLE_FACES_NAME_SEPARATOR + mainCard.getRightHalfCard().getName();
|
||||
this.manaCostLeftStr = mainCard.getLeftHalfCard().getManaCostSymbols();
|
||||
this.manaCostRightStr = new ArrayList<>();
|
||||
} else if (card instanceof CardWithSpellOption) {
|
||||
this.isSplitCard = true;
|
||||
CardWithSpellOption mainCard = ((CardWithSpellOption) card);
|
||||
leftSplitName = mainCard.getName();
|
||||
|
|
@ -530,13 +538,21 @@ public class CardView extends SimpleCardView {
|
|||
|
||||
this.extraDeckCard = card.isExtraDeckCard();
|
||||
|
||||
// TODO: can probably remove this after tdfc rework
|
||||
// transformable, double faces cards
|
||||
this.transformable = card.isTransformable();
|
||||
if (!(sourceCard.getMainCard() instanceof DoubleFacedCard)) {
|
||||
this.transformable = card.isTransformable();
|
||||
|
||||
Card secondSideCard = card.getSecondCardFace();
|
||||
if (secondSideCard != null) {
|
||||
Card secondSideCard = card.getSecondCardFace();
|
||||
if (secondSideCard != null) {
|
||||
this.secondCardFace = new CardView(secondSideCard, game);
|
||||
this.alternateName = secondCardFace.getName();
|
||||
}
|
||||
} else if (card instanceof PermanentCard && card.isTransformable()) {
|
||||
this.transformable = card.isTransformable();
|
||||
Card secondSideCard = (Card) ((PermanentCard) card).getOtherFace();
|
||||
this.secondCardFace = new CardView(secondSideCard, game);
|
||||
this.alternateName = secondCardFace.getName();
|
||||
this.alternateName = secondSideCard.getName();
|
||||
}
|
||||
|
||||
this.flipCard = card.isFlipCard();
|
||||
|
|
@ -544,11 +560,11 @@ public class CardView extends SimpleCardView {
|
|||
this.alternateName = card.getFlipCardName();
|
||||
}
|
||||
|
||||
if (card instanceof ModalDoubleFacedCard) {
|
||||
if (card instanceof DoubleFacedCard) {
|
||||
this.transformable = true; // enable GUI day/night button
|
||||
ModalDoubleFacedCard mdfCard = (ModalDoubleFacedCard) card;
|
||||
this.secondCardFace = new CardView(mdfCard.getRightHalfCard(), game);
|
||||
this.alternateName = mdfCard.getRightHalfCard().getName();
|
||||
DoubleFacedCard doubleFacedCard = (DoubleFacedCard) card;
|
||||
this.secondCardFace = new CardView(doubleFacedCard.getRightHalfCard(), game);
|
||||
this.alternateName = doubleFacedCard.getRightHalfCard().getName();
|
||||
}
|
||||
|
||||
Card meldsToCard = card.getMeldsToCard();
|
||||
|
|
@ -764,7 +780,11 @@ public class CardView extends SimpleCardView {
|
|||
String info;
|
||||
MageObject targetObject = game.getObject(t);
|
||||
if (targetObject != null) {
|
||||
info = targetObject.getIdName();
|
||||
Player player = null;
|
||||
if (targetObject instanceof ControllableOrOwnerable) {
|
||||
player = game.getPlayer(((ControllableOrOwnerable) targetObject).getControllerOrOwnerId());
|
||||
}
|
||||
info = (player == null ? "" : player.getName() + ": ") + targetObject.getIdName();
|
||||
} else {
|
||||
Player targetPlayer = game.getPlayer(t);
|
||||
if (targetPlayer != null) {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-counter-plugin</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-plugins</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-reports</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-server-console</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-deck-constructed</artifactId>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ public abstract class AbstractCommander extends Constructed {
|
|||
|
||||
private static List<CommanderValidator> validators = Arrays.asList(
|
||||
PartnerValidator.instance,
|
||||
PartnerVariantValidator.instance,
|
||||
FriendsForeverValidator.instance,
|
||||
PartnerWithValidator.instance,
|
||||
ChooseABackgroundValidator.instance,
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ public class DuelCommander extends Commander {
|
|||
banned.add("Library of Alexandria");
|
||||
banned.add("Lion's Eye Diamond");
|
||||
banned.add("Lotus Petal");
|
||||
banned.add("Loyal Retainers");
|
||||
banned.add("Lutri, the Spellchaser");
|
||||
banned.add("Maddening Hex");
|
||||
banned.add("Mana Crypt");
|
||||
|
|
@ -93,8 +92,6 @@ public class DuelCommander extends Commander {
|
|||
|
||||
bannedCommander.add("Ajani, Nacatl Pariah");
|
||||
bannedCommander.add("Arahbo, Roar of the World");
|
||||
bannedCommander.add("Asmoranomardicadaistinaculdacar");
|
||||
bannedCommander.add("Baral, Chief of Compliance");
|
||||
bannedCommander.add("Breya, Etherium Shaper");
|
||||
bannedCommander.add("Derevi, Empyrial Tactician");
|
||||
bannedCommander.add("Dihada, Binder of Wills");
|
||||
|
|
@ -102,7 +99,6 @@ public class DuelCommander extends Commander {
|
|||
bannedCommander.add("Edric, Spymaster of Trest");
|
||||
bannedCommander.add("Emry, Lurker of the Loch");
|
||||
bannedCommander.add("Eris, Roar of the Storm");
|
||||
bannedCommander.add("Esior, Wardwing Familiar");
|
||||
bannedCommander.add("Ezio Auditore da Firenze");
|
||||
bannedCommander.add("Geist of Saint Traft");
|
||||
bannedCommander.add("Inalla, Archmage Ritualist");
|
||||
|
|
@ -116,7 +112,6 @@ public class DuelCommander extends Commander {
|
|||
bannedCommander.add("Omnath, Locus of Creation");
|
||||
bannedCommander.add("Prime Speaker Vannifar");
|
||||
bannedCommander.add("Raffine, Scheming Seer");
|
||||
bannedCommander.add("Rofellos, Llanowar Emissary");
|
||||
bannedCommander.add("Shorikai, Genesis Engine");
|
||||
bannedCommander.add("Tamiyo, Inquisitive Student");
|
||||
bannedCommander.add("Tasigur, the Golden Fang");
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ public class Legacy extends Constructed {
|
|||
banned.add("Dig Through Time");
|
||||
banned.add("Dreadhorde Arcanist");
|
||||
banned.add("Earthcraft");
|
||||
banned.add("Entomb");
|
||||
banned.add("Fastbond");
|
||||
banned.add("Flash");
|
||||
banned.add("Frantic Search");
|
||||
|
|
@ -56,6 +57,7 @@ public class Legacy extends Constructed {
|
|||
banned.add("Mox Ruby");
|
||||
banned.add("Mox Sapphire");
|
||||
banned.add("Mystical Tutor");
|
||||
banned.add("Nadu, Winged Wisdom");
|
||||
banned.add("Necropotence");
|
||||
banned.add("Oath of Druids");
|
||||
banned.add("Oko, Thief of Crowns");
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ public class Pauper extends Constructed {
|
|||
banned.add("Gitaxian Probe");
|
||||
banned.add("Grapeshot");
|
||||
banned.add("Gush");
|
||||
banned.add("High Tide");
|
||||
banned.add("Hymn to Tourach");
|
||||
banned.add("Invigorate");
|
||||
banned.add("Kuldotha Rebirth");
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ public class Pioneer extends Constructed {
|
|||
banned.add("Field of the Dead");
|
||||
banned.add("Flooded Strand");
|
||||
banned.add("Geological Appraiser");
|
||||
banned.add("Heartfire Hero");
|
||||
banned.add("Inverter of Truth");
|
||||
banned.add("Jegantha, the Wellspring");
|
||||
banned.add("Karn, the Great Creator");
|
||||
|
|
|
|||
|
|
@ -24,8 +24,11 @@ public class Standard extends Constructed {
|
|||
banned.add("Heartfire Hero");
|
||||
banned.add("Hopeless Nightmare");
|
||||
banned.add("Monstrous Rage");
|
||||
banned.add("Proft's Eidetic Memory");
|
||||
banned.add("Screaming Nemesis");
|
||||
banned.add("This Town Ain't Big Enough");
|
||||
banned.add("Up the Beanstalk");
|
||||
banned.add("Vivi Ornitier");
|
||||
}
|
||||
|
||||
static List<String> makeLegalSets() {
|
||||
|
|
|
|||
|
|
@ -206,9 +206,9 @@ public class TinyLeaders extends Constructed {
|
|||
if (card instanceof SplitCard) {
|
||||
costs.add(((SplitCard) card).getLeftHalfCard().getManaValue());
|
||||
costs.add(((SplitCard) card).getRightHalfCard().getManaValue());
|
||||
} else if (card instanceof ModalDoubleFacedCard) {
|
||||
costs.add(((ModalDoubleFacedCard) card).getLeftHalfCard().getManaValue());
|
||||
costs.add(((ModalDoubleFacedCard) card).getRightHalfCard().getManaValue());
|
||||
} else if (card instanceof DoubleFacedCard) {
|
||||
costs.add(((DoubleFacedCard) card).getLeftHalfCard().getManaValue());
|
||||
costs.add(((DoubleFacedCard) card).getRightHalfCard().getManaValue());
|
||||
} else {
|
||||
costs.add(card.getManaValue());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-deck-limited</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-brawlduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-brawlfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-canadianhighlanderduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-commanderduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-commanderfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-custompillaroftheparunsduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-freeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-freeformcommanderduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-freeformcommanderfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-freeformunlimitedcommander</artifactId>
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
<dependency>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-game-freeformcommanderfreeforall</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-momirduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-momirfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-oathbreakerduel</artifactId>
|
||||
|
|
@ -22,7 +22,7 @@
|
|||
<dependency>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-game-oathbreakerfreeforall</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-oathbreakerfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-pennydreadfulcommanderfreeforall</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-tinyleadersduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-game-twoplayerduel</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-player-ai-draftbot</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-player-ai-ma</artifactId>
|
||||
|
|
|
|||
|
|
@ -502,7 +502,7 @@ public class ComputerPlayer6 extends ComputerPlayer {
|
|||
}
|
||||
logger.warn("Possible freeze chain:");
|
||||
if (root != null && chain.isEmpty()) {
|
||||
logger.warn(" - unknown use case (too many possible targets?)"); // maybe can't finish any calc, maybe related to target options, I don't know
|
||||
logger.warn(" - unknown use case (too many possible targets?)"); // maybe can't finish any calc, maybe related to target options
|
||||
}
|
||||
chain.forEach(s -> {
|
||||
logger.warn(" - " + s);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-player-ai</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-player-ai-mcts</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-player-human</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-tournament-boosterdraft</artifactId>
|
||||
|
|
|
|||
|
|
@ -15,411 +15,455 @@ public class PauperCube extends DraftCube {
|
|||
public PauperCube() {
|
||||
super("The Pauper Cube", "", 2025, 5, 7);
|
||||
|
||||
cubeCards.add(new CardIdentity("Academy Journeymage", ""));
|
||||
cubeCards.add(new CardIdentity("Act of Treason", ""));
|
||||
cubeCards.add(new CardIdentity("Adventuring Gear", ""));
|
||||
cubeCards.add(new CardIdentity("Aerie Bowmasters", ""));
|
||||
cubeCards.add(new CardIdentity("Aerie Ouphes", ""));
|
||||
cubeCards.add(new CardIdentity("Aether Adept", ""));
|
||||
cubeCards.add(new CardIdentity("Abrade", ""));
|
||||
cubeCards.add(new CardIdentity("Abraded Bluffs", ""));
|
||||
cubeCards.add(new CardIdentity("Abundant Harvest", ""));
|
||||
cubeCards.add(new CardIdentity("Accursed Marauder", ""));
|
||||
cubeCards.add(new CardIdentity("Aerie Auxiliary", ""));
|
||||
cubeCards.add(new CardIdentity("Aether Chaser", ""));
|
||||
cubeCards.add(new CardIdentity("Aether Poisoner", ""));
|
||||
cubeCards.add(new CardIdentity("Aethersnipe", ""));
|
||||
cubeCards.add(new CardIdentity("Agony Warp", ""));
|
||||
cubeCards.add(new CardIdentity("Ambush Viper", ""));
|
||||
cubeCards.add(new CardIdentity("Angelic Purge", ""));
|
||||
cubeCards.add(new CardIdentity("Arachnus Web", ""));
|
||||
cubeCards.add(new CardIdentity("Arc Lightning", ""));
|
||||
cubeCards.add(new CardIdentity("Armillary Sphere", ""));
|
||||
cubeCards.add(new CardIdentity("Arrest", ""));
|
||||
cubeCards.add(new CardIdentity("Ash Barrens", ""));
|
||||
cubeCards.add(new CardIdentity("Ainok Bond-Kin", ""));
|
||||
cubeCards.add(new CardIdentity("Alabaster Host Intercessor", ""));
|
||||
cubeCards.add(new CardIdentity("Ambitious Assault", ""));
|
||||
cubeCards.add(new CardIdentity("Ancestral Blade", ""));
|
||||
cubeCards.add(new CardIdentity("Annoyed Altisaur", ""));
|
||||
cubeCards.add(new CardIdentity("Arbor Elf", ""));
|
||||
cubeCards.add(new CardIdentity("Archaeomancer", ""));
|
||||
cubeCards.add(new CardIdentity("Ardent Elementalist", ""));
|
||||
cubeCards.add(new CardIdentity("Ardenvale Tactician", ""));
|
||||
cubeCards.add(new CardIdentity("Armadillo Cloak", ""));
|
||||
cubeCards.add(new CardIdentity("Arms of Hadar", ""));
|
||||
cubeCards.add(new CardIdentity("Ashes to Ashes", ""));
|
||||
cubeCards.add(new CardIdentity("Assault Zeppelid", ""));
|
||||
cubeCards.add(new CardIdentity("Attended Knight", ""));
|
||||
cubeCards.add(new CardIdentity("Auger Spree", ""));
|
||||
cubeCards.add(new CardIdentity("Augur of Bolas", ""));
|
||||
cubeCards.add(new CardIdentity("Aven Riftwatcher", ""));
|
||||
cubeCards.add(new CardIdentity("Aven Surveyor", ""));
|
||||
cubeCards.add(new CardIdentity("Azorius Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Baloth Gorger", ""));
|
||||
cubeCards.add(new CardIdentity("Barbed Lightning", ""));
|
||||
cubeCards.add(new CardIdentity("Basking Rootwalla", ""));
|
||||
cubeCards.add(new CardIdentity("Azorius Chancery", ""));
|
||||
cubeCards.add(new CardIdentity("Bannerhide Krushok", ""));
|
||||
cubeCards.add(new CardIdentity("Barbed Batterfist", ""));
|
||||
cubeCards.add(new CardIdentity("Basilica Screecher", ""));
|
||||
cubeCards.add(new CardIdentity("Basilisk Gate", ""));
|
||||
cubeCards.add(new CardIdentity("Basking Broodscale", ""));
|
||||
cubeCards.add(new CardIdentity("Battle Screech", ""));
|
||||
cubeCards.add(new CardIdentity("Beetleback Chief", ""));
|
||||
cubeCards.add(new CardIdentity("Beetleform Mage", ""));
|
||||
cubeCards.add(new CardIdentity("Beneath the Sands", ""));
|
||||
cubeCards.add(new CardIdentity("Behold the Multiverse", ""));
|
||||
cubeCards.add(new CardIdentity("Blastoderm", ""));
|
||||
cubeCards.add(new CardIdentity("Blazing Torch", ""));
|
||||
cubeCards.add(new CardIdentity("Blessed Hippogriff", ""));
|
||||
cubeCards.add(new CardIdentity("Blightning", ""));
|
||||
cubeCards.add(new CardIdentity("Blinding Beam", ""));
|
||||
cubeCards.add(new CardIdentity("Blink of an Eye", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodfell Caves", ""));
|
||||
cubeCards.add(new CardIdentity("Blossoming Sands", ""));
|
||||
cubeCards.add(new CardIdentity("Bonded Construct", ""));
|
||||
cubeCards.add(new CardIdentity("Bonds of Faith", ""));
|
||||
cubeCards.add(new CardIdentity("Blood Fountain", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodwater Entity", ""));
|
||||
cubeCards.add(new CardIdentity("Bloom Hulk", ""));
|
||||
cubeCards.add(new CardIdentity("Body Dropper", ""));
|
||||
cubeCards.add(new CardIdentity("Bogardan Dragonheart", ""));
|
||||
cubeCards.add(new CardIdentity("Bonder's Ornament", ""));
|
||||
cubeCards.add(new CardIdentity("Bone Picker", ""));
|
||||
cubeCards.add(new CardIdentity("Bonesplitter", ""));
|
||||
cubeCards.add(new CardIdentity("Boros Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Boros Elite", ""));
|
||||
cubeCards.add(new CardIdentity("Boros Garrison", ""));
|
||||
cubeCards.add(new CardIdentity("Borrowed Grace", ""));
|
||||
cubeCards.add(new CardIdentity("Botanical Plaza", ""));
|
||||
cubeCards.add(new CardIdentity("Bountiful Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Brainstorm", ""));
|
||||
cubeCards.add(new CardIdentity("Bramble Wurm", ""));
|
||||
cubeCards.add(new CardIdentity("Branching Bolt", ""));
|
||||
cubeCards.add(new CardIdentity("Brazen Wolves", ""));
|
||||
cubeCards.add(new CardIdentity("Bristling Backwoods", ""));
|
||||
cubeCards.add(new CardIdentity("Bubble Snare", ""));
|
||||
cubeCards.add(new CardIdentity("Burning-Tree Emissary", ""));
|
||||
cubeCards.add(new CardIdentity("Burst Lightning", ""));
|
||||
cubeCards.add(new CardIdentity("Butcher Ghoul", ""));
|
||||
cubeCards.add(new CardIdentity("Cage of Hands", ""));
|
||||
cubeCards.add(new CardIdentity("Calcite Snapper", ""));
|
||||
cubeCards.add(new CardIdentity("Call of the Conclave", ""));
|
||||
cubeCards.add(new CardIdentity("Call the Cavalry", ""));
|
||||
cubeCards.add(new CardIdentity("Bushwhack", ""));
|
||||
cubeCards.add(new CardIdentity("Candy Grapple", ""));
|
||||
cubeCards.add(new CardIdentity("Candy Trail", ""));
|
||||
cubeCards.add(new CardIdentity("Capsize", ""));
|
||||
//cubeCards.add(new CardIdentity("Carnivorous Death-Parrot", ""));
|
||||
cubeCards.add(new CardIdentity("Cartouche of Strength", ""));
|
||||
cubeCards.add(new CardIdentity("Captured by Lagacs", ""));
|
||||
cubeCards.add(new CardIdentity("Carnophage", ""));
|
||||
cubeCards.add(new CardIdentity("Carrier Thrall", ""));
|
||||
cubeCards.add(new CardIdentity("Carrion Feeder", ""));
|
||||
cubeCards.add(new CardIdentity("Cartouche of Solidarity", ""));
|
||||
cubeCards.add(new CardIdentity("Cast Down", ""));
|
||||
cubeCards.add(new CardIdentity("Cathar Commando", ""));
|
||||
cubeCards.add(new CardIdentity("Cavern Harpy", ""));
|
||||
cubeCards.add(new CardIdentity("Centaur Healer", ""));
|
||||
cubeCards.add(new CardIdentity("Chain Lightning", ""));
|
||||
cubeCards.add(new CardIdentity("Chainer's Edict", ""));
|
||||
//cubeCards.add(new CardIdentity("Chivalrous Chevalier", ""));
|
||||
cubeCards.add(new CardIdentity("Cinder Barrens", ""));
|
||||
cubeCards.add(new CardIdentity("Citanul Woodreaders", ""));
|
||||
cubeCards.add(new CardIdentity("Claustrophobia", ""));
|
||||
cubeCards.add(new CardIdentity("Clay Statue", ""));
|
||||
cubeCards.add(new CardIdentity("Cloaked Siren", ""));
|
||||
cubeCards.add(new CardIdentity("Clutch of Currents", ""));
|
||||
cubeCards.add(new CardIdentity("Chitin Gravestalker", ""));
|
||||
cubeCards.add(new CardIdentity("Cindering Cutthroat", ""));
|
||||
cubeCards.add(new CardIdentity("Clawing Torment", ""));
|
||||
cubeCards.add(new CardIdentity("Clockwork Percussionist", ""));
|
||||
cubeCards.add(new CardIdentity("Cloudkin Seer", ""));
|
||||
cubeCards.add(new CardIdentity("Coalition Honor Guard", ""));
|
||||
//cubeCards.add(new CardIdentity("Cogwork Librarian", ""));
|
||||
cubeCards.add(new CardIdentity("Colossal Might", ""));
|
||||
//cubeCards.add(new CardIdentity("Common Iguana", ""));
|
||||
cubeCards.add(new CardIdentity("Coiling Oracle", ""));
|
||||
cubeCards.add(new CardIdentity("Colossal Dreadmask", ""));
|
||||
cubeCards.add(new CardIdentity("Combat Professor", ""));
|
||||
cubeCards.add(new CardIdentity("Compulsive Research", ""));
|
||||
cubeCards.add(new CardIdentity("Compulsory Rest", ""));
|
||||
cubeCards.add(new CardIdentity("Consume Strength", ""));
|
||||
cubeCards.add(new CardIdentity("Corrupted Zendikon", ""));
|
||||
cubeCards.add(new CardIdentity("Conclave Naturalists", ""));
|
||||
cubeCards.add(new CardIdentity("Condescend", ""));
|
||||
cubeCards.add(new CardIdentity("Conduit Goblin", ""));
|
||||
cubeCards.add(new CardIdentity("Conduit Pylons", ""));
|
||||
cubeCards.add(new CardIdentity("Consider", ""));
|
||||
cubeCards.add(new CardIdentity("Contagious Vorrac", ""));
|
||||
cubeCards.add(new CardIdentity("Contaminated Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Counterspell", ""));
|
||||
cubeCards.add(new CardIdentity("Court Hussar", ""));
|
||||
cubeCards.add(new CardIdentity("Crippling Fatigue", ""));
|
||||
cubeCards.add(new CardIdentity("Cruel Witness", ""));
|
||||
cubeCards.add(new CardIdentity("Crypt Rats", ""));
|
||||
cubeCards.add(new CardIdentity("Crystallization", ""));
|
||||
cubeCards.add(new CardIdentity("Cunning Strike", ""));
|
||||
cubeCards.add(new CardIdentity("Curse of Chains", ""));
|
||||
cubeCards.add(new CardIdentity("Custodi Squire", ""));
|
||||
cubeCards.add(new CardIdentity("Daring Skyjek", ""));
|
||||
cubeCards.add(new CardIdentity("Dauntless Cathar", ""));
|
||||
cubeCards.add(new CardIdentity("Dead Reveler", ""));
|
||||
cubeCards.add(new CardIdentity("Dead Weight", ""));
|
||||
cubeCards.add(new CardIdentity("Deadeye Tormentor", ""));
|
||||
cubeCards.add(new CardIdentity("Dark-Dweller Oracle", ""));
|
||||
cubeCards.add(new CardIdentity("Dauntless Unity", ""));
|
||||
cubeCards.add(new CardIdentity("Dauthi Horror", ""));
|
||||
cubeCards.add(new CardIdentity("Dauthi Slayer", ""));
|
||||
cubeCards.add(new CardIdentity("Death Denied", ""));
|
||||
cubeCards.add(new CardIdentity("Deathbloom Thallid", ""));
|
||||
cubeCards.add(new CardIdentity("Deceptive Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Deep Analysis", ""));
|
||||
cubeCards.add(new CardIdentity("Deprive", ""));
|
||||
cubeCards.add(new CardIdentity("Depths of Desire", ""));
|
||||
cubeCards.add(new CardIdentity("Deputy of Acquittals", ""));
|
||||
cubeCards.add(new CardIdentity("Deftblade Elite", ""));
|
||||
cubeCards.add(new CardIdentity("Deranged Assistant", ""));
|
||||
cubeCards.add(new CardIdentity("Desecrator Hag", ""));
|
||||
cubeCards.add(new CardIdentity("Desert", ""));
|
||||
cubeCards.add(new CardIdentity("Devour Flesh", ""));
|
||||
cubeCards.add(new CardIdentity("Diabolic Edict", ""));
|
||||
cubeCards.add(new CardIdentity("Dimir Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Dimir Aqueduct", ""));
|
||||
cubeCards.add(new CardIdentity("Dimir Guildmage", ""));
|
||||
cubeCards.add(new CardIdentity("Dinrova Horror", ""));
|
||||
cubeCards.add(new CardIdentity("Disfigure", ""));
|
||||
cubeCards.add(new CardIdentity("Dismal Backwater", ""));
|
||||
cubeCards.add(new CardIdentity("Disowned Ancestor", ""));
|
||||
cubeCards.add(new CardIdentity("Displace", ""));
|
||||
cubeCards.add(new CardIdentity("Dog Umbra", ""));
|
||||
cubeCards.add(new CardIdentity("Dog Walker", ""));
|
||||
cubeCards.add(new CardIdentity("Doom Blade", ""));
|
||||
cubeCards.add(new CardIdentity("Doomed Traveler", ""));
|
||||
cubeCards.add(new CardIdentity("Dragon Fodder", ""));
|
||||
cubeCards.add(new CardIdentity("Dusk Legion Zealot", ""));
|
||||
cubeCards.add(new CardIdentity("Dynacharge", ""));
|
||||
cubeCards.add(new CardIdentity("Eager Construct", ""));
|
||||
cubeCards.add(new CardIdentity("Eldrazi Devastator", ""));
|
||||
cubeCards.add(new CardIdentity("Dread Return", ""));
|
||||
cubeCards.add(new CardIdentity("Dreg Mangler", ""));
|
||||
cubeCards.add(new CardIdentity("Eagles of the North", ""));
|
||||
cubeCards.add(new CardIdentity("Ecstatic Awakener", ""));
|
||||
cubeCards.add(new CardIdentity("Eldrazi Repurposer", ""));
|
||||
cubeCards.add(new CardIdentity("Eldrazi Skyspawner", ""));
|
||||
cubeCards.add(new CardIdentity("Elephant Ambush", ""));
|
||||
cubeCards.add(new CardIdentity("Elephant Guide", ""));
|
||||
cubeCards.add(new CardIdentity("Elite Vanguard", ""));
|
||||
cubeCards.add(new CardIdentity("Emperor Crocodile", ""));
|
||||
cubeCards.add(new CardIdentity("Epic Confrontation", ""));
|
||||
cubeCards.add(new CardIdentity("Errant Ephemeron", ""));
|
||||
cubeCards.add(new CardIdentity("Evincar's Justice", ""));
|
||||
cubeCards.add(new CardIdentity("Evolving Wilds", ""));
|
||||
//cubeCards.add(new CardIdentity("Extremely Slow Zombie", ""));
|
||||
cubeCards.add(new CardIdentity("Elvish Mystic", ""));
|
||||
cubeCards.add(new CardIdentity("Ephemerate", ""));
|
||||
cubeCards.add(new CardIdentity("Eroded Canyon", ""));
|
||||
cubeCards.add(new CardIdentity("Escape Tunnel", ""));
|
||||
cubeCards.add(new CardIdentity("Evolution Witness", ""));
|
||||
cubeCards.add(new CardIdentity("Exclude", ""));
|
||||
cubeCards.add(new CardIdentity("Experiment One", ""));
|
||||
cubeCards.add(new CardIdentity("Faceless Butcher", ""));
|
||||
cubeCards.add(new CardIdentity("Faerie Guidemother", ""));
|
||||
cubeCards.add(new CardIdentity("Faerie Seer", ""));
|
||||
cubeCards.add(new CardIdentity("Faith's Fetters", ""));
|
||||
cubeCards.add(new CardIdentity("Faithful Watchdog", ""));
|
||||
cubeCards.add(new CardIdentity("Falkenrath Noble", ""));
|
||||
cubeCards.add(new CardIdentity("Fanatical Firebrand", ""));
|
||||
cubeCards.add(new CardIdentity("Feeling of Dread", ""));
|
||||
cubeCards.add(new CardIdentity("Fervent Cathar", ""));
|
||||
cubeCards.add(new CardIdentity("Farseek", ""));
|
||||
cubeCards.add(new CardIdentity("Feed the Swarm", ""));
|
||||
cubeCards.add(new CardIdentity("Feign Death", ""));
|
||||
cubeCards.add(new CardIdentity("Fertile Ground", ""));
|
||||
cubeCards.add(new CardIdentity("Filigree Familiar", ""));
|
||||
cubeCards.add(new CardIdentity("Fireball", ""));
|
||||
cubeCards.add(new CardIdentity("Fireblade Artist", ""));
|
||||
cubeCards.add(new CardIdentity("Fireblast", ""));
|
||||
cubeCards.add(new CardIdentity("Firebolt", ""));
|
||||
cubeCards.add(new CardIdentity("Firebrand Archer", ""));
|
||||
cubeCards.add(new CardIdentity("Fireslinger", ""));
|
||||
cubeCards.add(new CardIdentity("First-Sphere Gargantua", ""));
|
||||
cubeCards.add(new CardIdentity("Flame Slash", ""));
|
||||
cubeCards.add(new CardIdentity("Flayer Husk", ""));
|
||||
cubeCards.add(new CardIdentity("Flurry of Horns", ""));
|
||||
cubeCards.add(new CardIdentity("Forked Bolt", ""));
|
||||
cubeCards.add(new CardIdentity("Forsaken Sanctuary", ""));
|
||||
cubeCards.add(new CardIdentity("Fortify", ""));
|
||||
cubeCards.add(new CardIdentity("Foul Orchard", ""));
|
||||
cubeCards.add(new CardIdentity("Forbidden Friendship", ""));
|
||||
cubeCards.add(new CardIdentity("Foreboding Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Frenzied Goblin", ""));
|
||||
cubeCards.add(new CardIdentity("Frilled Deathspitter", ""));
|
||||
cubeCards.add(new CardIdentity("Frilled Oculus", ""));
|
||||
cubeCards.add(new CardIdentity("Frostburn Weird", ""));
|
||||
cubeCards.add(new CardIdentity("Fungal Infection", ""));
|
||||
cubeCards.add(new CardIdentity("GO TO JAIL", ""));
|
||||
cubeCards.add(new CardIdentity("Gathan Raiders", ""));
|
||||
cubeCards.add(new CardIdentity("Gather the Townsfolk", ""));
|
||||
cubeCards.add(new CardIdentity("Ghirapur Gearcrafter", ""));
|
||||
cubeCards.add(new CardIdentity("Frost Trickster", ""));
|
||||
cubeCards.add(new CardIdentity("Galvanic Discharge", ""));
|
||||
cubeCards.add(new CardIdentity("Generous Ent", ""));
|
||||
cubeCards.add(new CardIdentity("Geyser Drake", ""));
|
||||
cubeCards.add(new CardIdentity("Ghostly Flicker", ""));
|
||||
cubeCards.add(new CardIdentity("Giant Growth", ""));
|
||||
cubeCards.add(new CardIdentity("Gideon's Lawkeeper", ""));
|
||||
cubeCards.add(new CardIdentity("Glint-Sleeve Artisan", ""));
|
||||
cubeCards.add(new CardIdentity("Gnawing Zombie", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Freerunner", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Heelcutter", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Trailblazer", ""));
|
||||
cubeCards.add(new CardIdentity("Gift of Fangs", ""));
|
||||
cubeCards.add(new CardIdentity("Gift of Orzhova", ""));
|
||||
cubeCards.add(new CardIdentity("Gingerbrute", ""));
|
||||
cubeCards.add(new CardIdentity("Gitaxian Probe", ""));
|
||||
cubeCards.add(new CardIdentity("Gixian Infiltrator", ""));
|
||||
cubeCards.add(new CardIdentity("Glimmerlight", ""));
|
||||
cubeCards.add(new CardIdentity("Gnarlid Colony", ""));
|
||||
cubeCards.add(new CardIdentity("Gnawing Crescendo", ""));
|
||||
cubeCards.add(new CardIdentity("Go for the Throat", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Anarchomancer", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Bushwhacker", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Electromancer", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Motivator", ""));
|
||||
cubeCards.add(new CardIdentity("Goblin Surprise", ""));
|
||||
cubeCards.add(new CardIdentity("Gods Willing", ""));
|
||||
cubeCards.add(new CardIdentity("Goldmeadow Harrier", ""));
|
||||
cubeCards.add(new CardIdentity("Golgari Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Golgari Rot Farm", ""));
|
||||
cubeCards.add(new CardIdentity("Grapple with the Past", ""));
|
||||
cubeCards.add(new CardIdentity("Grasping Scoundrel", ""));
|
||||
cubeCards.add(new CardIdentity("Gravedigger", ""));
|
||||
cubeCards.add(new CardIdentity("Gray Merchant of Asphodel", ""));
|
||||
cubeCards.add(new CardIdentity("Grim Contest", ""));
|
||||
cubeCards.add(new CardIdentity("Grisly Salvage", ""));
|
||||
cubeCards.add(new CardIdentity("Grixis Slavedriver", ""));
|
||||
cubeCards.add(new CardIdentity("Gruul Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Gryff Vanguard", ""));
|
||||
cubeCards.add(new CardIdentity("Guardian Automaton", ""));
|
||||
cubeCards.add(new CardIdentity("Greater Tanuki", ""));
|
||||
cubeCards.add(new CardIdentity("Greatsword of Tyr", ""));
|
||||
cubeCards.add(new CardIdentity("Grim Bauble", ""));
|
||||
cubeCards.add(new CardIdentity("Grim Initiate", ""));
|
||||
cubeCards.add(new CardIdentity("Growth Spiral", ""));
|
||||
cubeCards.add(new CardIdentity("Gruul Turf", ""));
|
||||
cubeCards.add(new CardIdentity("Guardian Idol", ""));
|
||||
cubeCards.add(new CardIdentity("Guardian of the Guildpact", ""));
|
||||
cubeCards.add(new CardIdentity("Guildsworn Prowler", ""));
|
||||
cubeCards.add(new CardIdentity("Gurmag Angler", ""));
|
||||
cubeCards.add(new CardIdentity("Halimar Wavewatch", ""));
|
||||
cubeCards.add(new CardIdentity("Harrow", ""));
|
||||
cubeCards.add(new CardIdentity("Harsh Sustenance", ""));
|
||||
cubeCards.add(new CardIdentity("Highland Lake", ""));
|
||||
cubeCards.add(new CardIdentity("Guttersnipe", ""));
|
||||
cubeCards.add(new CardIdentity("Hard Evidence", ""));
|
||||
cubeCards.add(new CardIdentity("Harried Spearguard", ""));
|
||||
cubeCards.add(new CardIdentity("Haunted Fengraf", ""));
|
||||
cubeCards.add(new CardIdentity("Haunted Mire", ""));
|
||||
cubeCards.add(new CardIdentity("Hazard of the Dunes", ""));
|
||||
cubeCards.add(new CardIdentity("Heliod's Pilgrim", ""));
|
||||
cubeCards.add(new CardIdentity("Hickory Woodlot", ""));
|
||||
cubeCards.add(new CardIdentity("Hidden Grotto", ""));
|
||||
cubeCards.add(new CardIdentity("Hissing Iguanar", ""));
|
||||
cubeCards.add(new CardIdentity("Hobblefiend", ""));
|
||||
cubeCards.add(new CardIdentity("Holy Cow", ""));
|
||||
cubeCards.add(new CardIdentity("Hooting Mandrills", ""));
|
||||
cubeCards.add(new CardIdentity("Hordeling Outburst", ""));
|
||||
cubeCards.add(new CardIdentity("Imperiosaur", ""));
|
||||
cubeCards.add(new CardIdentity("Inner-Flame Acolyte", ""));
|
||||
cubeCards.add(new CardIdentity("Insolent Neonate", ""));
|
||||
cubeCards.add(new CardIdentity("Horrific Assault", ""));
|
||||
cubeCards.add(new CardIdentity("Imperial Oath", ""));
|
||||
cubeCards.add(new CardIdentity("Improvised Club", ""));
|
||||
cubeCards.add(new CardIdentity("Impulse", ""));
|
||||
cubeCards.add(new CardIdentity("Incinerate", ""));
|
||||
cubeCards.add(new CardIdentity("Infestation Sage", ""));
|
||||
cubeCards.add(new CardIdentity("Infuse with Vitality", ""));
|
||||
cubeCards.add(new CardIdentity("Inspiring Overseer", ""));
|
||||
cubeCards.add(new CardIdentity("Inspiring Paladin", ""));
|
||||
cubeCards.add(new CardIdentity("Into the Roil", ""));
|
||||
cubeCards.add(new CardIdentity("Isolation Zone", ""));
|
||||
cubeCards.add(new CardIdentity("Ivy Elemental", ""));
|
||||
cubeCards.add(new CardIdentity("Izzet Chronarch", ""));
|
||||
cubeCards.add(new CardIdentity("Izzet Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Iron Apprentice", ""));
|
||||
cubeCards.add(new CardIdentity("Izzet Boilerworks", ""));
|
||||
cubeCards.add(new CardIdentity("Izzet Charm", ""));
|
||||
cubeCards.add(new CardIdentity("Jackal Pup", ""));
|
||||
cubeCards.add(new CardIdentity("Jilt", ""));
|
||||
cubeCards.add(new CardIdentity("Jade Avenger", ""));
|
||||
cubeCards.add(new CardIdentity("Jade Guardian", ""));
|
||||
cubeCards.add(new CardIdentity("Jagged Barrens", ""));
|
||||
cubeCards.add(new CardIdentity("Jewel Thief", ""));
|
||||
cubeCards.add(new CardIdentity("Jhessian Thief", ""));
|
||||
cubeCards.add(new CardIdentity("Journey to Nowhere", ""));
|
||||
cubeCards.add(new CardIdentity("Jungle Hollow", ""));
|
||||
cubeCards.add(new CardIdentity("Jungleborn Pioneer", ""));
|
||||
cubeCards.add(new CardIdentity("Keldon Marauders", ""));
|
||||
cubeCards.add(new CardIdentity("Keldon Overseer", ""));
|
||||
cubeCards.add(new CardIdentity("Keldon Raider", ""));
|
||||
cubeCards.add(new CardIdentity("Judge's Familiar", ""));
|
||||
cubeCards.add(new CardIdentity("Juggernaut", ""));
|
||||
cubeCards.add(new CardIdentity("Kingpin's Pet", ""));
|
||||
cubeCards.add(new CardIdentity("Kitesail Corsair", ""));
|
||||
cubeCards.add(new CardIdentity("Kor Skyfisher", ""));
|
||||
cubeCards.add(new CardIdentity("Kozilek's Channeler", ""));
|
||||
cubeCards.add(new CardIdentity("Krenko's Command", ""));
|
||||
cubeCards.add(new CardIdentity("Krosan Tusker", ""));
|
||||
cubeCards.add(new CardIdentity("Lash Out", ""));
|
||||
cubeCards.add(new CardIdentity("Last Gasp", ""));
|
||||
cubeCards.add(new CardIdentity("Leave in the Dust", ""));
|
||||
cubeCards.add(new CardIdentity("Lead the Stampede", ""));
|
||||
cubeCards.add(new CardIdentity("Legion Vanguard", ""));
|
||||
cubeCards.add(new CardIdentity("Leonin Bola", ""));
|
||||
cubeCards.add(new CardIdentity("Lifecraft Cavalry", ""));
|
||||
cubeCards.add(new CardIdentity("Lightning Bolt", ""));
|
||||
cubeCards.add(new CardIdentity("Liliana's Specter", ""));
|
||||
cubeCards.add(new CardIdentity("Loyal Pegasus", ""));
|
||||
//cubeCards.add(new CardIdentity("Lurking Automaton", ""));
|
||||
cubeCards.add(new CardIdentity("Magma Jet", ""));
|
||||
cubeCards.add(new CardIdentity("Makeshift Mauler", ""));
|
||||
cubeCards.add(new CardIdentity("Lightning Strike", ""));
|
||||
cubeCards.add(new CardIdentity("Llanowar Elves", ""));
|
||||
cubeCards.add(new CardIdentity("Llanowar Visionary", ""));
|
||||
cubeCards.add(new CardIdentity("Loathsome Curator", ""));
|
||||
cubeCards.add(new CardIdentity("Longstalk Brawl", ""));
|
||||
cubeCards.add(new CardIdentity("Looter il-Kor", ""));
|
||||
cubeCards.add(new CardIdentity("Lorehold Campus", ""));
|
||||
cubeCards.add(new CardIdentity("Lorien Revealed", ""));
|
||||
cubeCards.add(new CardIdentity("Lose Focus", ""));
|
||||
cubeCards.add(new CardIdentity("Lyev Skyknight", ""));
|
||||
cubeCards.add(new CardIdentity("Malevolent Rumble", ""));
|
||||
cubeCards.add(new CardIdentity("Man-o'-War", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Leak", ""));
|
||||
cubeCards.add(new CardIdentity("Mardu Hordechief", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Tithe", ""));
|
||||
cubeCards.add(new CardIdentity("Mandibular Kite", ""));
|
||||
cubeCards.add(new CardIdentity("Mardu Skullhunter", ""));
|
||||
cubeCards.add(new CardIdentity("Martyr of Dusk", ""));
|
||||
cubeCards.add(new CardIdentity("Maul Splicer", ""));
|
||||
cubeCards.add(new CardIdentity("Maze of Ith", ""));
|
||||
cubeCards.add(new CardIdentity("Meandering River", ""));
|
||||
cubeCards.add(new CardIdentity("Mental Note", ""));
|
||||
cubeCards.add(new CardIdentity("Midnight Scavengers", ""));
|
||||
cubeCards.add(new CardIdentity("Massive Might", ""));
|
||||
cubeCards.add(new CardIdentity("Mayhem Patrol", ""));
|
||||
cubeCards.add(new CardIdentity("Merfolk Looter", ""));
|
||||
cubeCards.add(new CardIdentity("Militia Bugler", ""));
|
||||
cubeCards.add(new CardIdentity("Mind Stone", ""));
|
||||
cubeCards.add(new CardIdentity("Minotaur Skullcleaver", ""));
|
||||
cubeCards.add(new CardIdentity("Miner's Guidewing", ""));
|
||||
cubeCards.add(new CardIdentity("Mire Triton", ""));
|
||||
cubeCards.add(new CardIdentity("Mirrorshell Crab", ""));
|
||||
cubeCards.add(new CardIdentity("Miscalculation", ""));
|
||||
cubeCards.add(new CardIdentity("Mishra's Factory", ""));
|
||||
cubeCards.add(new CardIdentity("Mist Raven", ""));
|
||||
cubeCards.add(new CardIdentity("Mistral Charger", ""));
|
||||
cubeCards.add(new CardIdentity("Mobile Garrison", ""));
|
||||
cubeCards.add(new CardIdentity("Mogg Fanatic", ""));
|
||||
cubeCards.add(new CardIdentity("Mogg Flunkies", ""));
|
||||
cubeCards.add(new CardIdentity("Mistral Singer", ""));
|
||||
cubeCards.add(new CardIdentity("Mocking Sprite", ""));
|
||||
cubeCards.add(new CardIdentity("Mogg War Marshal", ""));
|
||||
cubeCards.add(new CardIdentity("Moldervine Cloak", ""));
|
||||
cubeCards.add(new CardIdentity("Molten Gatekeeper", ""));
|
||||
cubeCards.add(new CardIdentity("Momentary Blink", ""));
|
||||
cubeCards.add(new CardIdentity("Morgue Theft", ""));
|
||||
cubeCards.add(new CardIdentity("Monastery Swiftspear", ""));
|
||||
cubeCards.add(new CardIdentity("Monstrous Emergence", ""));
|
||||
cubeCards.add(new CardIdentity("Moon-Circuit Hacker", ""));
|
||||
cubeCards.add(new CardIdentity("Mother Bear", ""));
|
||||
cubeCards.add(new CardIdentity("Mulldrifter", ""));
|
||||
cubeCards.add(new CardIdentity("Nameless Inversion", ""));
|
||||
cubeCards.add(new CardIdentity("Narcolepsy", ""));
|
||||
cubeCards.add(new CardIdentity("Nessian Asp", ""));
|
||||
cubeCards.add(new CardIdentity("Nest Robber", ""));
|
||||
cubeCards.add(new CardIdentity("Nezumi Cutthroat", ""));
|
||||
cubeCards.add(new CardIdentity("Murmuring Mystic", ""));
|
||||
cubeCards.add(new CardIdentity("Mutagenic Growth", ""));
|
||||
cubeCards.add(new CardIdentity("Mystic Sanctuary", ""));
|
||||
cubeCards.add(new CardIdentity("Nature's Lore", ""));
|
||||
cubeCards.add(new CardIdentity("Nest Invader", ""));
|
||||
cubeCards.add(new CardIdentity("Nested Shambler", ""));
|
||||
cubeCards.add(new CardIdentity("Nezumi Linkbreaker", ""));
|
||||
cubeCards.add(new CardIdentity("Night Market", ""));
|
||||
cubeCards.add(new CardIdentity("Night's Whisper", ""));
|
||||
cubeCards.add(new CardIdentity("Nightscape Familiar", ""));
|
||||
cubeCards.add(new CardIdentity("Ninja of the Deep Hours", ""));
|
||||
cubeCards.add(new CardIdentity("Novice Inspector", ""));
|
||||
cubeCards.add(new CardIdentity("Nyxborn Hydra", ""));
|
||||
cubeCards.add(new CardIdentity("Oblivion Ring", ""));
|
||||
cubeCards.add(new CardIdentity("Oona's Grace", ""));
|
||||
//cubeCards.add(new CardIdentity("Ordinary Pony", ""));
|
||||
cubeCards.add(new CardIdentity("Orzhov Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Otherworldly Journey", ""));
|
||||
cubeCards.add(new CardIdentity("Overgrown Armasaur", ""));
|
||||
cubeCards.add(new CardIdentity("Pacifism", ""));
|
||||
cubeCards.add(new CardIdentity("Paladin of the Bloodstained", ""));
|
||||
cubeCards.add(new CardIdentity("Peema Outrider", ""));
|
||||
cubeCards.add(new CardIdentity("Penumbra Spider", ""));
|
||||
cubeCards.add(new CardIdentity("Okiba-Gang Shinobi", ""));
|
||||
cubeCards.add(new CardIdentity("Oliphaunt", ""));
|
||||
cubeCards.add(new CardIdentity("Opt", ""));
|
||||
cubeCards.add(new CardIdentity("Orcish Hellraiser", ""));
|
||||
cubeCards.add(new CardIdentity("Orzhov Basilica", ""));
|
||||
cubeCards.add(new CardIdentity("Owlbear", ""));
|
||||
cubeCards.add(new CardIdentity("Palace Sentinels", ""));
|
||||
cubeCards.add(new CardIdentity("Pegasus Guardian", ""));
|
||||
cubeCards.add(new CardIdentity("Peregrine Drake", ""));
|
||||
cubeCards.add(new CardIdentity("Perilous Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Perilous Myr", ""));
|
||||
cubeCards.add(new CardIdentity("Pestermite", ""));
|
||||
cubeCards.add(new CardIdentity("Pestilence", ""));
|
||||
cubeCards.add(new CardIdentity("Petrify", ""));
|
||||
cubeCards.add(new CardIdentity("Phantom Interference", ""));
|
||||
cubeCards.add(new CardIdentity("Phantom Nomad", ""));
|
||||
cubeCards.add(new CardIdentity("Phantom Tiger", ""));
|
||||
cubeCards.add(new CardIdentity("Phyrexian Rager", ""));
|
||||
cubeCards.add(new CardIdentity("Pillory of the Sleepless", ""));
|
||||
cubeCards.add(new CardIdentity("Pit Fight", ""));
|
||||
cubeCards.add(new CardIdentity("Pit Keeper", ""));
|
||||
cubeCards.add(new CardIdentity("Plated Geopede", ""));
|
||||
cubeCards.add(new CardIdentity("Plagued Rusalka", ""));
|
||||
cubeCards.add(new CardIdentity("Planar Disruption", ""));
|
||||
cubeCards.add(new CardIdentity("Ponder", ""));
|
||||
cubeCards.add(new CardIdentity("Porcelain Legionnaire", ""));
|
||||
cubeCards.add(new CardIdentity("Pounce", ""));
|
||||
cubeCards.add(new CardIdentity("Predatory Nightstalker", ""));
|
||||
cubeCards.add(new CardIdentity("Preening Champion", ""));
|
||||
cubeCards.add(new CardIdentity("Preordain", ""));
|
||||
cubeCards.add(new CardIdentity("Prey Upon", ""));
|
||||
cubeCards.add(new CardIdentity("Prismari Campus", ""));
|
||||
cubeCards.add(new CardIdentity("Prismatic Strands", ""));
|
||||
cubeCards.add(new CardIdentity("Pristine Talisman", ""));
|
||||
cubeCards.add(new CardIdentity("Prophetic Prism", ""));
|
||||
cubeCards.add(new CardIdentity("Pulse of Murasa", ""));
|
||||
cubeCards.add(new CardIdentity("Pursue Glory", ""));
|
||||
cubeCards.add(new CardIdentity("Putrid Goblin", ""));
|
||||
cubeCards.add(new CardIdentity("Putrid Leech", ""));
|
||||
cubeCards.add(new CardIdentity("Pyrotechnics", ""));
|
||||
cubeCards.add(new CardIdentity("Qasali Pridemage", ""));
|
||||
cubeCards.add(new CardIdentity("Quandrix Campus", ""));
|
||||
cubeCards.add(new CardIdentity("Quandrix Pledgemage", ""));
|
||||
cubeCards.add(new CardIdentity("Quick Study", ""));
|
||||
cubeCards.add(new CardIdentity("Quicksand", ""));
|
||||
cubeCards.add(new CardIdentity("Racers' Ring", ""));
|
||||
cubeCards.add(new CardIdentity("Radiant Grove", ""));
|
||||
cubeCards.add(new CardIdentity("Raffine's Informant", ""));
|
||||
cubeCards.add(new CardIdentity("Raid Bombardment", ""));
|
||||
cubeCards.add(new CardIdentity("Raise the Alarm", ""));
|
||||
cubeCards.add(new CardIdentity("Rakdos Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Rakdos Carnarium", ""));
|
||||
cubeCards.add(new CardIdentity("Rally at the Hornburg", ""));
|
||||
cubeCards.add(new CardIdentity("Rally the Peasants", ""));
|
||||
cubeCards.add(new CardIdentity("Rampant Growth", ""));
|
||||
cubeCards.add(new CardIdentity("Ram Through", ""));
|
||||
cubeCards.add(new CardIdentity("Rancor", ""));
|
||||
cubeCards.add(new CardIdentity("Ranger's Guile", ""));
|
||||
cubeCards.add(new CardIdentity("Ray of Command", ""));
|
||||
cubeCards.add(new CardIdentity("Razorfin Hunter", ""));
|
||||
cubeCards.add(new CardIdentity("Ransack the Lab", ""));
|
||||
cubeCards.add(new CardIdentity("Reckless Charge", ""));
|
||||
cubeCards.add(new CardIdentity("Recoil", ""));
|
||||
//cubeCards.add(new CardIdentity("Regicide", ""));
|
||||
cubeCards.add(new CardIdentity("Reckless Impulse", ""));
|
||||
cubeCards.add(new CardIdentity("Red Herring", ""));
|
||||
cubeCards.add(new CardIdentity("Remove Soul", ""));
|
||||
cubeCards.add(new CardIdentity("Rend Flesh", ""));
|
||||
cubeCards.add(new CardIdentity("Rendclaw Trow", ""));
|
||||
cubeCards.add(new CardIdentity("Renegade Freighter", ""));
|
||||
cubeCards.add(new CardIdentity("Repeal", ""));
|
||||
cubeCards.add(new CardIdentity("Retrofitted Transmogrant", ""));
|
||||
cubeCards.add(new CardIdentity("Rhox Veteran", ""));
|
||||
cubeCards.add(new CardIdentity("Rift Bolt", ""));
|
||||
cubeCards.add(new CardIdentity("Rishadan Airship", ""));
|
||||
cubeCards.add(new CardIdentity("Rugged Highlands", ""));
|
||||
cubeCards.add(new CardIdentity("Runed Servitor", ""));
|
||||
cubeCards.add(new CardIdentity("Rushing River", ""));
|
||||
cubeCards.add(new CardIdentity("Ruthless Ripper", ""));
|
||||
cubeCards.add(new CardIdentity("Sailor of Means", ""));
|
||||
cubeCards.add(new CardIdentity("Rimrock Knight", ""));
|
||||
cubeCards.add(new CardIdentity("Rolling Thunder", ""));
|
||||
cubeCards.add(new CardIdentity("Safehold Elite", ""));
|
||||
cubeCards.add(new CardIdentity("Sakura-Tribe Elder", ""));
|
||||
cubeCards.add(new CardIdentity("Sandsteppe Outcast", ""));
|
||||
cubeCards.add(new CardIdentity("Sangrite Backlash", ""));
|
||||
cubeCards.add(new CardIdentity("Saproling Migration", ""));
|
||||
cubeCards.add(new CardIdentity("Sarkhan's Rage", ""));
|
||||
cubeCards.add(new CardIdentity("Savage Punch", ""));
|
||||
cubeCards.add(new CardIdentity("Sarulf's Packmate", ""));
|
||||
cubeCards.add(new CardIdentity("Savannah Lions", ""));
|
||||
cubeCards.add(new CardIdentity("Scatter the Seeds", ""));
|
||||
cubeCards.add(new CardIdentity("Scion Summoner", ""));
|
||||
cubeCards.add(new CardIdentity("Scion of the Wild", ""));
|
||||
cubeCards.add(new CardIdentity("Scholar of Combustion", ""));
|
||||
cubeCards.add(new CardIdentity("Scorched Rusalka", ""));
|
||||
cubeCards.add(new CardIdentity("Scoured Barrens", ""));
|
||||
cubeCards.add(new CardIdentity("Scourge Devil", ""));
|
||||
cubeCards.add(new CardIdentity("Screeching Skaab", ""));
|
||||
cubeCards.add(new CardIdentity("Scuzzback Marauders", ""));
|
||||
cubeCards.add(new CardIdentity("Search for Tomorrow", ""));
|
||||
cubeCards.add(new CardIdentity("Searing Blaze", ""));
|
||||
cubeCards.add(new CardIdentity("Seeker of Insight", ""));
|
||||
cubeCards.add(new CardIdentity("Scrapwork Mutt", ""));
|
||||
cubeCards.add(new CardIdentity("Scurrilous Sentry", ""));
|
||||
cubeCards.add(new CardIdentity("Search Party Captain", ""));
|
||||
cubeCards.add(new CardIdentity("Searing Spear", ""));
|
||||
cubeCards.add(new CardIdentity("Seeker of the Way", ""));
|
||||
cubeCards.add(new CardIdentity("Selesnya Guildgate", ""));
|
||||
//cubeCards.add(new CardIdentity("Selfie Preservation", ""));
|
||||
cubeCards.add(new CardIdentity("Separatist Voidmage", ""));
|
||||
cubeCards.add(new CardIdentity("Seraph of Dawn", ""));
|
||||
cubeCards.add(new CardIdentity("Sergeant-at-Arms", ""));
|
||||
cubeCards.add(new CardIdentity("Seething Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Selesnya Sanctuary", ""));
|
||||
cubeCards.add(new CardIdentity("Serrated Arrows", ""));
|
||||
cubeCards.add(new CardIdentity("Shaper Parasite", ""));
|
||||
cubeCards.add(new CardIdentity("Sheer Drop", ""));
|
||||
cubeCards.add(new CardIdentity("Shelter", ""));
|
||||
cubeCards.add(new CardIdentity("Shimmering Glasskite", ""));
|
||||
cubeCards.add(new CardIdentity("Sigil Blessing", ""));
|
||||
cubeCards.add(new CardIdentity("Silent Departure", ""));
|
||||
cubeCards.add(new CardIdentity("Simic Guildgate", ""));
|
||||
cubeCards.add(new CardIdentity("Skirk Marauder", ""));
|
||||
cubeCards.add(new CardIdentity("Skyknight Legionnaire", ""));
|
||||
cubeCards.add(new CardIdentity("Slash Panther", ""));
|
||||
cubeCards.add(new CardIdentity("Snakeform", ""));
|
||||
cubeCards.add(new CardIdentity("Serum Visionary", ""));
|
||||
cubeCards.add(new CardIdentity("Serum Visions", ""));
|
||||
cubeCards.add(new CardIdentity("Settle Beyond Reality", ""));
|
||||
cubeCards.add(new CardIdentity("Shardless Outlander", ""));
|
||||
cubeCards.add(new CardIdentity("Shattered Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Sheltering Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Shipwreck Dowser", ""));
|
||||
cubeCards.add(new CardIdentity("Silver Drake", ""));
|
||||
cubeCards.add(new CardIdentity("Silverback Shaman", ""));
|
||||
cubeCards.add(new CardIdentity("Silverquill Campus", ""));
|
||||
cubeCards.add(new CardIdentity("Simic Growth Chamber", ""));
|
||||
cubeCards.add(new CardIdentity("Skewer the Critics", ""));
|
||||
cubeCards.add(new CardIdentity("Skybridge Towers", ""));
|
||||
cubeCards.add(new CardIdentity("Snakeskin Veil", ""));
|
||||
cubeCards.add(new CardIdentity("Snap", ""));
|
||||
cubeCards.add(new CardIdentity("Snapping Voidcraw", ""));
|
||||
cubeCards.add(new CardIdentity("Soltari Trooper", ""));
|
||||
cubeCards.add(new CardIdentity("Soul Manipulation", ""));
|
||||
cubeCards.add(new CardIdentity("Soul of the Rapids", ""));
|
||||
cubeCards.add(new CardIdentity("Soulstinger", ""));
|
||||
cubeCards.add(new CardIdentity("Sparring Construct", ""));
|
||||
cubeCards.add(new CardIdentity("Sphere of the Suns", ""));
|
||||
cubeCards.add(new CardIdentity("Spike Jester", ""));
|
||||
//cubeCards.add(new CardIdentity("Squirrel Dealer", ""));
|
||||
cubeCards.add(new CardIdentity("Staggershock", ""));
|
||||
cubeCards.add(new CardIdentity("Star Compass", ""));
|
||||
cubeCards.add(new CardIdentity("Stitched Drake", ""));
|
||||
cubeCards.add(new CardIdentity("Stone Quarry", ""));
|
||||
cubeCards.add(new CardIdentity("Storm Fleet Pyromancer", ""));
|
||||
cubeCards.add(new CardIdentity("Spelleater Wolverine", ""));
|
||||
cubeCards.add(new CardIdentity("Sprout Swarm", ""));
|
||||
cubeCards.add(new CardIdentity("Stormfront Pegasus", ""));
|
||||
cubeCards.add(new CardIdentity("Stormscape Apprentice", ""));
|
||||
cubeCards.add(new CardIdentity("Strip Mine", ""));
|
||||
cubeCards.add(new CardIdentity("Striped Riverwinder", ""));
|
||||
cubeCards.add(new CardIdentity("Stronghold Confessor", ""));
|
||||
cubeCards.add(new CardIdentity("Submerged Boneyard", ""));
|
||||
cubeCards.add(new CardIdentity("Sultai Scavenger", ""));
|
||||
cubeCards.add(new CardIdentity("Suppression Bonds", ""));
|
||||
cubeCards.add(new CardIdentity("Swiftwater Cliffs", ""));
|
||||
cubeCards.add(new CardIdentity("Sylvan Might", ""));
|
||||
cubeCards.add(new CardIdentity("Sylvok Lifestaff", ""));
|
||||
cubeCards.add(new CardIdentity("Temporal Isolation", ""));
|
||||
cubeCards.add(new CardIdentity("Tenement Crasher", ""));
|
||||
cubeCards.add(new CardIdentity("Terminate", ""));
|
||||
cubeCards.add(new CardIdentity("Terramorphic Expanse", ""));
|
||||
cubeCards.add(new CardIdentity("Sulfurous Blast", ""));
|
||||
cubeCards.add(new CardIdentity("Sunlance", ""));
|
||||
cubeCards.add(new CardIdentity("Suture Priest", ""));
|
||||
cubeCards.add(new CardIdentity("Sword Coast Serpent", ""));
|
||||
cubeCards.add(new CardIdentity("Syndic of Tithes", ""));
|
||||
cubeCards.add(new CardIdentity("Tamiyo's Safekeeping", ""));
|
||||
cubeCards.add(new CardIdentity("Tangled Islet", ""));
|
||||
cubeCards.add(new CardIdentity("Teetering Peaks", ""));
|
||||
cubeCards.add(new CardIdentity("Tempest Angler", ""));
|
||||
cubeCards.add(new CardIdentity("Tenth District Legionnaire", ""));
|
||||
cubeCards.add(new CardIdentity("Thorn of the Black Rose", ""));
|
||||
cubeCards.add(new CardIdentity("Thornweald Archer", ""));
|
||||
cubeCards.add(new CardIdentity("Thornwood Falls", ""));
|
||||
cubeCards.add(new CardIdentity("Thought Scour", ""));
|
||||
cubeCards.add(new CardIdentity("Thraben Charm", ""));
|
||||
cubeCards.add(new CardIdentity("Thraben Inspector", ""));
|
||||
cubeCards.add(new CardIdentity("Thrill-Kill Assassin", ""));
|
||||
cubeCards.add(new CardIdentity("Thundering Giant", ""));
|
||||
cubeCards.add(new CardIdentity("Thunderous Wrath", ""));
|
||||
cubeCards.add(new CardIdentity("Timber Gorge", ""));
|
||||
cubeCards.add(new CardIdentity("Time to Feed", ""));
|
||||
cubeCards.add(new CardIdentity("Thriving Grubs", ""));
|
||||
cubeCards.add(new CardIdentity("Thriving Skyclaw", ""));
|
||||
cubeCards.add(new CardIdentity("Tithe Drinker", ""));
|
||||
cubeCards.add(new CardIdentity("Totem-Guide Hartebeest", ""));
|
||||
cubeCards.add(new CardIdentity("Tithing Blade", ""));
|
||||
cubeCards.add(new CardIdentity("Tocasia's Dig Site", ""));
|
||||
cubeCards.add(new CardIdentity("Tolarian Terror", ""));
|
||||
cubeCards.add(new CardIdentity("Topan Freeblade", ""));
|
||||
cubeCards.add(new CardIdentity("Tortured Existence", ""));
|
||||
cubeCards.add(new CardIdentity("Tragic Slip", ""));
|
||||
cubeCards.add(new CardIdentity("Tramway Station", ""));
|
||||
cubeCards.add(new CardIdentity("Tranquil Cove", ""));
|
||||
cubeCards.add(new CardIdentity("Tranquil Expanse", ""));
|
||||
cubeCards.add(new CardIdentity("Travel Preparations", ""));
|
||||
cubeCards.add(new CardIdentity("Tranquil Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Trapped in the Screen", ""));
|
||||
cubeCards.add(new CardIdentity("Treasure Cruise", ""));
|
||||
cubeCards.add(new CardIdentity("Treetop Snarespinner", ""));
|
||||
cubeCards.add(new CardIdentity("Triplicate Spirits", ""));
|
||||
cubeCards.add(new CardIdentity("Typhoid Rats", ""));
|
||||
cubeCards.add(new CardIdentity("Troll of Khazad-dum", ""));
|
||||
cubeCards.add(new CardIdentity("Trumpeting Herd", ""));
|
||||
cubeCards.add(new CardIdentity("Tuskeri Firewalker", ""));
|
||||
cubeCards.add(new CardIdentity("Tuskguard Captain", ""));
|
||||
cubeCards.add(new CardIdentity("Twisted Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Ulamog's Crusher", ""));
|
||||
cubeCards.add(new CardIdentity("Ulvenwald Captive", ""));
|
||||
cubeCards.add(new CardIdentity("Unable to Scream", ""));
|
||||
cubeCards.add(new CardIdentity("Unbounded Potential", ""));
|
||||
cubeCards.add(new CardIdentity("Underworld Rage-Hound", ""));
|
||||
cubeCards.add(new CardIdentity("Undying Malice", ""));
|
||||
cubeCards.add(new CardIdentity("Unearth", ""));
|
||||
cubeCards.add(new CardIdentity("Unmake", ""));
|
||||
cubeCards.add(new CardIdentity("Vampire Interloper", ""));
|
||||
cubeCards.add(new CardIdentity("Unwilling Ingredient", ""));
|
||||
cubeCards.add(new CardIdentity("Urban Daggertooth", ""));
|
||||
cubeCards.add(new CardIdentity("Utopia Sprawl", ""));
|
||||
cubeCards.add(new CardIdentity("Vampire Lacerator", ""));
|
||||
cubeCards.add(new CardIdentity("Vampire Sovereign", ""));
|
||||
cubeCards.add(new CardIdentity("Vault Skirge", ""));
|
||||
cubeCards.add(new CardIdentity("Viashino Firstblade", ""));
|
||||
cubeCards.add(new CardIdentity("Vendetta", ""));
|
||||
cubeCards.add(new CardIdentity("Village Rites", ""));
|
||||
cubeCards.add(new CardIdentity("Vines of Vastwood", ""));
|
||||
cubeCards.add(new CardIdentity("Voldaren Duelist", ""));
|
||||
cubeCards.add(new CardIdentity("Vizier of Tumbling Sands", ""));
|
||||
cubeCards.add(new CardIdentity("Volatile Wanderglyph", ""));
|
||||
cubeCards.add(new CardIdentity("Voracious Varmint", ""));
|
||||
cubeCards.add(new CardIdentity("Voracious Vermin", ""));
|
||||
cubeCards.add(new CardIdentity("Vulshok Morningstar", ""));
|
||||
cubeCards.add(new CardIdentity("Vulshok Sorcerer", ""));
|
||||
cubeCards.add(new CardIdentity("Vulturous Aven", ""));
|
||||
cubeCards.add(new CardIdentity("Wakedancer", ""));
|
||||
cubeCards.add(new CardIdentity("Walker of the Grove", ""));
|
||||
cubeCards.add(new CardIdentity("Wall of Roots", ""));
|
||||
cubeCards.add(new CardIdentity("War Flare", ""));
|
||||
cubeCards.add(new CardIdentity("Warden of Evos Isle", ""));
|
||||
cubeCards.add(new CardIdentity("Warped Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Warren Pilferers", ""));
|
||||
cubeCards.add(new CardIdentity("Wasteland Scorpion", ""));
|
||||
cubeCards.add(new CardIdentity("Waterknot", ""));
|
||||
cubeCards.add(new CardIdentity("Wary Thespian", ""));
|
||||
cubeCards.add(new CardIdentity("Waterfront District", ""));
|
||||
cubeCards.add(new CardIdentity("Wayfarer's Bauble", ""));
|
||||
cubeCards.add(new CardIdentity("Weakstone's Subjugation", ""));
|
||||
cubeCards.add(new CardIdentity("Werebear", ""));
|
||||
cubeCards.add(new CardIdentity("Whitemane Lion", ""));
|
||||
cubeCards.add(new CardIdentity("Wild Instincts", ""));
|
||||
cubeCards.add(new CardIdentity("Wild Mongrel", ""));
|
||||
cubeCards.add(new CardIdentity("Wild Nacatl", ""));
|
||||
cubeCards.add(new CardIdentity("Wildsize", ""));
|
||||
cubeCards.add(new CardIdentity("Will-Forged Golem", ""));
|
||||
cubeCards.add(new CardIdentity("Wind-Scarred Crag", ""));
|
||||
cubeCards.add(new CardIdentity("Winged Coatl", ""));
|
||||
cubeCards.add(new CardIdentity("Wojek Halberdiers", ""));
|
||||
cubeCards.add(new CardIdentity("Woodland Stream", ""));
|
||||
cubeCards.add(new CardIdentity("Wrecking Ball", ""));
|
||||
cubeCards.add(new CardIdentity("Wretched Gryff", ""));
|
||||
cubeCards.add(new CardIdentity("Wild Growth", ""));
|
||||
cubeCards.add(new CardIdentity("Wildfire Elemental", ""));
|
||||
cubeCards.add(new CardIdentity("Winding Way", ""));
|
||||
cubeCards.add(new CardIdentity("Winter Eladrin", ""));
|
||||
cubeCards.add(new CardIdentity("Witch's Cottage", ""));
|
||||
cubeCards.add(new CardIdentity("Wither and Bloom", ""));
|
||||
cubeCards.add(new CardIdentity("Witherbloom Campus", ""));
|
||||
cubeCards.add(new CardIdentity("Witness Protection", ""));
|
||||
cubeCards.add(new CardIdentity("Witty Roastmaster", ""));
|
||||
cubeCards.add(new CardIdentity("Wrangle", ""));
|
||||
cubeCards.add(new CardIdentity("Wrenn's Resolve", ""));
|
||||
cubeCards.add(new CardIdentity("Writhing Chrysalis", ""));
|
||||
cubeCards.add(new CardIdentity("Yavimaya Elder", ""));
|
||||
cubeCards.add(new CardIdentity("Yavimaya Sapherd", ""));
|
||||
cubeCards.add(new CardIdentity("Yotian Soldier", ""));
|
||||
cubeCards.add(new CardIdentity("Yavimaya Steelcrusher", ""));
|
||||
cubeCards.add(new CardIdentity("You Hear Something on Watch", ""));
|
||||
cubeCards.add(new CardIdentity("You Meet in a Tavern", ""));
|
||||
cubeCards.add(new CardIdentity("Young Blue Dragon", ""));
|
||||
cubeCards.add(new CardIdentity("Zephyr Winder", ""));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,8 +13,15 @@ import mage.game.draft.DraftCube;
|
|||
public class VintageCube extends DraftCube {
|
||||
|
||||
public VintageCube() {
|
||||
super("MTGO Vintage Cube", "", 2025, 4, 23);
|
||||
super("MTGO Vintage Cube", "", 2025, 10, 1);
|
||||
|
||||
//cubeCards.add(new CardIdentity("Ademi of the Silkchutes", ""));
|
||||
//cubeCards.add(new CardIdentity("Cren, Undercity Dreamer", ""));
|
||||
//cubeCards.add(new CardIdentity("Goben, Gene-Splice Savant", ""));
|
||||
//cubeCards.add(new CardIdentity("Makdee and Itla, Skysnarers", ""));
|
||||
//cubeCards.add(new CardIdentity("Nia, Skysail Storyteller", ""));
|
||||
//cubeCards.add(new CardIdentity("Spectral Restitching", ""));
|
||||
//cubeCards.add(new CardIdentity("Walk-In Closet // Forgotten Cellar", ""));
|
||||
cubeCards.add(new CardIdentity("Abhorrent Oculus", ""));
|
||||
cubeCards.add(new CardIdentity("Abrade", ""));
|
||||
cubeCards.add(new CardIdentity("Adeline, Resplendent Cathar", ""));
|
||||
|
|
@ -29,15 +36,18 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Arena of Glory", ""));
|
||||
cubeCards.add(new CardIdentity("Arid Mesa", ""));
|
||||
cubeCards.add(new CardIdentity("Arwen, Mortal Queen", ""));
|
||||
cubeCards.add(new CardIdentity("Astrologian's Planisphere", ""));
|
||||
cubeCards.add(new CardIdentity("Atraxa, Grand Unifier", ""));
|
||||
cubeCards.add(new CardIdentity("Avacyn's Pilgrim", ""));
|
||||
cubeCards.add(new CardIdentity("Badlands", ""));
|
||||
cubeCards.add(new CardIdentity("Balance", ""));
|
||||
cubeCards.add(new CardIdentity("Baleful Mastery", ""));
|
||||
cubeCards.add(new CardIdentity("Baleful Strix", ""));
|
||||
cubeCards.add(new CardIdentity("Baloth Prime", ""));
|
||||
cubeCards.add(new CardIdentity("Barrowgoyf", ""));
|
||||
cubeCards.add(new CardIdentity("Basalt Monolith", ""));
|
||||
cubeCards.add(new CardIdentity("Bayou", ""));
|
||||
cubeCards.add(new CardIdentity("Berserk", ""));
|
||||
cubeCards.add(new CardIdentity("Birds of Paradise", ""));
|
||||
cubeCards.add(new CardIdentity("Bitter Triumph", ""));
|
||||
cubeCards.add(new CardIdentity("Black Lotus", ""));
|
||||
|
|
@ -47,15 +57,16 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Blightsteel Colossus", ""));
|
||||
cubeCards.add(new CardIdentity("Blood Crypt", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodbraid Challenger", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodchief's Thirst", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodstained Mire", ""));
|
||||
cubeCards.add(new CardIdentity("Bloodtithe Harvester", ""));
|
||||
cubeCards.add(new CardIdentity("Blooming Marsh", ""));
|
||||
cubeCards.add(new CardIdentity("Bolas's Citadel", ""));
|
||||
cubeCards.add(new CardIdentity("Bone Shards", ""));
|
||||
cubeCards.add(new CardIdentity("Bonecrusher Giant", ""));
|
||||
cubeCards.add(new CardIdentity("Bonehoard Dracosaur", ""));
|
||||
cubeCards.add(new CardIdentity("Boseiju, Who Endures", ""));
|
||||
cubeCards.add(new CardIdentity("Botanical Sanctum", ""));
|
||||
cubeCards.add(new CardIdentity("Bountiful Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Brain Freeze", ""));
|
||||
cubeCards.add(new CardIdentity("Brainstorm", ""));
|
||||
cubeCards.add(new CardIdentity("Brainsurge", ""));
|
||||
|
|
@ -71,6 +82,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Carnage Interpreter", ""));
|
||||
cubeCards.add(new CardIdentity("Cathar Commando", ""));
|
||||
cubeCards.add(new CardIdentity("Caustic Bronco", ""));
|
||||
cubeCards.add(new CardIdentity("Cecil, Dark Knight", ""));
|
||||
cubeCards.add(new CardIdentity("Celestial Colonnade", ""));
|
||||
cubeCards.add(new CardIdentity("Chain Lightning", ""));
|
||||
cubeCards.add(new CardIdentity("Chain of Smog", ""));
|
||||
|
|
@ -80,25 +92,26 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Chromatic Star", ""));
|
||||
cubeCards.add(new CardIdentity("Chrome Mox", ""));
|
||||
cubeCards.add(new CardIdentity("City of Traitors", ""));
|
||||
cubeCards.add(new CardIdentity("Clarion Conqueror", ""));
|
||||
cubeCards.add(new CardIdentity("Coalition Relic", ""));
|
||||
cubeCards.add(new CardIdentity("Collective Brutality", ""));
|
||||
cubeCards.add(new CardIdentity("Commercial District", ""));
|
||||
cubeCards.add(new CardIdentity("Concealed Courtyard", ""));
|
||||
cubeCards.add(new CardIdentity("Concealing Curtains", ""));
|
||||
cubeCards.add(new CardIdentity("Consider", ""));
|
||||
cubeCards.add(new CardIdentity("Consult the Star Charts", ""));
|
||||
cubeCards.add(new CardIdentity("Containment Priest", ""));
|
||||
cubeCards.add(new CardIdentity("Copperline Gorge", ""));
|
||||
cubeCards.add(new CardIdentity("Cori-Steel Cutter", ""));
|
||||
cubeCards.add(new CardIdentity("Corpse Dance", ""));
|
||||
cubeCards.add(new CardIdentity("Cosmogrand Zenith", ""));
|
||||
cubeCards.add(new CardIdentity("Council's Judgment", ""));
|
||||
cubeCards.add(new CardIdentity("Counterspell", ""));
|
||||
cubeCards.add(new CardIdentity("Courser of Kruphix", ""));
|
||||
cubeCards.add(new CardIdentity("Coveted Jewel", ""));
|
||||
cubeCards.add(new CardIdentity("Crabomination", ""));
|
||||
cubeCards.add(new CardIdentity("Craterhoof Behemoth", ""));
|
||||
cubeCards.add(new CardIdentity("Creeping Tar Pit", ""));
|
||||
cubeCards.add(new CardIdentity("Crop Rotation", ""));
|
||||
cubeCards.add(new CardIdentity("Crucible of Worlds", ""));
|
||||
cubeCards.add(new CardIdentity("Cryptic Command", ""));
|
||||
cubeCards.add(new CardIdentity("Currency Converter", ""));
|
||||
cubeCards.add(new CardIdentity("Cut Down", ""));
|
||||
|
|
@ -122,6 +135,8 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Displacer Kitten", ""));
|
||||
cubeCards.add(new CardIdentity("Doomsday", ""));
|
||||
cubeCards.add(new CardIdentity("Dragon's Rage Channeler", ""));
|
||||
cubeCards.add(new CardIdentity("Dreadhorde Arcanist", ""));
|
||||
cubeCards.add(new CardIdentity("Duelist of the Mind", ""));
|
||||
cubeCards.add(new CardIdentity("Duress", ""));
|
||||
cubeCards.add(new CardIdentity("Eagles of the North", ""));
|
||||
cubeCards.add(new CardIdentity("Echo of Eons", ""));
|
||||
|
|
@ -133,8 +148,8 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Embereth Shieldbreaker", ""));
|
||||
cubeCards.add(new CardIdentity("Emperor of Bones", ""));
|
||||
cubeCards.add(new CardIdentity("Emrakul, the Aeons Torn", ""));
|
||||
cubeCards.add(new CardIdentity("Emry, Lurker of the Loch", ""));
|
||||
cubeCards.add(new CardIdentity("Endurance", ""));
|
||||
cubeCards.add(new CardIdentity("Enduring Curiosity", ""));
|
||||
cubeCards.add(new CardIdentity("Enduring Innocence", ""));
|
||||
cubeCards.add(new CardIdentity("Entomb", ""));
|
||||
cubeCards.add(new CardIdentity("Ephemerate", ""));
|
||||
|
|
@ -159,27 +174,26 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Field of the Dead", ""));
|
||||
cubeCards.add(new CardIdentity("Fiery Confluence", ""));
|
||||
cubeCards.add(new CardIdentity("Figure of Destiny", ""));
|
||||
cubeCards.add(new CardIdentity("Fire // Ice", ""));
|
||||
cubeCards.add(new CardIdentity("Fire Covenant", ""));
|
||||
cubeCards.add(new CardIdentity("Fireblast", ""));
|
||||
cubeCards.add(new CardIdentity("Firebolt", ""));
|
||||
cubeCards.add(new CardIdentity("Flame Slash", ""));
|
||||
cubeCards.add(new CardIdentity("Flame of Anor", ""));
|
||||
cubeCards.add(new CardIdentity("Flash", ""));
|
||||
cubeCards.add(new CardIdentity("Flickerwisp", ""));
|
||||
cubeCards.add(new CardIdentity("Flooded Strand", ""));
|
||||
cubeCards.add(new CardIdentity("Floodpits Drowner", ""));
|
||||
cubeCards.add(new CardIdentity("Force of Negation", ""));
|
||||
cubeCards.add(new CardIdentity("Force of Vigor", ""));
|
||||
cubeCards.add(new CardIdentity("Force of Will", ""));
|
||||
cubeCards.add(new CardIdentity("Forensic Gadgeteer", ""));
|
||||
cubeCards.add(new CardIdentity("Forth Eorlingas!", ""));
|
||||
cubeCards.add(new CardIdentity("Fractured Identity", ""));
|
||||
cubeCards.add(new CardIdentity("Frantic Search", ""));
|
||||
cubeCards.add(new CardIdentity("Fury", ""));
|
||||
cubeCards.add(new CardIdentity("Fyndhorn Elves", ""));
|
||||
cubeCards.add(new CardIdentity("Gaea's Cradle", ""));
|
||||
cubeCards.add(new CardIdentity("Galvanic Blast", ""));
|
||||
cubeCards.add(new CardIdentity("Galvanic Discharge", ""));
|
||||
cubeCards.add(new CardIdentity("General Ferrous Rokiric", ""));
|
||||
cubeCards.add(new CardIdentity("Gau, Feral Youth", ""));
|
||||
cubeCards.add(new CardIdentity("Generous Ent", ""));
|
||||
cubeCards.add(new CardIdentity("Generous Plunderer", ""));
|
||||
cubeCards.add(new CardIdentity("Get Lost", ""));
|
||||
|
|
@ -192,9 +206,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Goblin Rabblemaster", ""));
|
||||
cubeCards.add(new CardIdentity("Godless Shrine", ""));
|
||||
cubeCards.add(new CardIdentity("Goldspan Dragon", ""));
|
||||
cubeCards.add(new CardIdentity("Golos, Tireless Pilgrim", ""));
|
||||
cubeCards.add(new CardIdentity("Grave Titan", ""));
|
||||
cubeCards.add(new CardIdentity("Greasewrench Goblin", ""));
|
||||
cubeCards.add(new CardIdentity("Green Sun's Zenith", ""));
|
||||
cubeCards.add(new CardIdentity("Grief", ""));
|
||||
cubeCards.add(new CardIdentity("Grim Monolith", ""));
|
||||
|
|
@ -208,14 +220,11 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Haywire Mite", ""));
|
||||
cubeCards.add(new CardIdentity("Headliner Scarlett", ""));
|
||||
cubeCards.add(new CardIdentity("Hedge Maze", ""));
|
||||
cubeCards.add(new CardIdentity("Heritage Reclamation", ""));
|
||||
cubeCards.add(new CardIdentity("Hero of Bladehold", ""));
|
||||
cubeCards.add(new CardIdentity("Hexdrinker", ""));
|
||||
cubeCards.add(new CardIdentity("High Tide", ""));
|
||||
cubeCards.add(new CardIdentity("Horizon Canopy", ""));
|
||||
cubeCards.add(new CardIdentity("Huatli, Poet of Unity", ""));
|
||||
cubeCards.add(new CardIdentity("Hullbreacher", ""));
|
||||
cubeCards.add(new CardIdentity("Hymn to Tourach", ""));
|
||||
cubeCards.add(new CardIdentity("Icetill Explorer", ""));
|
||||
cubeCards.add(new CardIdentity("Ignoble Hierarch", ""));
|
||||
cubeCards.add(new CardIdentity("Imperial Seal", ""));
|
||||
cubeCards.add(new CardIdentity("Indatha Triome", ""));
|
||||
|
|
@ -223,7 +232,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Inquisition of Kozilek", ""));
|
||||
cubeCards.add(new CardIdentity("Inspiring Vantage", ""));
|
||||
cubeCards.add(new CardIdentity("Inti, Seneschal of the Sun", ""));
|
||||
cubeCards.add(new CardIdentity("Intrepid Adversary", ""));
|
||||
cubeCards.add(new CardIdentity("Invigorate", ""));
|
||||
cubeCards.add(new CardIdentity("Ivora, Insatiable Heir", ""));
|
||||
cubeCards.add(new CardIdentity("Jace, Vryn's Prodigy", ""));
|
||||
cubeCards.add(new CardIdentity("Jace, Wielder of Mysteries", ""));
|
||||
|
|
@ -240,14 +249,15 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Kellan, Planar Trailblazer", ""));
|
||||
cubeCards.add(new CardIdentity("Ketria Triome", ""));
|
||||
cubeCards.add(new CardIdentity("Kitesail Freebooter", ""));
|
||||
cubeCards.add(new CardIdentity("Kitsa, Otterball Elite", ""));
|
||||
cubeCards.add(new CardIdentity("Knight of the Reliquary", ""));
|
||||
cubeCards.add(new CardIdentity("Kolaghan's Command", ""));
|
||||
cubeCards.add(new CardIdentity("Laelia, the Blade Reforged", ""));
|
||||
cubeCards.add(new CardIdentity("Lavaspur Boots", ""));
|
||||
cubeCards.add(new CardIdentity("Ledger Shredder", ""));
|
||||
cubeCards.add(new CardIdentity("Legion Extruder", ""));
|
||||
cubeCards.add(new CardIdentity("Legolas's Quick Reflexes", ""));
|
||||
cubeCards.add(new CardIdentity("Leovold, Emissary of Trest", ""));
|
||||
cubeCards.add(new CardIdentity("Lethal Scheme", ""));
|
||||
cubeCards.add(new CardIdentity("Leyline Binding", ""));
|
||||
cubeCards.add(new CardIdentity("Library of Alexandria", ""));
|
||||
cubeCards.add(new CardIdentity("Life // Death", ""));
|
||||
|
|
@ -260,6 +270,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Llanowar Elves", ""));
|
||||
cubeCards.add(new CardIdentity("Loot, the Pathfinder", ""));
|
||||
cubeCards.add(new CardIdentity("Loran of the Third Path", ""));
|
||||
cubeCards.add(new CardIdentity("Lorien Revealed", ""));
|
||||
cubeCards.add(new CardIdentity("Lose Focus", ""));
|
||||
cubeCards.add(new CardIdentity("Lotus Cobra", ""));
|
||||
cubeCards.add(new CardIdentity("Lotus Petal", ""));
|
||||
|
|
@ -267,10 +278,10 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Lurrus of the Dream-Den", ""));
|
||||
cubeCards.add(new CardIdentity("Lush Portico", ""));
|
||||
cubeCards.add(new CardIdentity("Lutri, the Spellchaser", ""));
|
||||
cubeCards.add(new CardIdentity("Lorien Revealed", ""));
|
||||
cubeCards.add(new CardIdentity("Magda, Brazen Outlaw", ""));
|
||||
cubeCards.add(new CardIdentity("Malcolm, Alluring Scoundrel", ""));
|
||||
cubeCards.add(new CardIdentity("Malevolent Rumble", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Confluence", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Crypt", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Drain", ""));
|
||||
cubeCards.add(new CardIdentity("Mana Leak", ""));
|
||||
|
|
@ -278,12 +289,12 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Mana Vault", ""));
|
||||
cubeCards.add(new CardIdentity("Manamorphose", ""));
|
||||
cubeCards.add(new CardIdentity("Manifold Key", ""));
|
||||
cubeCards.add(new CardIdentity("March of Otherworldly Light", ""));
|
||||
cubeCards.add(new CardIdentity("Marsh Flats", ""));
|
||||
cubeCards.add(new CardIdentity("Memory Jar", ""));
|
||||
cubeCards.add(new CardIdentity("Memory Lapse", ""));
|
||||
cubeCards.add(new CardIdentity("Metamorphosis Fanatic", ""));
|
||||
cubeCards.add(new CardIdentity("Meticulous Archive", ""));
|
||||
cubeCards.add(new CardIdentity("Mightform Harmonizer", ""));
|
||||
cubeCards.add(new CardIdentity("Mind Stone", ""));
|
||||
cubeCards.add(new CardIdentity("Mind Twist", ""));
|
||||
cubeCards.add(new CardIdentity("Mine Collapse", ""));
|
||||
|
|
@ -292,7 +303,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Mishra's Bauble", ""));
|
||||
cubeCards.add(new CardIdentity("Mishra's Workshop", ""));
|
||||
cubeCards.add(new CardIdentity("Misty Rainforest", ""));
|
||||
cubeCards.add(new CardIdentity("Monastery Mentor", ""));
|
||||
cubeCards.add(new CardIdentity("Monstrous Rage", ""));
|
||||
cubeCards.add(new CardIdentity("Mother of Runes", ""));
|
||||
cubeCards.add(new CardIdentity("Mox Diamond", ""));
|
||||
cubeCards.add(new CardIdentity("Mox Emerald", ""));
|
||||
|
|
@ -301,19 +312,18 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Mox Pearl", ""));
|
||||
cubeCards.add(new CardIdentity("Mox Ruby", ""));
|
||||
cubeCards.add(new CardIdentity("Mox Sapphire", ""));
|
||||
cubeCards.add(new CardIdentity("Multiversal Passage", ""));
|
||||
cubeCards.add(new CardIdentity("Mutagenic Growth", ""));
|
||||
cubeCards.add(new CardIdentity("Myr Battlesphere", ""));
|
||||
cubeCards.add(new CardIdentity("Mystic Confluence", ""));
|
||||
cubeCards.add(new CardIdentity("Mystical Tutor", ""));
|
||||
cubeCards.add(new CardIdentity("Nadu, Winged Wisdom", ""));
|
||||
cubeCards.add(new CardIdentity("Narset, Parter of Veils", ""));
|
||||
cubeCards.add(new CardIdentity("Natural Order", ""));
|
||||
cubeCards.add(new CardIdentity("Nature's Lore", ""));
|
||||
cubeCards.add(new CardIdentity("Necromancy", ""));
|
||||
cubeCards.add(new CardIdentity("Nethergoyf", ""));
|
||||
cubeCards.add(new CardIdentity("Nettlecyst", ""));
|
||||
cubeCards.add(new CardIdentity("Nexus of Becoming", ""));
|
||||
cubeCards.add(new CardIdentity("Night's Whisper", ""));
|
||||
cubeCards.add(new CardIdentity("Nissa, Ascended Animist", ""));
|
||||
cubeCards.add(new CardIdentity("Nissa, Who Shakes the World", ""));
|
||||
cubeCards.add(new CardIdentity("No More Lies", ""));
|
||||
cubeCards.add(new CardIdentity("Noble Hierarch", ""));
|
||||
|
|
@ -328,12 +338,12 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Orcish Lumberjack", ""));
|
||||
cubeCards.add(new CardIdentity("Otawara, Soaring City", ""));
|
||||
cubeCards.add(new CardIdentity("Otharri, Suns' Glory", ""));
|
||||
cubeCards.add(new CardIdentity("Ouroboroid", ""));
|
||||
cubeCards.add(new CardIdentity("Oust", ""));
|
||||
cubeCards.add(new CardIdentity("Overgrown Tomb", ""));
|
||||
cubeCards.add(new CardIdentity("Overlord of the Balemurk", ""));
|
||||
cubeCards.add(new CardIdentity("Overlord of the Mistmoors", ""));
|
||||
cubeCards.add(new CardIdentity("Palace Jailer", ""));
|
||||
cubeCards.add(new CardIdentity("Palantir of Orthanc", ""));
|
||||
cubeCards.add(new CardIdentity("Paradoxical Outcome", ""));
|
||||
cubeCards.add(new CardIdentity("Parallax Wave", ""));
|
||||
cubeCards.add(new CardIdentity("Path to Exile", ""));
|
||||
|
|
@ -343,8 +353,8 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Phelia, Exuberant Shepherd", ""));
|
||||
cubeCards.add(new CardIdentity("Phlage, Titan of Fire's Fury", ""));
|
||||
cubeCards.add(new CardIdentity("Phyrexian Metamorph", ""));
|
||||
cubeCards.add(new CardIdentity("Phyrexian Revoker", ""));
|
||||
cubeCards.add(new CardIdentity("Pillage the Bog", ""));
|
||||
cubeCards.add(new CardIdentity("Plagon, Lord of the Beach", ""));
|
||||
cubeCards.add(new CardIdentity("Plateau", ""));
|
||||
cubeCards.add(new CardIdentity("Polluted Delta", ""));
|
||||
cubeCards.add(new CardIdentity("Ponder", ""));
|
||||
|
|
@ -355,17 +365,15 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Primeval Titan", ""));
|
||||
cubeCards.add(new CardIdentity("Prismatic Ending", ""));
|
||||
cubeCards.add(new CardIdentity("Prismatic Vista", ""));
|
||||
cubeCards.add(new CardIdentity("Proft's Eidetic Memory", ""));
|
||||
cubeCards.add(new CardIdentity("Psychic Frog", ""));
|
||||
cubeCards.add(new CardIdentity("Pyrogoyf", ""));
|
||||
cubeCards.add(new CardIdentity("Pyrokinesis", ""));
|
||||
cubeCards.add(new CardIdentity("Qarsi Revenant", ""));
|
||||
cubeCards.add(new CardIdentity("Quantum Riddler", ""));
|
||||
cubeCards.add(new CardIdentity("Questing Beast", ""));
|
||||
cubeCards.add(new CardIdentity("Raffine's Tower", ""));
|
||||
cubeCards.add(new CardIdentity("Raffine, Scheming Seer", ""));
|
||||
cubeCards.add(new CardIdentity("Ragavan, Nimble Pilferer", ""));
|
||||
cubeCards.add(new CardIdentity("Rain of Filth", ""));
|
||||
cubeCards.add(new CardIdentity("Rampaging Raptor", ""));
|
||||
cubeCards.add(new CardIdentity("Ramunap Excavator", ""));
|
||||
cubeCards.add(new CardIdentity("Rancor", ""));
|
||||
cubeCards.add(new CardIdentity("Raucous Theater", ""));
|
||||
cubeCards.add(new CardIdentity("Raugrin Triome", ""));
|
||||
cubeCards.add(new CardIdentity("Razorverge Thicket", ""));
|
||||
|
|
@ -374,19 +382,14 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Relic of Sauron", ""));
|
||||
cubeCards.add(new CardIdentity("Remand", ""));
|
||||
cubeCards.add(new CardIdentity("Reprieve", ""));
|
||||
cubeCards.add(new CardIdentity("Restless Vinestalk", ""));
|
||||
cubeCards.add(new CardIdentity("Retrofitter Foundry", ""));
|
||||
cubeCards.add(new CardIdentity("Riverpyre Verge", ""));
|
||||
cubeCards.add(new CardIdentity("Robber of the Rich", ""));
|
||||
cubeCards.add(new CardIdentity("Rofellos, Llanowar Emissary", ""));
|
||||
cubeCards.add(new CardIdentity("Sacred Foundry", ""));
|
||||
cubeCards.add(new CardIdentity("Saheeli, Sublime Artificer", ""));
|
||||
cubeCards.add(new CardIdentity("Sandstorm Salvager", ""));
|
||||
cubeCards.add(new CardIdentity("Satya, Aetherflux Genius", ""));
|
||||
cubeCards.add(new CardIdentity("Savai Triome", ""));
|
||||
cubeCards.add(new CardIdentity("Savannah", ""));
|
||||
cubeCards.add(new CardIdentity("Scalding Tarn", ""));
|
||||
cubeCards.add(new CardIdentity("Scrapwork Mutt", ""));
|
||||
cubeCards.add(new CardIdentity("Screaming Nemesis", ""));
|
||||
cubeCards.add(new CardIdentity("Scrubland", ""));
|
||||
cubeCards.add(new CardIdentity("Scythecat Cub", ""));
|
||||
|
|
@ -394,14 +397,13 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Seasoned Pyromancer", ""));
|
||||
cubeCards.add(new CardIdentity("Securitron Squadron", ""));
|
||||
cubeCards.add(new CardIdentity("Sedgemoor Witch", ""));
|
||||
cubeCards.add(new CardIdentity("Seething Song", ""));
|
||||
cubeCards.add(new CardIdentity("Sensei's Divining Top", ""));
|
||||
cubeCards.add(new CardIdentity("Sentinel of the Nameless City", ""));
|
||||
cubeCards.add(new CardIdentity("Serra Paragon", ""));
|
||||
cubeCards.add(new CardIdentity("Shadowspear", ""));
|
||||
cubeCards.add(new CardIdentity("Shadowy Backstreet", ""));
|
||||
cubeCards.add(new CardIdentity("Shallow Grave", ""));
|
||||
cubeCards.add(new CardIdentity("Shelldock Isle", ""));
|
||||
cubeCards.add(new CardIdentity("Sheltering Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Sheoldred's Edict", ""));
|
||||
cubeCards.add(new CardIdentity("Sheoldred, the Apocalypse", ""));
|
||||
cubeCards.add(new CardIdentity("Shifting Woodland", ""));
|
||||
|
|
@ -411,7 +413,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Six", ""));
|
||||
cubeCards.add(new CardIdentity("Skullclamp", ""));
|
||||
cubeCards.add(new CardIdentity("Skyclave Apparition", ""));
|
||||
cubeCards.add(new CardIdentity("Slimefoot and Squee", ""));
|
||||
cubeCards.add(new CardIdentity("Slickshot Show-Off", ""));
|
||||
cubeCards.add(new CardIdentity("Smuggler's Copter", ""));
|
||||
cubeCards.add(new CardIdentity("Snapcaster Mage", ""));
|
||||
cubeCards.add(new CardIdentity("Sneak Attack", ""));
|
||||
|
|
@ -426,8 +428,8 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Spellseeker", ""));
|
||||
cubeCards.add(new CardIdentity("Spirebluff Canal", ""));
|
||||
cubeCards.add(new CardIdentity("Springheart Nantuko", ""));
|
||||
cubeCards.add(new CardIdentity("Spyglass Siren", ""));
|
||||
cubeCards.add(new CardIdentity("Staff of the Storyteller", ""));
|
||||
cubeCards.add(new CardIdentity("Starting Town", ""));
|
||||
cubeCards.add(new CardIdentity("Static Prison", ""));
|
||||
cubeCards.add(new CardIdentity("Steam Vents", ""));
|
||||
cubeCards.add(new CardIdentity("Stern Scolding", ""));
|
||||
|
|
@ -440,7 +442,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Sunbaked Canyon", ""));
|
||||
cubeCards.add(new CardIdentity("Sunbillow Verge", ""));
|
||||
cubeCards.add(new CardIdentity("Sunfall", ""));
|
||||
cubeCards.add(new CardIdentity("Sunken Ruins", ""));
|
||||
cubeCards.add(new CardIdentity("Suplex", ""));
|
||||
cubeCards.add(new CardIdentity("Sword of the Meek", ""));
|
||||
cubeCards.add(new CardIdentity("Swords to Plowshares", ""));
|
||||
cubeCards.add(new CardIdentity("Sylvan Caryatid", ""));
|
||||
|
|
@ -455,7 +457,6 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Tamiyo, Collector of Tales", ""));
|
||||
cubeCards.add(new CardIdentity("Tamiyo, Inquisitive Student", ""));
|
||||
cubeCards.add(new CardIdentity("Tarfire", ""));
|
||||
cubeCards.add(new CardIdentity("Tarmogoyf", ""));
|
||||
cubeCards.add(new CardIdentity("Tear Asunder", ""));
|
||||
cubeCards.add(new CardIdentity("Teferi, Hero of Dominaria", ""));
|
||||
cubeCards.add(new CardIdentity("Teferi, Time Raveler", ""));
|
||||
|
|
@ -463,9 +464,10 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Tendrils of Agony", ""));
|
||||
cubeCards.add(new CardIdentity("Territorial Kavu", ""));
|
||||
cubeCards.add(new CardIdentity("Tersa Lightshatter", ""));
|
||||
cubeCards.add(new CardIdentity("Tezzeret, Cruel Captain", ""));
|
||||
cubeCards.add(new CardIdentity("Thalia, Guardian of Thraben", ""));
|
||||
cubeCards.add(new CardIdentity("Thassa's Oracle", ""));
|
||||
cubeCards.add(new CardIdentity("The Aetherspark", ""));
|
||||
cubeCards.add(new CardIdentity("The Endstone", ""));
|
||||
cubeCards.add(new CardIdentity("The Mightstone and Weakstone", ""));
|
||||
cubeCards.add(new CardIdentity("The One Ring", ""));
|
||||
cubeCards.add(new CardIdentity("The Wandering Emperor", ""));
|
||||
|
|
@ -479,7 +481,9 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Thraben Inspector", ""));
|
||||
cubeCards.add(new CardIdentity("Through the Breach", ""));
|
||||
cubeCards.add(new CardIdentity("Thundering Falls", ""));
|
||||
cubeCards.add(new CardIdentity("Thundertrap Trainer", ""));
|
||||
cubeCards.add(new CardIdentity("Tidehollow Sculler", ""));
|
||||
cubeCards.add(new CardIdentity("Tifa Lockhart", ""));
|
||||
cubeCards.add(new CardIdentity("Time Spiral", ""));
|
||||
cubeCards.add(new CardIdentity("Time Walk", ""));
|
||||
cubeCards.add(new CardIdentity("Time Warp", ""));
|
||||
|
|
@ -492,18 +496,14 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Torsten, Founder of Benalia", ""));
|
||||
cubeCards.add(new CardIdentity("Touch the Spirit Realm", ""));
|
||||
cubeCards.add(new CardIdentity("Toxic Deluge", ""));
|
||||
cubeCards.add(new CardIdentity("Treachery", ""));
|
||||
cubeCards.add(new CardIdentity("Traveling Chocobo", ""));
|
||||
cubeCards.add(new CardIdentity("Treasure Cruise", ""));
|
||||
cubeCards.add(new CardIdentity("Trinket Mage", ""));
|
||||
cubeCards.add(new CardIdentity("Triplicate Titan", ""));
|
||||
//cubeCards.add(new CardIdentity("Troll of Khazad-dom", ""));
|
||||
cubeCards.add(new CardIdentity("Troll of Khazad-dum", ""));
|
||||
cubeCards.add(new CardIdentity("Tropical Island", ""));
|
||||
cubeCards.add(new CardIdentity("True-Name Nemesis", ""));
|
||||
cubeCards.add(new CardIdentity("Trumpeting Carnosaur", ""));
|
||||
cubeCards.add(new CardIdentity("Tundra", ""));
|
||||
cubeCards.add(new CardIdentity("Turnabout", ""));
|
||||
cubeCards.add(new CardIdentity("Twisted Landscape", ""));
|
||||
cubeCards.add(new CardIdentity("Ugin, Eye of the Storms", ""));
|
||||
cubeCards.add(new CardIdentity("Ulamog, the Infinite Gyre", ""));
|
||||
cubeCards.add(new CardIdentity("Ulvenwald Oddity", ""));
|
||||
cubeCards.add(new CardIdentity("Umezawa's Jitte", ""));
|
||||
cubeCards.add(new CardIdentity("Undercity Sewers", ""));
|
||||
|
|
@ -513,6 +513,7 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Unearth", ""));
|
||||
cubeCards.add(new CardIdentity("Unexpectedly Absent", ""));
|
||||
cubeCards.add(new CardIdentity("Unholy Heat", ""));
|
||||
cubeCards.add(new CardIdentity("Unruly Krasis", ""));
|
||||
cubeCards.add(new CardIdentity("Upheaval", ""));
|
||||
cubeCards.add(new CardIdentity("Urborg, Tomb of Yawgmoth", ""));
|
||||
cubeCards.add(new CardIdentity("Uro, Titan of Nature's Wrath", ""));
|
||||
|
|
@ -526,10 +527,10 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Verdant Catacombs", ""));
|
||||
cubeCards.add(new CardIdentity("Vindicate", ""));
|
||||
cubeCards.add(new CardIdentity("Virtue of Loyalty", ""));
|
||||
cubeCards.add(new CardIdentity("Vivi Ornitier", ""));
|
||||
cubeCards.add(new CardIdentity("Voice of Victory", ""));
|
||||
cubeCards.add(new CardIdentity("Volcanic Island", ""));
|
||||
cubeCards.add(new CardIdentity("Voldaren Epicure", ""));
|
||||
//cubeCards.add(new CardIdentity("Walk-In Closet // Forgotten Cellar", ""));
|
||||
cubeCards.add(new CardIdentity("Walking Ballista", ""));
|
||||
cubeCards.add(new CardIdentity("Wasteland", ""));
|
||||
cubeCards.add(new CardIdentity("Wastewood Verge", ""));
|
||||
|
|
@ -544,7 +545,6 @@ public class VintageCube extends DraftCube {
|
|||
cubeCards.add(new CardIdentity("Witherbloom Apprentice", ""));
|
||||
cubeCards.add(new CardIdentity("Wooded Foothills", ""));
|
||||
cubeCards.add(new CardIdentity("Woodfall Primus", ""));
|
||||
cubeCards.add(new CardIdentity("Worldly Tutor", ""));
|
||||
cubeCards.add(new CardIdentity("Worldspine Wurm", ""));
|
||||
cubeCards.add(new CardIdentity("Wrath of God", ""));
|
||||
cubeCards.add(new CardIdentity("Wrenn and Six", ""));
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-tournament-constructed</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-tournament-sealed</artifactId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-server-plugins</artifactId>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-server</artifactId>
|
||||
|
|
@ -208,7 +208,7 @@
|
|||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-compress</artifactId>
|
||||
<version>1.27.1</version>
|
||||
<version>1.28.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.shiro</groupId>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
<parent>
|
||||
<groupId>org.mage</groupId>
|
||||
<artifactId>mage-root</artifactId>
|
||||
<version>1.4.57</version>
|
||||
<version>1.4.58</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>mage-sets</artifactId>
|
||||
|
|
|
|||
58
Mage.Sets/src/mage/cards/a/AangALotToLearn.java
Normal file
58
Mage.Sets/src/mage/cards/a/AangALotToLearn.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.condition.common.LessonsInGraveCondition;
|
||||
import mage.abilities.decorator.ConditionalContinuousEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangALotToLearn extends CardImpl {
|
||||
|
||||
public AangALotToLearn(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G/W}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Aang has vigilance as long as there's a Lesson card in your graveyard.
|
||||
this.addAbility(new SimpleStaticAbility(new ConditionalContinuousEffect(
|
||||
new GainAbilitySourceEffect(VigilanceAbility.getInstance(), Duration.WhileOnBattlefield),
|
||||
LessonsInGraveCondition.ONE, "{this} has vigilance as long as there's a Lesson card in your graveyard"
|
||||
)).addHint(LessonsInGraveCondition.getHint()));
|
||||
|
||||
// Whenever another creature you control dies, put a +1/+1 counter on Aang.
|
||||
this.addAbility(new DiesCreatureTriggeredAbility(
|
||||
new AddCountersSourceEffect(CounterType.P1P1.createInstance()),
|
||||
false, StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL
|
||||
));
|
||||
}
|
||||
|
||||
private AangALotToLearn(final AangALotToLearn card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangALotToLearn copy() {
|
||||
return new AangALotToLearn(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +1,39 @@
|
|||
package mage.cards.g;
|
||||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author weirddan455
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class GnarledGrovestrider extends CardImpl {
|
||||
public final class AangAirNomad extends CardImpl {
|
||||
|
||||
public GnarledGrovestrider(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
this.subtype.add(SubType.TREEFOLK);
|
||||
this.color.setGreen(true);
|
||||
public AangAirNomad(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}{W}");
|
||||
|
||||
// Back half of Dormant Grove
|
||||
this.nightCard = true;
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(6);
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Vigilance
|
||||
this.addAbility(VigilanceAbility.getInstance());
|
||||
|
||||
// Other creatures you control have vigilance.
|
||||
|
|
@ -39,12 +43,12 @@ public class GnarledGrovestrider extends CardImpl {
|
|||
)));
|
||||
}
|
||||
|
||||
private GnarledGrovestrider(final GnarledGrovestrider card) {
|
||||
private AangAirNomad(final AangAirNomad card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GnarledGrovestrider copy() {
|
||||
return new GnarledGrovestrider(this);
|
||||
public AangAirNomad copy() {
|
||||
return new AangAirNomad(this);
|
||||
}
|
||||
}
|
||||
67
Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java
Normal file
67
Mage.Sets/src/mage/cards/a/AangAirbendingMaster.java
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.OneOrMoreLeaveWithoutDyingTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.CountersControllerCount;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersPlayersEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.constants.TargetController;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.permanent.token.AllyToken;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangAirbendingMaster extends CardImpl {
|
||||
|
||||
private static final DynamicValue xValue = new CountersControllerCount(CounterType.EXPERIENCE);
|
||||
|
||||
public AangAirbendingMaster(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// When Aang enters, airbend another target creature.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect());
|
||||
ability.addTarget(new TargetPermanent(StaticFilters.FILTER_ANOTHER_TARGET_CREATURE));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever one or more creatures you control leave the battlefield without dying, you get an experience counter.
|
||||
this.addAbility(new OneOrMoreLeaveWithoutDyingTriggeredAbility(
|
||||
new AddCountersPlayersEffect(CounterType.EXPERIENCE.createInstance(), TargetController.YOU),
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURES
|
||||
));
|
||||
|
||||
// At the beginning of your upkeep, create a 1/1 white Ally creature token for each experience counter you have.
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new CreateTokenEffect(new AllyToken(), xValue)
|
||||
.setText("create a 1/1 white Ally creature token for each experience counter you have")));
|
||||
}
|
||||
|
||||
private AangAirbendingMaster(final AangAirbendingMaster card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangAirbendingMaster copy() {
|
||||
return new AangAirbendingMaster(this);
|
||||
}
|
||||
}
|
||||
64
Mage.Sets/src/mage/cards/a/AangAndKatara.java
Normal file
64
Mage.Sets/src/mage/cards/a/AangAndKatara.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldOrAttacksSourceTriggeredAbility;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.hint.ValueHint;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.permanent.TappedPredicate;
|
||||
import mage.game.permanent.token.AllyToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangAndKatara extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledPermanent("tapped artifacts and/or creatures you control");
|
||||
|
||||
static {
|
||||
filter.add(TappedPredicate.TAPPED);
|
||||
filter.add(Predicates.or(
|
||||
CardType.ARTIFACT.getPredicate(),
|
||||
CardType.CREATURE.getPredicate()
|
||||
));
|
||||
}
|
||||
|
||||
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, null);
|
||||
private static final Hint hint = new ValueHint("Tapped artifacts and creatures you control", xValue);
|
||||
|
||||
public AangAndKatara(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}{W}{U}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(5);
|
||||
this.toughness = new MageInt(5);
|
||||
|
||||
// Whenever Aang and Katara enter or attack, create X 1/1 white Ally creature tokens, where X is the number of tapped artifacts and/or creatures you control.
|
||||
this.addAbility(new EntersBattlefieldOrAttacksSourceTriggeredAbility(new CreateTokenEffect(new AllyToken(), xValue))
|
||||
.setTriggerPhrase("Whenever {this} enter or attack, ").addHint(hint));
|
||||
}
|
||||
|
||||
private AangAndKatara(final AangAndKatara card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangAndKatara copy() {
|
||||
return new AangAndKatara(this);
|
||||
}
|
||||
}
|
||||
89
Mage.Sets/src/mage/cards/a/AangAtTheCrossroads.java
Normal file
89
Mage.Sets/src/mage/cards/a/AangAtTheCrossroads.java
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.common.delayed.AtTheBeginOfNextUpkeepDelayedTriggeredAbility;
|
||||
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControlledEffect;
|
||||
import mage.abilities.effects.keyword.EarthbendTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.VigilanceAbility;
|
||||
import mage.abilities.triggers.BeginningOfCombatTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.filter.predicate.mageobject.ManaValuePredicate;
|
||||
import mage.target.common.TargetControlledLandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangAtTheCrossroads extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCreatureCard("creature card with mana value 4 or less");
|
||||
private static final FilterPermanent saviorFilter = new FilterPermanent("land creatures");
|
||||
|
||||
static {
|
||||
filter.add(new ManaValuePredicate(ComparisonType.FEWER_THAN, 5));
|
||||
saviorFilter.add(CardType.LAND.getPredicate());
|
||||
saviorFilter.add(CardType.CREATURE.getPredicate());
|
||||
}
|
||||
|
||||
public AangAtTheCrossroads(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.ALLY}, "{2}{G}{W}{U}",
|
||||
"Aang, Destined Savior",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR, SubType.ALLY}, "");
|
||||
|
||||
this.getLeftHalfCard().setPT(3, 3);
|
||||
this.getRightHalfCard().setPT(4, 4);
|
||||
|
||||
// Flying
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Aang enters, look at the top five cards of your library. You may put a creature card with mana value 4 or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.
|
||||
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect(
|
||||
5, 1, filter, PutCards.BATTLEFIELD, PutCards.BOTTOM_RANDOM
|
||||
)));
|
||||
|
||||
// When another creature you control leaves the battlefield, transform Aang at the beginning of the next upkeep.
|
||||
this.getLeftHalfCard().addAbility(new LeavesBattlefieldAllTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(
|
||||
new AtTheBeginOfNextUpkeepDelayedTriggeredAbility(new TransformSourceEffect())
|
||||
).setText("transform {this} at the beginning of the next upkeep"), StaticFilters.FILTER_ANOTHER_CREATURE_YOU_CONTROL)
|
||||
.setTriggerPhrase("When another creature you control leaves the battlefield, "));
|
||||
|
||||
// Aang, Destined Savior
|
||||
|
||||
// Flying
|
||||
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Land creatures you control have vigilance.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new GainAbilityControlledEffect(
|
||||
VigilanceAbility.getInstance(), Duration.WhileOnBattlefield, saviorFilter
|
||||
)));
|
||||
|
||||
// At the beginning of combat on your turn, earthbend 2.
|
||||
Ability ability = new BeginningOfCombatTriggeredAbility(new EarthbendTargetEffect(2));
|
||||
ability.addTarget(new TargetControlledLandPermanent());
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
}
|
||||
|
||||
private AangAtTheCrossroads(final AangAtTheCrossroads card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangAtTheCrossroads copy() {
|
||||
return new AangAtTheCrossroads(this);
|
||||
}
|
||||
}
|
||||
89
Mage.Sets/src/mage/cards/a/AangSwiftSavior.java
Normal file
89
Mage.Sets/src/mage/cards/a/AangSwiftSavior.java
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.WaterbendCost;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.abilities.keyword.FlashAbility;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.ReachAbility;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterSpellOrPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.permanent.TappedPredicate;
|
||||
import mage.target.common.TargetSpellOrPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangSwiftSavior extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterSpellOrPermanent filter = new FilterSpellOrPermanent("other target creature or spell");
|
||||
private static final FilterPermanent laFilter = new FilterControlledCreaturePermanent("tapped creature you control");
|
||||
|
||||
static {
|
||||
}
|
||||
static {
|
||||
filter.getPermanentFilter().add(CardType.CREATURE.getPredicate());
|
||||
filter.getPermanentFilter().add(AnotherPredicate.instance);
|
||||
laFilter.add(TappedPredicate.TAPPED);
|
||||
}
|
||||
|
||||
public AangSwiftSavior(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.AVATAR, SubType.ALLY}, "{1}{W}{U}",
|
||||
"Aang and La, Ocean's Fury",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.AVATAR, SubType.SPIRIT, SubType.ALLY}, "");
|
||||
|
||||
this.getLeftHalfCard().setPT(2, 3);
|
||||
this.getRightHalfCard().setPT(5, 5);
|
||||
|
||||
// Flash
|
||||
this.getLeftHalfCard().addAbility(FlashAbility.getInstance());
|
||||
|
||||
// Flying
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Aang enters, airbend up to one other target creature or spell.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect());
|
||||
ability.addTarget(new TargetSpellOrPermanent(0, 1, filter, false));
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Waterbend {8}: Transform Aang.
|
||||
this.getLeftHalfCard().addAbility(new SimpleActivatedAbility(new TransformSourceEffect(), new WaterbendCost(8)));
|
||||
|
||||
// Aang and La, Ocean's Fury
|
||||
|
||||
// Reach
|
||||
this.getRightHalfCard().addAbility(ReachAbility.getInstance());
|
||||
|
||||
// Trample
|
||||
this.getRightHalfCard().addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Whenever Aang and La attack, put a +1/+1 counter on each tapped creature you control.
|
||||
this.getRightHalfCard().addAbility(new AttacksTriggeredAbility(new AddCountersAllEffect(CounterType.P1P1.createInstance(), laFilter)).setTriggerPhrase("Whenever {this} attack, "));
|
||||
}
|
||||
|
||||
private AangSwiftSavior(final AangSwiftSavior card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangSwiftSavior copy() {
|
||||
return new AangSwiftSavior(this);
|
||||
}
|
||||
}
|
||||
70
Mage.Sets/src/mage/cards/a/AangTheLastAirbender.java
Normal file
70
Mage.Sets/src/mage/cards/a/AangTheLastAirbender.java
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SpellCastControllerTriggeredAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.FilterSpell;
|
||||
import mage.filter.common.FilterNonlandPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangTheLastAirbender extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterNonlandPermanent("other target nonland permanent");
|
||||
private static final FilterSpell filter2 = new FilterSpell("a Lesson spell");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
filter2.add(SubType.LESSON.getPredicate());
|
||||
}
|
||||
|
||||
public AangTheLastAirbender(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.AVATAR);
|
||||
this.subtype.add(SubType.ALLY);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Aang enters, airbend up to one other target nonland permanent.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect());
|
||||
ability.addTarget(new TargetPermanent(0, 1, filter));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever you cast a Lesson spell, Aang gains lifelink until end of turn.
|
||||
this.addAbility(new SpellCastControllerTriggeredAbility(
|
||||
new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Duration.EndOfTurn), filter2, false
|
||||
));
|
||||
}
|
||||
|
||||
private AangTheLastAirbender(final AangTheLastAirbender card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangTheLastAirbender copy() {
|
||||
return new AangTheLastAirbender(this);
|
||||
}
|
||||
}
|
||||
45
Mage.Sets/src/mage/cards/a/AangsDefense.java
Normal file
45
Mage.Sets/src/mage/cards/a/AangsDefense.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.permanent.BlockingPredicate;
|
||||
import mage.target.TargetPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangsDefense extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("blocking creature you control");
|
||||
|
||||
static {
|
||||
filter.add(BlockingPredicate.instance);
|
||||
}
|
||||
|
||||
public AangsDefense(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}");
|
||||
|
||||
// Target blocking creature you control gets +2/+2 until end of turn.
|
||||
this.getSpellAbility().addEffect(new BoostTargetEffect(2, 2));
|
||||
this.getSpellAbility().addTarget(new TargetPermanent(filter));
|
||||
|
||||
// Draw a card.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||
}
|
||||
|
||||
private AangsDefense(final AangsDefense card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangsDefense copy() {
|
||||
return new AangsDefense(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -2,13 +2,13 @@ package mage.cards.a;
|
|||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.costs.common.WaterbendCost;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.common.ExileUntilSourceLeavesEffect;
|
||||
import mage.abilities.effects.keyword.ScryEffect;
|
||||
import mage.abilities.keyword.FlashAbility;
|
||||
import mage.abilities.keyword.WaterbendAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
|
@ -42,9 +42,9 @@ public final class AangsIceberg extends CardImpl {
|
|||
this.addAbility(ability);
|
||||
|
||||
// Waterbend {3}: Sacrifice this enchantment. If you do, scry 2.
|
||||
this.addAbility(new WaterbendAbility(new DoIfCostPaid(
|
||||
this.addAbility(new SimpleActivatedAbility(new DoIfCostPaid(
|
||||
new ScryEffect(2), new SacrificeSourceCost(), null, false
|
||||
), new GenericManaCost(3)));
|
||||
), new WaterbendCost(3)));
|
||||
}
|
||||
|
||||
private AangsIceberg(final AangsIceberg card) {
|
||||
|
|
|
|||
64
Mage.Sets/src/mage/cards/a/AangsJourney.java
Normal file
64
Mage.Sets/src/mage/cards/a/AangsJourney.java
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.condition.common.KickedCondition;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect;
|
||||
import mage.abilities.keyword.KickerAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.predicate.Predicate;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.target.common.TargetCardAndOrCardInLibrary;
|
||||
import mage.target.common.TargetCardInLibrary;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AangsJourney extends CardImpl {
|
||||
|
||||
private static final Predicate<Card> predicate = Predicates.and(
|
||||
SuperType.BASIC.getPredicate(),
|
||||
CardType.LAND.getPredicate()
|
||||
);
|
||||
|
||||
public AangsJourney(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}");
|
||||
|
||||
this.subtype.add(SubType.LESSON);
|
||||
|
||||
// Kicker {2}
|
||||
this.addAbility(new KickerAbility("{2}"));
|
||||
|
||||
// Search your library for a basic land card. If this spell was kicked, instead search your library for a basic land card and a Shrine card. Reveal those cards, put them into your hand, then shuffle.
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
new SearchLibraryPutInHandEffect(new TargetCardAndOrCardInLibrary(
|
||||
predicate, SubType.SHRINE.getPredicate(),
|
||||
"a basic land card and/or a Shrine card"
|
||||
), true),
|
||||
new SearchLibraryPutInHandEffect(new TargetCardInLibrary(StaticFilters.FILTER_CARD_BASIC_LAND), true),
|
||||
KickedCondition.ONCE, "search your library for a basic land card. If this spell was kicked, " +
|
||||
"instead search your library for a basic land card and a Shrine card. " +
|
||||
"Reveal those cards, put them into your hand, then shuffle"
|
||||
));
|
||||
|
||||
// You gain 2 life.
|
||||
this.getSpellAbility().addEffect(new GainLifeEffect(2).concatBy("<br>"));
|
||||
}
|
||||
|
||||
private AangsJourney(final AangsJourney card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AangsJourney copy() {
|
||||
return new AangsJourney(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package mage.cards.s;
|
||||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
|
|
@ -12,28 +12,26 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class SeasonedCathar extends CardImpl {
|
||||
public final class AardvarkSloth extends CardImpl {
|
||||
|
||||
public SeasonedCathar(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "");
|
||||
public AardvarkSloth(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.KNIGHT);
|
||||
this.subtype.add(SubType.SLOTH);
|
||||
this.subtype.add(SubType.BEAST);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(3);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// Lifelink
|
||||
this.addAbility(LifelinkAbility.getInstance());
|
||||
}
|
||||
|
||||
private SeasonedCathar(final SeasonedCathar card) {
|
||||
private AardvarkSloth(final AardvarkSloth card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SeasonedCathar copy() {
|
||||
return new SeasonedCathar(this);
|
||||
public AardvarkSloth copy() {
|
||||
return new AardvarkSloth(this);
|
||||
}
|
||||
}
|
||||
35
Mage.Sets/src/mage/cards/a/AbandonAttachments.java
Normal file
35
Mage.Sets/src/mage/cards/a/AbandonAttachments.java
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.costs.common.DiscardCardCost;
|
||||
import mage.abilities.effects.common.DoIfCostPaid;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AbandonAttachments extends CardImpl {
|
||||
|
||||
public AbandonAttachments(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U/R}");
|
||||
|
||||
this.subtype.add(SubType.LESSON);
|
||||
|
||||
// You may discard a card. If you do, draw two cards.
|
||||
this.getSpellAbility().addEffect(new DoIfCostPaid(new DrawCardSourceControllerEffect(2), new DiscardCardCost()));
|
||||
}
|
||||
|
||||
private AbandonAttachments(final AbandonAttachments card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbandonAttachments copy() {
|
||||
return new AbandonAttachments(this);
|
||||
}
|
||||
}
|
||||
50
Mage.Sets/src/mage/cards/a/AbandonedAirTemple.java
Normal file
50
Mage.Sets/src/mage/cards/a/AbandonedAirTemple.java
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.YouControlABasicLandCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.abilities.mana.WhiteManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AbandonedAirTemple extends CardImpl {
|
||||
|
||||
public AbandonedAirTemple(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped unless you control a basic land.
|
||||
this.addAbility(new EntersBattlefieldTappedUnlessAbility(YouControlABasicLandCondition.instance)
|
||||
.addHint(YouControlABasicLandCondition.getHint()));
|
||||
|
||||
// {T}: Add {W}.
|
||||
this.addAbility(new WhiteManaAbility());
|
||||
|
||||
// {3}{W}, {T}: Put a +1/+1 counter on each creature you control.
|
||||
Ability ability = new SimpleActivatedAbility(new AddCountersAllEffect(
|
||||
CounterType.P1P1.createInstance(), StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
), new ManaCostsImpl<>("{3}{W}"));
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AbandonedAirTemple(final AbandonedAirTemple card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbandonedAirTemple copy() {
|
||||
return new AbandonedAirTemple(this);
|
||||
}
|
||||
}
|
||||
55
Mage.Sets/src/mage/cards/a/AbbyMercilessSoldier.java
Normal file
55
Mage.Sets/src/mage/cards/a/AbbyMercilessSoldier.java
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.EntersBattlefieldAbility;
|
||||
import mage.abilities.dynamicvalue.common.ManaSpentToCastCount;
|
||||
import mage.abilities.effects.common.CastSourceTriggeredAbility;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.EntersBattlefieldUnderControlOfOpponentOfChoiceEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.PartnerVariantType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.game.permanent.token.CordycepsInfectedToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AbbyMercilessSoldier extends CardImpl {
|
||||
|
||||
public AbbyMercilessSoldier(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{G}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SURVIVOR);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
|
||||
// When you cast this spell, create a number of 1/1 black Fungus Zombie creature tokens named Cordyceps Infected equal to the amount of mana spent to cast it.
|
||||
this.addAbility(new CastSourceTriggeredAbility(
|
||||
new CreateTokenEffect(new CordycepsInfectedToken(), ManaSpentToCastCount.instance)
|
||||
.setText("create a number of 1/1 black Fungus Zombie creature tokens " +
|
||||
"named Cordyceps Infected equal to the amount of mana spent to cast it")
|
||||
));
|
||||
|
||||
// Abby enters under the control of an opponent of your choice.
|
||||
this.addAbility(new EntersBattlefieldAbility(new EntersBattlefieldUnderControlOfOpponentOfChoiceEffect()));
|
||||
|
||||
// Partner--Survivors
|
||||
this.addAbility(PartnerVariantType.SURVIVORS.makeAbility());
|
||||
}
|
||||
|
||||
private AbbyMercilessSoldier(final AbbyMercilessSoldier card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbbyMercilessSoldier copy() {
|
||||
return new AbbyMercilessSoldier(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,16 +1,16 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.game.Game;
|
||||
import mage.players.Player;
|
||||
|
||||
|
|
@ -19,23 +19,26 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class AberrantResearcher extends CardImpl {
|
||||
public final class AberrantResearcher extends TransformingDoubleFacedCard {
|
||||
|
||||
public AberrantResearcher(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.INSECT);
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.INSECT}, "{3}{U}",
|
||||
"Perfected Form",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.INSECT, SubType.HORROR}, "U");
|
||||
|
||||
this.secondSideCardClazz = mage.cards.p.PerfectedForm.class;
|
||||
this.getLeftHalfCard().setPT(3, 2);
|
||||
this.getRightHalfCard().setPT(5, 4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// At the beginning of your upkeep, put the top card of your library into your graveyard. If it's an instant or sorcery card, transform Aberrant Researcher.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new BeginningOfUpkeepTriggeredAbility(new AberrantResearcherEffect()));
|
||||
this.getLeftHalfCard().addAbility(new BeginningOfUpkeepTriggeredAbility(new AberrantResearcherEffect()));
|
||||
|
||||
// Perfected Form
|
||||
// Flying
|
||||
this.getRightHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
}
|
||||
|
||||
private AberrantResearcher(final AberrantResearcher card) {
|
||||
|
|
|
|||
|
|
@ -1,22 +1,17 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageItem;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.common.CantBeCounteredSourceAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityControllerEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.ProtectionAbility;
|
||||
import mage.abilities.keyword.ProtectionFromEachOpponentAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.Game;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
|
|
@ -40,7 +35,7 @@ public final class AbsoluteVirtue extends CardImpl {
|
|||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// You have protection from each of your opponents.
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(new AbsoluteVirtueAbility())));
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityControllerEffect(new ProtectionFromEachOpponentAbility())));
|
||||
}
|
||||
|
||||
private AbsoluteVirtue(final AbsoluteVirtue card) {
|
||||
|
|
@ -52,34 +47,3 @@ public final class AbsoluteVirtue extends CardImpl {
|
|||
return new AbsoluteVirtue(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AbsoluteVirtueAbility extends ProtectionAbility {
|
||||
|
||||
public AbsoluteVirtueAbility() {
|
||||
super(StaticFilters.FILTER_CARD);
|
||||
}
|
||||
|
||||
private AbsoluteVirtueAbility(final AbsoluteVirtueAbility ability) {
|
||||
super(ability);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbsoluteVirtueAbility copy() {
|
||||
return new AbsoluteVirtueAbility(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "protection from each of your opponents";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canTarget(MageObject source, Game game) {
|
||||
return Optional
|
||||
.ofNullable(source)
|
||||
.map(MageItem::getId)
|
||||
.map(game::getControllerId)
|
||||
.map(uuid -> !game.getOpponents(this.getSourceId()).contains(uuid))
|
||||
.orElse(true);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
43
Mage.Sets/src/mage/cards/a/AccumulateWisdom.java
Normal file
43
Mage.Sets/src/mage/cards/a/AccumulateWisdom.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.condition.common.LessonsInGraveCondition;
|
||||
import mage.abilities.decorator.ConditionalOneShotEffect;
|
||||
import mage.abilities.effects.common.LookLibraryAndPickControllerEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.PutCards;
|
||||
import mage.constants.SubType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AccumulateWisdom extends CardImpl {
|
||||
|
||||
public AccumulateWisdom(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}");
|
||||
|
||||
this.subtype.add(SubType.LESSON);
|
||||
|
||||
// Look at the top three cards of your library. Put one of those cards into your hand and the rest on the bottom of your library in any order. Put each of those cards into your hand instead if there are three or more Lesson cards in your graveyard.
|
||||
this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
|
||||
new LookLibraryAndPickControllerEffect(3, 3, PutCards.HAND, PutCards.BOTTOM_ANY),
|
||||
new LookLibraryAndPickControllerEffect(3, 1, PutCards.HAND, PutCards.BOTTOM_ANY),
|
||||
LessonsInGraveCondition.THREE, "look at the top three cards of your library. " +
|
||||
"Put one of those cards into your hand and the rest on the bottom of your library in any order. " +
|
||||
"Put each of those cards into your hand instead if there are three or more Lesson cards in your graveyard"
|
||||
));
|
||||
this.getSpellAbility().addHint(LessonsInGraveCondition.getHint());
|
||||
}
|
||||
|
||||
private AccumulateWisdom(final AccumulateWisdom card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AccumulateWisdom copy() {
|
||||
return new AccumulateWisdom(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,49 +1,76 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.SpellAbility;
|
||||
import mage.abilities.common.DiesSourceTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.AttachEffect;
|
||||
import mage.abilities.effects.common.GainLifeEffect;
|
||||
import mage.abilities.effects.common.LoseLifeTargetEffect;
|
||||
import mage.abilities.effects.common.cost.CostModificationEffectImpl;
|
||||
import mage.abilities.effects.common.cost.SpellsCostModificationThatTargetSourceEffect;
|
||||
import mage.abilities.keyword.EnchantAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.triggers.BeginningOfUpkeepTriggeredAbility;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.DoubleFacedCardHalf;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.filter.FilterCard;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPlayer;
|
||||
import mage.target.common.TargetOpponent;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author halljared
|
||||
*/
|
||||
public final class AccursedWitch extends CardImpl {
|
||||
public final class AccursedWitch extends TransformingDoubleFacedCard {
|
||||
|
||||
private static final FilterCard filter = new FilterCard("spells");
|
||||
|
||||
public AccursedWitch(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.SHAMAN);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.i.InfectiousCurse.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.SHAMAN}, "{3}{B}",
|
||||
"Infectious Curse",
|
||||
new CardType[]{CardType.ENCHANTMENT}, new SubType[]{SubType.AURA, SubType.CURSE}, "B");
|
||||
this.getLeftHalfCard().setPT(4, 2);
|
||||
|
||||
// Spells your opponents cast that target Accursed Witch cost {1} less to cast.
|
||||
this.addAbility(new SimpleStaticAbility(
|
||||
this.getLeftHalfCard().addAbility(new SimpleStaticAbility(
|
||||
new SpellsCostModificationThatTargetSourceEffect(-1, filter, TargetController.OPPONENT))
|
||||
);
|
||||
|
||||
// When Accursed Witch dies, return it to the battlefield transformed under your control attached to target opponent.
|
||||
this.addAbility(new TransformAbility());
|
||||
Ability ability = new DiesSourceTriggeredAbility(new AccursedWitchReturnTransformedEffect());
|
||||
ability.addTarget(new TargetOpponent());
|
||||
this.addAbility(ability);
|
||||
this.getLeftHalfCard().addAbility(ability);
|
||||
|
||||
// Infectious Curse
|
||||
// Enchant player
|
||||
TargetPlayer auraTarget = new TargetPlayer();
|
||||
this.getRightHalfCard().getSpellAbility().addTarget(auraTarget);
|
||||
this.getRightHalfCard().getSpellAbility().addEffect(new AttachEffect(Outcome.Damage));
|
||||
this.getRightHalfCard().addAbility(new EnchantAbility(auraTarget));
|
||||
|
||||
// Spells you cast that target enchanted player cost {1} less to cast.
|
||||
this.getRightHalfCard().addAbility(new SimpleStaticAbility(new InfectiousCurseCostReductionEffect()));
|
||||
|
||||
// At the beginning of enchanted player's upkeep, that player loses 1 life and you gain 1 life.
|
||||
Ability upkeepAbility = new BeginningOfUpkeepTriggeredAbility(
|
||||
TargetController.ENCHANTED, new LoseLifeTargetEffect(1).setText("that player loses 1 life"),
|
||||
false
|
||||
);
|
||||
upkeepAbility.addEffect(new GainLifeEffect(1).concatBy("and"));
|
||||
this.getRightHalfCard().addAbility(upkeepAbility);
|
||||
}
|
||||
|
||||
private AccursedWitch(final AccursedWitch card) {
|
||||
|
|
@ -80,16 +107,67 @@ class AccursedWitchReturnTransformedEffect extends OneShotEffect {
|
|||
return false;
|
||||
}
|
||||
|
||||
Card card = game.getCard(source.getSourceId());
|
||||
DoubleFacedCardHalf card = (DoubleFacedCardHalf) game.getCard(source.getSourceId());
|
||||
if (card == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + source.getSourceId(), Boolean.TRUE);
|
||||
game.getState().setValue("attachTo:" + source.getSourceId(), attachTo.getId());
|
||||
game.getState().setValue("attachTo:" + card.getOtherSide().getId(), attachTo.getId());
|
||||
if (controller.moveCards(card, Zone.BATTLEFIELD, source, game)) {
|
||||
attachTo.addAttachment(card.getId(), source, game);
|
||||
attachTo.addAttachment(card.getOtherSide().getId(), source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
class InfectiousCurseCostReductionEffect extends CostModificationEffectImpl {
|
||||
|
||||
InfectiousCurseCostReductionEffect() {
|
||||
super(Duration.WhileOnBattlefield, Outcome.Benefit, CostModificationType.REDUCE_COST);
|
||||
this.staticText = "Spells you cast that target enchanted player cost {1} less to cast";
|
||||
}
|
||||
|
||||
private InfectiousCurseCostReductionEffect(InfectiousCurseCostReductionEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source, Ability abilityToModify) {
|
||||
CardUtil.reduceCost(abilityToModify, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(Ability abilityToModify, Ability source, Game game) {
|
||||
if (!(abilityToModify instanceof SpellAbility)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!source.isControlledBy(abilityToModify.getControllerId())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Permanent enchantment = game.getPermanent(source.getSourceId());
|
||||
if (enchantment == null || enchantment.getAttachedTo() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Spell spell = (Spell) game.getStack().getStackObject(abilityToModify.getId());
|
||||
Set<UUID> allTargets;
|
||||
if (spell != null) {
|
||||
// real cast
|
||||
allTargets = CardUtil.getAllSelectedTargets(abilityToModify, game);
|
||||
} else {
|
||||
// playable
|
||||
allTargets = CardUtil.getAllPossibleTargets(abilityToModify, game);
|
||||
}
|
||||
|
||||
// try to reduce all the time (if it possible to target)
|
||||
return allTargets.stream().anyMatch(target -> Objects.equals(target, enchantment.getAttachedTo()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public InfectiousCurseCostReductionEffect copy() {
|
||||
return new InfectiousCurseCostReductionEffect(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,16 +1,23 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.MageObject;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.TriggeredAbilityImpl;
|
||||
import mage.abilities.common.ActivateIfConditionActivatedAbility;
|
||||
import mage.abilities.common.AttacksTriggeredAbility;
|
||||
import mage.abilities.common.DiesSourceTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.CardsInHandCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.hint.ConditionHint;
|
||||
import mage.abilities.hint.Hint;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.keyword.LifelinkAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.abilities.mana.BlackManaAbility;
|
||||
import mage.cards.*;
|
||||
import mage.constants.*;
|
||||
import mage.filter.StaticFilters;
|
||||
|
|
@ -28,33 +35,43 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AclazotzDeepestBetrayal extends CardImpl {
|
||||
public final class AclazotzDeepestBetrayal extends TransformingDoubleFacedCard {
|
||||
private static final Condition condition = new CardsInHandCondition(ComparisonType.FEWER_THAN, 2, TargetController.ANY);
|
||||
private static final Hint hint = new ConditionHint(condition);
|
||||
|
||||
public AclazotzDeepestBetrayal(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}{B}");
|
||||
this.secondSideCardClazz = mage.cards.t.TempleOfTheDead.class;
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.BAT, SubType.GOD}, "{3}{B}{B}",
|
||||
"Temple of the Dead",
|
||||
new SuperType[]{}, new CardType[]{CardType.LAND}, new SubType[]{}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.BAT);
|
||||
this.subtype.add(SubType.GOD);
|
||||
this.power = new MageInt(4);
|
||||
this.toughness = new MageInt(4);
|
||||
this.getLeftHalfCard().setPT(4, 4);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// Lifelink
|
||||
this.addAbility(LifelinkAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(LifelinkAbility.getInstance());
|
||||
|
||||
// Whenever Aclazotz attacks, each opponent discards a card. For each opponent who can't, you draw a card.
|
||||
this.addAbility(new AttacksTriggeredAbility(new AclazotzDeepestBetrayalEffect()));
|
||||
this.getLeftHalfCard().addAbility(new AttacksTriggeredAbility(new AclazotzDeepestBetrayalEffect()));
|
||||
|
||||
// Whenever an opponent discards a land card, create a 1/1 black Bat creature token with flying.
|
||||
this.addAbility(new AclazotzDeepestBetrayalTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new AclazotzDeepestBetrayalTriggeredAbility());
|
||||
|
||||
// When Aclazotz dies, return it to the battlefield tapped and transformed under its owner's control.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesSourceTriggeredAbility(new AclazotzDeepestBetrayalTransformEffect()));
|
||||
this.getLeftHalfCard().addAbility(new DiesSourceTriggeredAbility(new AclazotzDeepestBetrayalTransformEffect()));
|
||||
|
||||
// Temple of the Dead
|
||||
// {T}: Add {B}.
|
||||
this.getRightHalfCard().addAbility(new BlackManaAbility());
|
||||
|
||||
// {2}{B}, {T}: Transform Temple of the Dead. Activate only if a player has one or fewer cards in hand and only as a sorcery.
|
||||
Ability ability = new ActivateIfConditionActivatedAbility(
|
||||
new TransformSourceEffect(), new ManaCostsImpl<>("{2}{B}"), condition
|
||||
).setTiming(TimingRule.SORCERY);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.getRightHalfCard().addAbility(ability.addHint(hint));
|
||||
}
|
||||
|
||||
private AclazotzDeepestBetrayal(final AclazotzDeepestBetrayal card) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
|
|
@ -28,7 +27,9 @@ public final class AcolyteOfTheInferno extends CardImpl {
|
|||
this.addAbility(new RenownAbility(1));
|
||||
|
||||
// Whenever Acolyte of the Inferno becomes blocked by a creature, it deals 2 damage to that creature
|
||||
this.addAbility(new BecomesBlockedByCreatureTriggeredAbility(new DamageTargetEffect(2, true, "that creature", "it"), false));
|
||||
this.addAbility(new BecomesBlockedByCreatureTriggeredAbility(
|
||||
new DamageTargetEffect(2, "it")
|
||||
.withTargetDescription("that creature"), false));
|
||||
}
|
||||
|
||||
private AcolyteOfTheInferno(final AcolyteOfTheInferno card) {
|
||||
|
|
|
|||
|
|
@ -2,16 +2,14 @@ package mage.cards.a;
|
|||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.dynamicvalue.common.DevotionCount;
|
||||
import mage.abilities.effects.PreventionEffectData;
|
||||
import mage.abilities.effects.PreventionEffectImpl;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.game.Game;
|
||||
import mage.game.events.DamageEvent;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.PreventDamageEvent;
|
||||
import mage.game.events.PreventedDamageEvent;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.players.Player;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
|
|
@ -46,16 +44,14 @@ public final class AcolytesReward extends CardImpl {
|
|||
|
||||
class AcolytesRewardEffect extends PreventionEffectImpl {
|
||||
|
||||
protected int amount = 0;
|
||||
|
||||
AcolytesRewardEffect() {
|
||||
super(Duration.EndOfTurn);
|
||||
super(Duration.EndOfTurn, 0, false, true, DevotionCount.W);
|
||||
staticText = "Prevent the next X damage that would be dealt to target creature this turn, where X is your devotion to white. If damage is prevented this way, {this} deals that much damage to any target";
|
||||
}
|
||||
|
||||
private AcolytesRewardEffect(final AcolytesRewardEffect effect) {
|
||||
super(effect);
|
||||
this.amount = effect.amount;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -63,64 +59,25 @@ class AcolytesRewardEffect extends PreventionEffectImpl {
|
|||
return new AcolytesRewardEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(Ability source, Game game) {
|
||||
super.init(source, game);
|
||||
amount = DevotionCount.W.calculate(game, source, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean replaceEvent(GameEvent event, Ability source, Game game) {
|
||||
boolean result = false;
|
||||
int toPrevent = amount;
|
||||
if (event.getAmount() < this.amount) {
|
||||
toPrevent = event.getAmount();
|
||||
amount -= event.getAmount();
|
||||
} else {
|
||||
amount = 0;
|
||||
PreventionEffectData preventionData = preventDamageAction(event, source, game);
|
||||
if (preventionData.getPreventedDamage() > 0) {
|
||||
Permanent targetCreature = game.getPermanent(source.getFirstTarget());
|
||||
if (targetCreature != null) {
|
||||
targetCreature.damage(preventionData.getPreventedDamage(), source.getSourceId(), source, game, false, true);
|
||||
}
|
||||
Player targetPlayer = game.getPlayer(source.getFirstTarget());
|
||||
if (targetCreature != null) {
|
||||
targetPlayer.damage(preventionData.getPreventedDamage(), source.getSourceId(), source, game, false, true);
|
||||
}
|
||||
}
|
||||
GameEvent preventEvent = new PreventDamageEvent(event.getTargetId(), source.getSourceId(), source, source.getControllerId(), toPrevent, ((DamageEvent) event).isCombatDamage());
|
||||
if (game.replaceEvent(preventEvent)) {
|
||||
return result;
|
||||
}
|
||||
Permanent targetCreature = game.getPermanent(event.getTargetId());
|
||||
if (targetCreature == null) {
|
||||
return result;
|
||||
}
|
||||
if (amount == 0) {
|
||||
this.used = true;
|
||||
this.discard();
|
||||
}
|
||||
if (event.getAmount() >= toPrevent) {
|
||||
event.setAmount(event.getAmount() - toPrevent);
|
||||
} else {
|
||||
event.setAmount(0);
|
||||
result = true;
|
||||
}
|
||||
if (toPrevent == 0) {
|
||||
return result;
|
||||
}
|
||||
game.informPlayers("Acolyte's Reward prevented " + toPrevent + " to " + targetCreature.getName());
|
||||
game.fireEvent(new PreventedDamageEvent(event.getTargetId(), source.getSourceId(), source, source.getControllerId(), toPrevent));
|
||||
|
||||
Player targetPlayer = game.getPlayer(source.getTargets().get(1).getFirstTarget());
|
||||
if (targetPlayer != null) {
|
||||
targetPlayer.damage(toPrevent, source.getSourceId(), source, game);
|
||||
game.informPlayers("Acolyte's Reward deals " + toPrevent + " damage to " + targetPlayer.getLogName());
|
||||
return result;
|
||||
}
|
||||
Permanent targetDamageCreature = game.getPermanent(source.getTargets().get(1).getFirstTarget());
|
||||
if (targetDamageCreature == null) {
|
||||
return result;
|
||||
}
|
||||
targetDamageCreature.damage(toPrevent, source.getSourceId(), source, game, false, true);
|
||||
game.informPlayers("Acolyte's Reward deals " + toPrevent + " damage to " + targetDamageCreature.getName());
|
||||
return result;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean applies(GameEvent event, Ability source, Game game) {
|
||||
return !this.used && super.applies(event, source, game) && event.getTargetId().equals(source.getFirstTarget());
|
||||
return super.applies(event, source, game) && event.getTargetId().equals(source.getFirstTarget());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ public final class AdrenalineJockey extends CardImpl {
|
|||
|
||||
// Whenever a player casts a spell, if it's not their turn, this creature deals 4 damage to them.
|
||||
this.addAbility(new SpellCastAllTriggeredAbility(
|
||||
new DamageTargetEffect(4, true, "them"),
|
||||
new DamageTargetEffect(4).withTargetDescription("them"),
|
||||
filter, false, SetTargetPointer.PLAYER
|
||||
));
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,28 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.TapTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.predicate.permanent.PermanentReferenceInCollectionPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.token.HeroToken;
|
||||
import mage.target.Target;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
import mage.target.targetpointer.FixedTarget;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
|
|
@ -28,8 +39,7 @@ public final class AerithRescueMission extends CardImpl {
|
|||
|
||||
// * Take 59 Flights of Stairs -- Tap up to three target creatures. Put a stun counter on one of them.
|
||||
this.getSpellAbility().addMode(new Mode(new TapTargetEffect())
|
||||
.addEffect(new AddCountersTargetEffect(CounterType.STUN.createInstance())
|
||||
.setText("Put a stun counter on one of them"))
|
||||
.addEffect(new AerithRescueMissionStunEffect())
|
||||
.addTarget(new TargetCreaturePermanent(0, 3))
|
||||
.withFlavorWord("Take 59 Flights of Stairs"));
|
||||
}
|
||||
|
|
@ -43,3 +53,34 @@ public final class AerithRescueMission extends CardImpl {
|
|||
return new AerithRescueMission(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AerithRescueMissionStunEffect extends OneShotEffect {
|
||||
|
||||
AerithRescueMissionStunEffect() {
|
||||
super(Outcome.Detriment);
|
||||
staticText = "Put a stun counter on one of them";
|
||||
}
|
||||
|
||||
private AerithRescueMissionStunEffect(final AerithRescueMissionStunEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AerithRescueMissionStunEffect copy() {
|
||||
return new AerithRescueMissionStunEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
FilterPermanent filter = new FilterPermanent("creature to put a stun counter on");
|
||||
filter.add(new PermanentReferenceInCollectionPredicate(this.getTargetPointer().getTargets(game, source).stream()
|
||||
.map(game::getPermanent).collect(Collectors.toList()), game));
|
||||
Target target = new TargetPermanent(filter).withNotTarget(true);
|
||||
if (target.choose(Outcome.UnboostCreature, source.getControllerId(), source, game)) {
|
||||
Effect eff = new AddCountersTargetEffect(CounterType.STUN.createInstance());
|
||||
eff.setTargetPointer(new FixedTarget(target.getFirstTarget(), game));
|
||||
return eff.apply(game, source);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.ActivateAsSorceryActivatedAbility;
|
||||
import mage.abilities.common.DealsCombatDamageToAPlayerOrBattleTriggeredAbility;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.TransformSourceEffect;
|
||||
import mage.abilities.keyword.DeathtouchAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
|
||||
|
|
@ -16,23 +16,28 @@ import java.util.UUID;
|
|||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AetherbladeAgent extends CardImpl {
|
||||
public final class AetherbladeAgent extends TransformingDoubleFacedCard {
|
||||
|
||||
public AetherbladeAgent(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.ROGUE);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(1);
|
||||
this.secondSideCardClazz = mage.cards.g.GitaxianMindstinger.class;
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.ROGUE}, "{1}{B}",
|
||||
"Gitaxian Mindstinger",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.PHYREXIAN, SubType.ROGUE}, "UB");
|
||||
this.getLeftHalfCard().setPT(1, 1);
|
||||
this.getRightHalfCard().setPT(3, 3);
|
||||
|
||||
// Deathtouch
|
||||
this.addAbility(DeathtouchAbility.getInstance());
|
||||
this.getLeftHalfCard().addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// {4}{U/P}: Transform Aetherblade Agent. Activate only as a sorcery.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{U/P}")));
|
||||
this.getLeftHalfCard().addAbility(new ActivateAsSorceryActivatedAbility(new TransformSourceEffect(), new ManaCostsImpl<>("{4}{U/P}")));
|
||||
|
||||
// Gitaxian Mindstinger
|
||||
// Deathtouch
|
||||
this.getRightHalfCard().addAbility(DeathtouchAbility.getInstance());
|
||||
|
||||
// Whenever Gitaxian Mindstinger deals combat damage to a player or battle, draw a card.
|
||||
this.getRightHalfCard().addAbility(new DealsCombatDamageToAPlayerOrBattleTriggeredAbility(new DrawCardSourceControllerEffect(1),false));
|
||||
}
|
||||
|
||||
private AetherbladeAgent(final AetherbladeAgent card) {
|
||||
|
|
|
|||
|
|
@ -1,33 +1,49 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.TransformIntoSourceTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfBackTriggeredAbility;
|
||||
import mage.abilities.common.WerewolfFrontTriggeredAbility;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.game.Controllable;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.target.common.TargetArtifactPermanent;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author BetaSteward
|
||||
*/
|
||||
public final class AfflictedDeserter extends CardImpl {
|
||||
public final class AfflictedDeserter extends TransformingDoubleFacedCard {
|
||||
|
||||
public AfflictedDeserter(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}");
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.WEREWOLF);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.w.WerewolfRansacker.class;
|
||||
|
||||
this.power = new MageInt(3);
|
||||
this.toughness = new MageInt(2);
|
||||
super(ownerId, setInfo,
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.HUMAN, SubType.WEREWOLF}, "{3}{R}",
|
||||
"Werewolf Ransacker",
|
||||
new CardType[]{CardType.CREATURE}, new SubType[]{SubType.WEREWOLF}, "R");
|
||||
this.getLeftHalfCard().setPT(3, 2);
|
||||
this.getRightHalfCard().setPT(5, 4);
|
||||
|
||||
// At the beginning of each upkeep, if no spells were cast last turn, transform Afflicted Deserter.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new WerewolfFrontTriggeredAbility());
|
||||
this.getLeftHalfCard().addAbility(new WerewolfFrontTriggeredAbility());
|
||||
|
||||
// Werewolf Ransacker
|
||||
// Whenever this creature transforms into Werewolf Ransacker, you may destroy target artifact. If that artifact is put into a graveyard this way, Werewolf Ransacker deals 3 damage to that artifact's controller.
|
||||
Ability ability = new TransformIntoSourceTriggeredAbility(new WerewolfRansackerEffect(), true, true);
|
||||
ability.addTarget(new TargetArtifactPermanent());
|
||||
this.getRightHalfCard().addAbility(ability);
|
||||
|
||||
// At the beginning of each upkeep, if a player cast two or more spells last turn, transform Werewolf Ransacker.
|
||||
this.getRightHalfCard().addAbility(new WerewolfBackTriggeredAbility());
|
||||
|
||||
}
|
||||
|
||||
private AfflictedDeserter(final AfflictedDeserter card) {
|
||||
|
|
@ -39,3 +55,39 @@ public final class AfflictedDeserter extends CardImpl {
|
|||
return new AfflictedDeserter(this);
|
||||
}
|
||||
}
|
||||
|
||||
class WerewolfRansackerEffect extends OneShotEffect {
|
||||
|
||||
WerewolfRansackerEffect() {
|
||||
super(Outcome.DestroyPermanent);
|
||||
staticText = "destroy target artifact. If that artifact is put into a graveyard this way, " +
|
||||
"{this} deals 3 damage to that artifact's controller";
|
||||
}
|
||||
|
||||
private WerewolfRansackerEffect(final WerewolfRansackerEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public WerewolfRansackerEffect copy() {
|
||||
return new WerewolfRansackerEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Permanent permanent = game.getPermanent(getTargetPointer().getFirst(game, source));
|
||||
if (permanent == null) {
|
||||
return false;
|
||||
}
|
||||
permanent.destroy(source, game);
|
||||
if (game.getState().getZone(permanent.getId()) != Zone.GRAVEYARD) {
|
||||
return true;
|
||||
}
|
||||
Optional.of(permanent)
|
||||
.map(Controllable::getControllerId)
|
||||
.map(game::getPlayer)
|
||||
.ifPresent(player -> player.damage(3, source, game));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
66
Mage.Sets/src/mage/cards/a/AgentVenom.java
Normal file
66
Mage.Sets/src/mage/cards/a/AgentVenom.java
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.DiesCreatureTriggeredAbility;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.common.LoseLifeSourceControllerEffect;
|
||||
import mage.abilities.keyword.FlashAbility;
|
||||
import mage.abilities.keyword.MenaceAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.permanent.TokenPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AgentVenom extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledCreaturePermanent("another nontoken creature you control");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
filter.add(TokenPredicate.FALSE);
|
||||
}
|
||||
|
||||
public AgentVenom(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.SYMBIOTE);
|
||||
this.subtype.add(SubType.SOLDIER);
|
||||
this.subtype.add(SubType.HERO);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(3);
|
||||
|
||||
// Flash
|
||||
this.addAbility(FlashAbility.getInstance());
|
||||
|
||||
// Menace
|
||||
this.addAbility(new MenaceAbility(false));
|
||||
|
||||
// Whenever another nontoken creature you control dies, you draw a card and lose 1 life.
|
||||
Ability ability = new DiesCreatureTriggeredAbility(
|
||||
new DrawCardSourceControllerEffect(1, true), false, filter
|
||||
);
|
||||
ability.addEffect(new LoseLifeSourceControllerEffect(1).setText("and lose 1 life"));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AgentVenom(final AgentVenom card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgentVenom copy() {
|
||||
return new AgentVenom(this);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/a/AgnaQela.java
Normal file
48
Mage.Sets/src/mage/cards/a/AgnaQela.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedUnlessAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.condition.common.YouControlABasicLandCondition;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.ManaCostsImpl;
|
||||
import mage.abilities.effects.common.DrawDiscardControllerEffect;
|
||||
import mage.abilities.mana.BlueManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AgnaQela extends CardImpl {
|
||||
|
||||
public AgnaQela(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped unless you control a basic land.
|
||||
this.addAbility(new EntersBattlefieldTappedUnlessAbility(YouControlABasicLandCondition.instance)
|
||||
.addHint(YouControlABasicLandCondition.getHint()));
|
||||
|
||||
// {T}: Add {U}.
|
||||
this.addAbility(new BlueManaAbility());
|
||||
|
||||
// {2}{U}, {T}: Draw a card, then discard a card.
|
||||
Ability ability = new SimpleActivatedAbility(
|
||||
new DrawDiscardControllerEffect(1, 1), new ManaCostsImpl<>("{2}{U}")
|
||||
);
|
||||
ability.addCost(new TapSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AgnaQela(final AgnaQela card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AgnaQela copy() {
|
||||
return new AgnaQela(this);
|
||||
}
|
||||
}
|
||||
41
Mage.Sets/src/mage/cards/a/AirNomadLegacy.java
Normal file
41
Mage.Sets/src/mage/cards/a/AirNomadLegacy.java
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.continuous.BoostControlledEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.game.permanent.token.ClueArtifactToken;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirNomadLegacy extends CardImpl {
|
||||
|
||||
public AirNomadLegacy(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{W}{U}");
|
||||
|
||||
// When this enchantment enters, create a Clue token.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new ClueArtifactToken())));
|
||||
|
||||
// Creatures you control with flying get +1/+1.
|
||||
this.addAbility(new SimpleStaticAbility(new BoostControlledEffect(
|
||||
1, 1, Duration.WhileOnBattlefield, StaticFilters.FILTER_CREATURE_FLYING
|
||||
).setText("creatures you control with flying get +1/+1")));
|
||||
}
|
||||
|
||||
private AirNomadLegacy(final AirNomadLegacy card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirNomadLegacy copy() {
|
||||
return new AirNomadLegacy(this);
|
||||
}
|
||||
}
|
||||
51
Mage.Sets/src/mage/cards/a/AirNomadStudent.java
Normal file
51
Mage.Sets/src/mage/cards/a/AirNomadStudent.java
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.InvertCondition;
|
||||
import mage.abilities.condition.common.AttackedThisTurnSourceCondition;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.keyword.FlyingAbility;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.counters.CounterType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirNomadStudent extends CardImpl {
|
||||
|
||||
private static final Condition condition = new InvertCondition(
|
||||
AttackedThisTurnSourceCondition.instance, "{this} didn't attack this turn"
|
||||
);
|
||||
|
||||
public AirNomadStudent(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{W}");
|
||||
|
||||
this.subtype.add(SubType.HUMAN);
|
||||
this.subtype.add(SubType.MONK);
|
||||
this.power = new MageInt(2);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
// Flying
|
||||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// At the beginning of your end step, if this creature didn't attack this turn, put a +1/+1 counter on it.
|
||||
this.addAbility(new BeginningOfEndStepTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance())
|
||||
.setText("put a +1/+1 counter on it")).withInterveningIf(condition));
|
||||
}
|
||||
|
||||
private AirNomadStudent(final AirNomadStudent card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirNomadStudent copy() {
|
||||
return new AirNomadStudent(this);
|
||||
}
|
||||
}
|
||||
59
Mage.Sets/src/mage/cards/a/AirbenderAscension.java
Normal file
59
Mage.Sets/src/mage/cards/a/AirbenderAscension.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldAllTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.SourceHasCounterCondition;
|
||||
import mage.abilities.effects.common.ExileThenReturnTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.abilities.triggers.BeginningOfEndStepTriggeredAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
import mage.target.common.TargetCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirbenderAscension extends CardImpl {
|
||||
|
||||
private static final Condition condition = new SourceHasCounterCondition(CounterType.QUEST, 4);
|
||||
|
||||
public AirbenderAscension(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
|
||||
|
||||
// When this enchantment enters, airbend up to one target creature.
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new AirbendTargetEffect());
|
||||
ability.addTarget(new TargetCreaturePermanent(0, 1));
|
||||
this.addAbility(ability);
|
||||
|
||||
// Whenever a creature you control enters, put a quest counter on this enchantment.
|
||||
this.addAbility(new EntersBattlefieldAllTriggeredAbility(
|
||||
new AddCountersSourceEffect(CounterType.QUEST.createInstance()),
|
||||
StaticFilters.FILTER_CONTROLLED_CREATURE
|
||||
));
|
||||
|
||||
// At the beginning of your end step, if this enchantment has four or more quest counters on it, exile up to one target creature you control, then return it to the battlefield under its owner's control.
|
||||
ability = new BeginningOfEndStepTriggeredAbility(
|
||||
new ExileThenReturnTargetEffect(false, false)
|
||||
).withInterveningIf(condition);
|
||||
ability.addTarget(new TargetControlledCreaturePermanent(0, 1));
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AirbenderAscension(final AirbenderAscension card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirbenderAscension copy() {
|
||||
return new AirbenderAscension(this);
|
||||
}
|
||||
}
|
||||
43
Mage.Sets/src/mage/cards/a/AirbendersReversal.java
Normal file
43
Mage.Sets/src/mage/cards/a/AirbendersReversal.java
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Mode;
|
||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.target.common.TargetAttackingCreature;
|
||||
import mage.target.common.TargetControlledCreaturePermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirbendersReversal extends CardImpl {
|
||||
|
||||
public AirbendersReversal(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}");
|
||||
|
||||
this.subtype.add(SubType.LESSON);
|
||||
|
||||
// Choose one --
|
||||
// * Destroy target attacking creature.
|
||||
this.getSpellAbility().addEffect(new DestroyTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetAttackingCreature());
|
||||
|
||||
// * Airbend target creature you control.
|
||||
this.getSpellAbility().addMode(new Mode(new AirbendTargetEffect())
|
||||
.addTarget(new TargetControlledCreaturePermanent()));
|
||||
}
|
||||
|
||||
private AirbendersReversal(final AirbendersReversal card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirbendersReversal copy() {
|
||||
return new AirbendersReversal(this);
|
||||
}
|
||||
}
|
||||
39
Mage.Sets/src/mage/cards/a/AirbendingLesson.java
Normal file
39
Mage.Sets/src/mage/cards/a/AirbendingLesson.java
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.effects.keyword.AirbendTargetEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.target.common.TargetNonlandPermanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirbendingLesson extends CardImpl {
|
||||
|
||||
public AirbendingLesson(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{W}");
|
||||
|
||||
this.subtype.add(SubType.LESSON);
|
||||
|
||||
// Airbend target nonland permanent.
|
||||
this.getSpellAbility().addEffect(new AirbendTargetEffect());
|
||||
this.getSpellAbility().addTarget(new TargetNonlandPermanent());
|
||||
|
||||
// Draw a card.
|
||||
this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1).concatBy("<br>"));
|
||||
}
|
||||
|
||||
private AirbendingLesson(final AirbendingLesson card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirbendingLesson copy() {
|
||||
return new AirbendingLesson(this);
|
||||
}
|
||||
}
|
||||
48
Mage.Sets/src/mage/cards/a/AirshipEngineRoom.java
Normal file
48
Mage.Sets/src/mage/cards/a/AirshipEngineRoom.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.common.EntersBattlefieldTappedAbility;
|
||||
import mage.abilities.common.SimpleActivatedAbility;
|
||||
import mage.abilities.costs.common.SacrificeSourceCost;
|
||||
import mage.abilities.costs.common.TapSourceCost;
|
||||
import mage.abilities.costs.mana.GenericManaCost;
|
||||
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
|
||||
import mage.abilities.mana.BlueManaAbility;
|
||||
import mage.abilities.mana.RedManaAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public final class AirshipEngineRoom extends CardImpl {
|
||||
|
||||
public AirshipEngineRoom(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.LAND}, "");
|
||||
|
||||
// This land enters tapped.
|
||||
this.addAbility(new EntersBattlefieldTappedAbility());
|
||||
|
||||
// {T}: Add {U} or {R}.
|
||||
this.addAbility(new BlueManaAbility());
|
||||
this.addAbility(new RedManaAbility());
|
||||
|
||||
// {4}, {T}, Sacrifice this land: Draw a card.
|
||||
Ability ability = new SimpleActivatedAbility(new DrawCardSourceControllerEffect(1), new GenericManaCost(4));
|
||||
ability.addCost(new TapSourceCost());
|
||||
ability.addCost(new SacrificeSourceCost());
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
||||
private AirshipEngineRoom(final AirshipEngineRoom card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AirshipEngineRoom copy() {
|
||||
return new AirshipEngineRoom(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,190 +0,0 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Outcome;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.SuperType;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterNonlandPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.CatWarrior21Token;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AjaniNacatlAvenger extends CardImpl {
|
||||
|
||||
private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(SubType.CAT, "Cat you control");
|
||||
|
||||
public AjaniNacatlAvenger(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.AJANI);
|
||||
this.setStartingLoyalty(3);
|
||||
|
||||
this.color.setRed(true);
|
||||
this.color.setWhite(true);
|
||||
this.nightCard = true;
|
||||
|
||||
// +2: Put a +1/+1 counter on each Cat you control.
|
||||
this.addAbility(new LoyaltyAbility(
|
||||
new AddCountersAllEffect(CounterType.P1P1.createInstance(), filter), 2
|
||||
));
|
||||
|
||||
// 0: Create a 2/1 white Car Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.
|
||||
this.addAbility(new LoyaltyAbility(new AjaniNacatlAvengerZeroEffect(), 0));
|
||||
|
||||
// -4: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
|
||||
this.addAbility(new LoyaltyAbility(new AjaniNacatlAvengerMinusFourEffect(), -4));
|
||||
}
|
||||
|
||||
private AjaniNacatlAvenger(final AjaniNacatlAvenger card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvenger copy() {
|
||||
return new AjaniNacatlAvenger(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AjaniNacatlAvengerZeroEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("red permanent other than {this}");
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.RED));
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, true);
|
||||
|
||||
AjaniNacatlAvengerZeroEffect() {
|
||||
super(Outcome.PutCreatureInPlay);
|
||||
staticText = "Create a 2/1 white Cat Warrior creature token. "
|
||||
+ "When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerZeroEffect(final AjaniNacatlAvengerZeroEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerZeroEffect copy() {
|
||||
return new AjaniNacatlAvengerZeroEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
if (!new CreateTokenEffect(new CatWarrior21Token()).apply(game, source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility(
|
||||
new DamageTargetEffect(CreaturesYouControlCount.PLURAL),
|
||||
false,
|
||||
"When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.",
|
||||
condition
|
||||
);
|
||||
reflexive.addTarget(new TargetAnyTarget());
|
||||
game.fireReflexiveTriggeredAbility(reflexive, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Inspired by Mythos of Snapdax
|
||||
class AjaniNacatlAvengerMinusFourEffect extends OneShotEffect {
|
||||
|
||||
private static final List<CardType> cardTypes = Arrays.asList(
|
||||
CardType.ARTIFACT,
|
||||
CardType.CREATURE,
|
||||
CardType.ENCHANTMENT,
|
||||
CardType.PLANESWALKER
|
||||
);
|
||||
|
||||
AjaniNacatlAvengerMinusFourEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "Each opponent chooses an artifact, a creature, an enchantment and a planeswalker "
|
||||
+ "from among the nonland permanents they control, then sacrifices the rest.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerMinusFourEffect(final AjaniNacatlAvengerMinusFourEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerMinusFourEffect copy() {
|
||||
return new AjaniNacatlAvengerMinusFourEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Player> playerList = game
|
||||
.getOpponents(controller.getId())
|
||||
.stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Set<UUID> toKeep = new HashSet<>();
|
||||
for (Player player : playerList) {
|
||||
for (CardType cardType : cardTypes) {
|
||||
String message = CardUtil.addArticle(cardType.toString());
|
||||
FilterPermanent filter = new FilterNonlandPermanent(message);
|
||||
filter.add(cardType.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(player.getId()));
|
||||
if (game.getBattlefield().count(filter, source.getControllerId(), source, game) == 0) {
|
||||
continue;
|
||||
}
|
||||
TargetPermanent target = new TargetPermanent(filter);
|
||||
target.withNotTarget(true);
|
||||
player.choose(outcome, target, source, game);
|
||||
toKeep.add(target.getFirstTarget());
|
||||
}
|
||||
}
|
||||
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_NON_LAND, source.getControllerId(), game)) {
|
||||
if (permanent == null || toKeep.contains(permanent.getId()) || !controller.hasOpponent(permanent.getControllerId(), game)) {
|
||||
continue;
|
||||
}
|
||||
permanent.sacrifice(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,27 +1,49 @@
|
|||
package mage.cards.a;
|
||||
|
||||
import mage.MageInt;
|
||||
import mage.constants.Pronoun;
|
||||
import mage.ObjectColor;
|
||||
import mage.abilities.Ability;
|
||||
import mage.abilities.LoyaltyAbility;
|
||||
import mage.abilities.common.DiesOneOrMoreTriggeredAbility;
|
||||
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
|
||||
import mage.abilities.common.delayed.ReflexiveTriggeredAbility;
|
||||
import mage.abilities.condition.Condition;
|
||||
import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition;
|
||||
import mage.abilities.dynamicvalue.common.CreaturesYouControlCount;
|
||||
import mage.abilities.effects.OneShotEffect;
|
||||
import mage.abilities.effects.common.CreateTokenEffect;
|
||||
import mage.abilities.effects.common.DamageTargetEffect;
|
||||
import mage.abilities.effects.common.ExileAndReturnSourceEffect;
|
||||
import mage.abilities.keyword.TransformAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.abilities.effects.common.counter.AddCountersAllEffect;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.cards.TransformingDoubleFacedCard;
|
||||
import mage.constants.*;
|
||||
import mage.counters.CounterType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterControlledCreaturePermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.common.FilterNonlandPermanent;
|
||||
import mage.filter.predicate.mageobject.AnotherPredicate;
|
||||
import mage.filter.predicate.mageobject.ColorPredicate;
|
||||
import mage.filter.predicate.permanent.ControllerIdPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.token.CatWarrior21Token;
|
||||
import mage.players.Player;
|
||||
import mage.target.TargetPermanent;
|
||||
import mage.target.common.TargetAnyTarget;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
import java.util.UUID;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Susucr
|
||||
*/
|
||||
public final class AjaniNacatlPariah extends CardImpl {
|
||||
public final class AjaniNacatlPariah extends TransformingDoubleFacedCard {
|
||||
|
||||
public static final FilterCreaturePermanent filter = new FilterCreaturePermanent(SubType.CAT, "other Cats you control");
|
||||
private static final FilterControlledCreaturePermanent nacatlAvengerFilter = new FilterControlledCreaturePermanent(SubType.CAT, "Cat you control");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
|
|
@ -29,25 +51,34 @@ public final class AjaniNacatlPariah extends CardImpl {
|
|||
}
|
||||
|
||||
public AjaniNacatlPariah(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}");
|
||||
super(ownerId, setInfo,
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.CREATURE}, new SubType[]{SubType.CAT, SubType.WARRIOR}, "{1}{W}",
|
||||
"Ajani, Nacatl Avenger",
|
||||
new SuperType[]{SuperType.LEGENDARY}, new CardType[]{CardType.PLANESWALKER}, new SubType[]{SubType.AJANI}, "RW");
|
||||
|
||||
this.supertype.add(SuperType.LEGENDARY);
|
||||
this.subtype.add(SubType.CAT);
|
||||
this.subtype.add(SubType.WARRIOR);
|
||||
this.power = new MageInt(1);
|
||||
this.toughness = new MageInt(2);
|
||||
|
||||
this.secondSideCardClazz = mage.cards.a.AjaniNacatlAvenger.class;
|
||||
this.getLeftHalfCard().setPT(1, 2);
|
||||
this.getRightHalfCard().setStartingLoyalty(3);
|
||||
|
||||
// When Ajani, Nacatl Pariah enters the battlefield, create a 2/1 white Cat Warrior creature token.
|
||||
this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CatWarrior21Token())));
|
||||
this.getLeftHalfCard().addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new CatWarrior21Token())));
|
||||
|
||||
// Whenever one or more other Cats you control die, you may exile Ajani, then return him to the battlefield transformed under his owner's control.
|
||||
this.addAbility(new TransformAbility());
|
||||
this.addAbility(new DiesOneOrMoreTriggeredAbility(
|
||||
this.getLeftHalfCard().addAbility(new DiesOneOrMoreTriggeredAbility(
|
||||
new ExileAndReturnSourceEffect(PutCards.BATTLEFIELD_TRANSFORMED, Pronoun.HE),
|
||||
filter,
|
||||
true));
|
||||
|
||||
// Ajani, Nacatl Avenger
|
||||
// +2: Put a +1/+1 counter on each Cat you control.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(
|
||||
new AddCountersAllEffect(CounterType.P1P1.createInstance(), nacatlAvengerFilter), 2
|
||||
));
|
||||
|
||||
// 0: Create a 2/1 white Car Warrior creature token. When you do, if you control a red permanent other than Ajani, Nacatl Avenger, he deals damage equal to the number of creatures you control to any target.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new AjaniNacatlAvengerZeroEffect(), 0));
|
||||
|
||||
// -4: Each opponent chooses an artifact, a creature, an enchantment and a planeswalker from among the nonland permanents they control, then sacrifices the rest.
|
||||
this.getRightHalfCard().addAbility(new LoyaltyAbility(new AjaniNacatlAvengerMinusFourEffect(), -4));
|
||||
}
|
||||
|
||||
private AjaniNacatlPariah(final AjaniNacatlPariah card) {
|
||||
|
|
@ -59,3 +90,116 @@ public final class AjaniNacatlPariah extends CardImpl {
|
|||
return new AjaniNacatlPariah(this);
|
||||
}
|
||||
}
|
||||
|
||||
class AjaniNacatlAvengerZeroEffect extends OneShotEffect {
|
||||
|
||||
private static final FilterPermanent filter = new FilterPermanent("red permanent other than {this}");
|
||||
|
||||
static {
|
||||
filter.add(new ColorPredicate(ObjectColor.RED));
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
private static final Condition condition = new PermanentsOnTheBattlefieldCondition(filter, true);
|
||||
|
||||
AjaniNacatlAvengerZeroEffect() {
|
||||
super(Outcome.PutCreatureInPlay);
|
||||
staticText = "Create a 2/1 white Cat Warrior creature token. "
|
||||
+ "When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerZeroEffect(final AjaniNacatlAvengerZeroEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerZeroEffect copy() {
|
||||
return new AjaniNacatlAvengerZeroEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
if (!new CreateTokenEffect(new CatWarrior21Token()).apply(game, source)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ReflexiveTriggeredAbility reflexive = new ReflexiveTriggeredAbility(
|
||||
new DamageTargetEffect(CreaturesYouControlCount.PLURAL),
|
||||
false,
|
||||
"When you do, if you control a red permanent other than {this}, "
|
||||
+ "he deals damage equal to the number of creatures you control to any target.",
|
||||
condition
|
||||
);
|
||||
reflexive.addTarget(new TargetAnyTarget());
|
||||
game.fireReflexiveTriggeredAbility(reflexive, source);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Inspired by Mythos of Snapdax
|
||||
class AjaniNacatlAvengerMinusFourEffect extends OneShotEffect {
|
||||
|
||||
private static final List<CardType> cardTypes = Arrays.asList(
|
||||
CardType.ARTIFACT,
|
||||
CardType.CREATURE,
|
||||
CardType.ENCHANTMENT,
|
||||
CardType.PLANESWALKER
|
||||
);
|
||||
|
||||
AjaniNacatlAvengerMinusFourEffect() {
|
||||
super(Outcome.Benefit);
|
||||
staticText = "Each opponent chooses an artifact, a creature, an enchantment and a planeswalker "
|
||||
+ "from among the nonland permanents they control, then sacrifices the rest.";
|
||||
}
|
||||
|
||||
private AjaniNacatlAvengerMinusFourEffect(final AjaniNacatlAvengerMinusFourEffect effect) {
|
||||
super(effect);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AjaniNacatlAvengerMinusFourEffect copy() {
|
||||
return new AjaniNacatlAvengerMinusFourEffect(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Game game, Ability source) {
|
||||
Player controller = game.getPlayer(source.getControllerId());
|
||||
if (controller == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Player> playerList = game
|
||||
.getOpponents(controller.getId())
|
||||
.stream()
|
||||
.map(game::getPlayer)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Set<UUID> toKeep = new HashSet<>();
|
||||
for (Player player : playerList) {
|
||||
for (CardType cardType : cardTypes) {
|
||||
String message = CardUtil.addArticle(cardType.toString());
|
||||
FilterPermanent filter = new FilterNonlandPermanent(message);
|
||||
filter.add(cardType.getPredicate());
|
||||
filter.add(new ControllerIdPredicate(player.getId()));
|
||||
if (game.getBattlefield().count(filter, source.getControllerId(), source, game) == 0) {
|
||||
continue;
|
||||
}
|
||||
TargetPermanent target = new TargetPermanent(filter);
|
||||
target.withNotTarget(true);
|
||||
player.choose(outcome, target, source, game);
|
||||
toKeep.add(target.getFirstTarget());
|
||||
}
|
||||
}
|
||||
|
||||
for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT_NON_LAND, source.getControllerId(), game)) {
|
||||
if (permanent == null || toKeep.contains(permanent.getId()) || !controller.hasOpponent(permanent.getControllerId(), game)) {
|
||||
continue;
|
||||
}
|
||||
permanent.sacrifice(source, game);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,9 @@ public final class AlabornZealot extends CardImpl {
|
|||
|
||||
// When Alaborn Zealot blocks a creature, destroy that creature and Alaborn Zealot.
|
||||
TriggeredAbility ability = new BlocksCreatureTriggeredAbility(
|
||||
new DestroyTargetEffect().setText("destroy that creature")
|
||||
new DestroyTargetEffect().setText("destroy both")
|
||||
);
|
||||
ability.addEffect(new DestroySourceEffect().setText("and {this}"));
|
||||
ability.addEffect(new DestroySourceEffect().setText(" creatures"));
|
||||
ability.setTriggerPhrase("When {this} blocks a creature, ");
|
||||
this.addAbility(ability);
|
||||
}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue