Compare commits

...

5044 Commits

Author SHA1 Message Date
Blacksmith
4049d23562 [maven-release-plugin] prepare release forge-1.6.35 2020-06-29 02:47:40 +00:00
Blacksmith
50e2cf1f88 Update README.txt for release 2020-06-29 02:44:57 +00:00
swordshine
7f5a56fe4f Merge branch 'migrate-m21' into 'master'
Migrate m21 cards

See merge request core-developers/forge!2929
2020-06-29 01:40:00 +00:00
friarsol
bf74bd2f09 Update announcements 2020-06-28 21:29:42 -04:00
Sol
8f20aa39ca Merge branch 'm21' into 'master'
Updated deck legality

See merge request core-developers/forge!2925
2020-06-29 01:23:30 +00:00
friarsol
922c1fb541 Update block data for M21 2020-06-28 21:06:53 -04:00
friarsol
55973e8c75 Migrate new cards 2020-06-28 21:00:39 -04:00
swordshine
54e8c6f0ec Merge branch 'patch' into 'master'
Add Ormos, Archive Keeper

See merge request core-developers/forge!2927
2020-06-29 01:00:15 +00:00
friarsol
0837e0de8c Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2020-06-28 20:57:59 -04:00
swordshine
da6188e61c Update es-ES 2020-06-29 08:54:14 +08:00
Michael Kamensky
52fef4b724 Merge branch 'heartPiecerTrigger' into 'master'
ImmediateTrigger: use this trigger for heart-piercer manticore and get rid of CauseParam

See merge request core-developers/forge!2928
2020-06-28 16:20:09 +00:00
Hans Mackowiak
f29cd22926 ImmediateTrigger: use this trigger for heart-piercer manticore and get rid of CauseParam 2020-06-28 17:53:47 +02:00
swordshine
ab6a322f98 Fix a line in AiCostDecision 2020-06-28 22:35:32 +08:00
swordshine
e44125ec1c Update zh-CN 2020-06-28 21:53:51 +08:00
swordshine
558fbd3946 Add Ormos, Archive Keeper 2020-06-28 20:40:56 +08:00
austinio7116
1051fc676b Some Theros data added
(cherry picked from commit 0d48d99)
2020-06-28 13:05:41 +01:00
austinio7116
23737aa21a Updated deck legality
(cherry picked from commit c2f19b0)
2020-06-28 10:12:34 +01:00
swordshine
47f527b3ff Merge branch 'patch' into 'master'
Add Towering Titan

See merge request core-developers/forge!2924
2020-06-28 07:07:08 +00:00
swordshine
b06add33d2 Update the script 2020-06-28 14:44:17 +08:00
swordshine
24d2c8dc2f Add Towering Titan 2020-06-28 14:06:42 +08:00
swordshine
2fb6849ae2 Merge branch 'patch' into 'master'
Add Inniaz, the Gale Force

See merge request core-developers/forge!2921
2020-06-28 01:44:50 +00:00
swordshine
f5de946830 Merge branch 'mill2' into 'master'
Remove Mill effect from non-mill cards

See merge request core-developers/forge!2908
2020-06-28 01:44:43 +00:00
Tim Mocny
39deffdc56 Remove Mill effect from non-mill cards 2020-06-28 01:44:43 +00:00
swordshine
85062cba83 Merge branch 'JMP.27' into 'master'
JMP - 27 June

See merge request core-developers/forge!2922
2020-06-28 01:36:00 +00:00
Tim Mocny
17392a29ab JMP - 27 June 2020-06-28 01:35:59 +00:00
swordshine
aa21883049 Add Inniaz, the Gale Force 2020-06-27 22:28:20 +08:00
Michael Kamensky
ca7691adee Merge branch 'sanctumOfAll' into 'master'
M21: add Sanctum of All

Closes #1471

See merge request core-developers/forge!2920
2020-06-27 13:18:25 +00:00
Hans Mackowiak
51fdf21d1e M21: add Sanctum of All 2020-06-27 14:53:01 +02:00
swordshine
015bb428e4 Merge branch 'master' into 'master'
fix:missing some translation

See merge request core-developers/forge!2919
2020-06-27 11:03:23 +00:00
CCTV-1
645b6d89d2 fix:missing some translation. 2020-06-27 18:36:57 +08:00
Michael Kamensky
e60986e04e Merge branch 'SRPref' into 'master'
Screen reader flag with Initial Mana Cost handling

See merge request core-developers/forge!2916
2020-06-27 05:22:18 +00:00
swordshine
e8eb7abf48 Merge branch 'JMP.26' into 'master'
JMP - 26 June

See merge request core-developers/forge!2917
2020-06-27 03:25:16 +00:00
swordshine
425472cd54 Merge branch 'card_fix' into 'master'
fix "Sublime Epiphany"

See merge request core-developers/forge!2918
2020-06-27 03:24:37 +00:00
CCTV-1
48f109b7f6 fix:"Sublime Epiphany" can't select draw card player. 2020-06-27 09:56:55 +08:00
friarsol
df09cba493 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2020-06-26 21:40:38 -04:00
Northmoc
420db21d83 immolating_gyre.txt 2020-06-26 15:27:52 -04:00
Zachary Kline
54436ac2e3 Initial screen reader optimization. 2020-06-26 11:54:36 -07:00
Michael Kamensky
bb0d6c4606 Merge branch 'patch' into 'master'
Add Eon Frolicker

Closes #1362

See merge request core-developers/forge!2914
2020-06-26 17:11:57 +00:00
Michael Kamensky
dc058fccc1 Merge branch 'typo' into 'master'
pestilent_haze.txt fix

See merge request core-developers/forge!2915
2020-06-26 17:11:29 +00:00
Northmoc
8af5c1302d pestilent_haze.txt fix 2020-06-26 12:11:53 -04:00
swordshine
29a7c98185 Add Eon Frolicker 2020-06-26 22:18:54 +08:00
swordshine
bb4f4272ca Merge branch 'patch' into 'master'
More cards

Closes #1473

See merge request core-developers/forge!2912
2020-06-26 12:57:39 +00:00
swordshine
01183c454b Update ReplacementMill 2020-06-26 16:46:14 +08:00
swordshine
e3863b0712 Merge branch 'patch-7' into 'master'
Update es-ES.properties

See merge request core-developers/forge!2913
2020-06-26 06:50:52 +00:00
Churrufli
0cff9ebdf0 Update es-ES.properties 2020-06-26 06:43:24 +00:00
swordshine
5fc1f92309 Update Charmed Pendant to be compatible with ChangeText effects 2020-06-26 14:39:51 +08:00
swordshine
7b0247aba5 Merge branch 'thriving_land' into 'master'
JMP: add Thriving lands

See merge request core-developers/forge!2911
2020-06-26 05:50:33 +00:00
swordshine
f9f2b65e45 Add Sanctuary Blade 2020-06-26 13:42:14 +08:00
Hans Mackowiak
e4fb9d8a9b JMP: add Thriving lands 2020-06-26 07:02:20 +02:00
swordshine
f8dab4a4b2 Merge branch 'patch' into 'master'
Update CostMill

See merge request core-developers/forge!2910
2020-06-26 04:36:53 +00:00
swordshine
088062a93e Update Ai PaymentDecision 2020-06-26 12:14:27 +08:00
swordshine
6049a681e8 Update CostMill 2020-06-26 12:04:15 +08:00
swordshine
c622291c4e Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!2909
2020-06-26 03:38:28 +00:00
swordshine
450c7c5b71 Update some scripts 2020-06-26 11:33:38 +08:00
swordshine
b5ebf2185f Merge branch 'mill' into 'master'
Mill oracle updates

Closes #1469

See merge request core-developers/forge!2907
2020-06-26 03:30:28 +00:00
Tim Mocny
fa240f6dc2 Mill oracle updates 2020-06-26 03:30:27 +00:00
swordshine
b23b4a0888 Merge branch 'JMP.24' into 'master'
JMP - 24 June

See merge request core-developers/forge!2906
2020-06-26 03:24:46 +00:00
Tim Mocny
2fc2d623a8 JMP - 24 June 2020-06-26 03:24:44 +00:00
swordshine
58c7d69d27 Merge branch 'patch' into 'master'
More JMP cards (will update the CostMill after the oracle changes are finished)

See merge request core-developers/forge!2905
2020-06-26 03:22:13 +00:00
swordshine
730a7adf2a Update the scripts 2020-06-25 13:55:17 +08:00
swordshine
39d24724c6 Move cards to the JMP folder 2020-06-24 22:40:37 +08:00
swordshine
1053b3fdea JMP: Add Bruvac the Grandiloquent 2020-06-24 22:09:00 +08:00
swordshine
cbc3f6a568 JMP: Add Emiel the Blessed 2020-06-24 22:09:00 +08:00
swordshine
d007e86779 JMP: Add Zurzoth, Chaos Rider 2020-06-24 22:09:00 +08:00
Michael Kamensky
0503177c77 Merge branch 'master' into 'master'
Fix padding in quest draft tournaments screen on mobile.

See merge request core-developers/forge!2904
2020-06-24 13:21:23 +00:00
Michael Kamensky
ffc2187fea Merge branch 'patch' into 'master'
M21: Add Chandra's Incinerator

See merge request core-developers/forge!2903
2020-06-24 13:17:48 +00:00
Agetian
69d8aeb875 - Fix padding in quest draft tournaments screen on mobile. 2020-06-24 16:13:21 +03:00
swordshine
2e15415666 M21: Add Chandra's Incinerator 2020-06-24 16:07:13 +08:00
swordshine
17333c2ae9 Merge branch 'patch' into 'master'
More M21 cards

See merge request core-developers/forge!2902
2020-06-24 08:05:32 +00:00
swordshine
b9064dad3f Add Nine Lives 2020-06-24 15:16:41 +08:00
swordshine
b1c87c7f83 Two more M21 cards 2020-06-24 14:59:01 +08:00
swordshine
e8dba06444 More M21 cards 2020-06-24 14:52:29 +08:00
Michael Kamensky
46283cebd3 Merge branch 'M21.23' into 'master'
M21 - 23 June

See merge request core-developers/forge!2901
2020-06-24 04:31:53 +00:00
Tim Mocny
86573dedf1 M21 - 23 June 2020-06-24 04:31:52 +00:00
Michael Kamensky
f57ece280f Merge branch 'patch' into 'master'
Add Teferi, Timeless Voyager

Closes #1466

See merge request core-developers/forge!2900
2020-06-23 14:44:24 +00:00
swordshine
f4f0950f72 Merge branch 'M21.22' into 'master'
M21 - 22 June

See merge request core-developers/forge!2899
2020-06-23 13:55:45 +00:00
Tim Mocny
d507de72ff M21 - 22 June 2020-06-23 13:55:45 +00:00
swordshine
9b1c8e0980 Update the "UntilTheEndOfYourNextTurn" for Teferi, Timeless Voyager 2020-06-23 20:57:54 +08:00
swordshine
1e46df363f Merge branch 'M21.21a' into 'master'
M21 - 21 June (more)

See merge request core-developers/forge!2897
2020-06-23 01:56:53 +00:00
Tim Mocny
eface99d95 M21 - 21 June (more) 2020-06-23 01:56:52 +00:00
Michael Kamensky
9dc42e68fb Merge branch 'master' into 'master'
Fix a crash when accessing tournaments in a new quest

See merge request core-developers/forge!2898
2020-06-22 09:13:27 +00:00
Agetian
1a6b51bae2 - Fix a crash when accessing tournaments in a new quest 2020-06-22 12:02:29 +03:00
swordshine
39c6de95fd Merge branch 'M21.20' into 'master'
M21 - 20 June

See merge request core-developers/forge!2891
2020-06-22 01:42:33 +00:00
Tim Mocny
d3275d78fb M21 - 20 June 2020-06-22 01:42:33 +00:00
swordshine
29afbd67a9 Merge branch 'typo' into 'master'
dream_leash.txt text update

See merge request core-developers/forge!2896
2020-06-22 01:05:02 +00:00
Northmoc
d4aefdeca1 dream_leash.txt text update 2020-06-21 14:27:06 -04:00
Michael Kamensky
0df56097af Merge branch 'M21.21' into 'master'
M21 - 21 June

See merge request core-developers/forge!2895
2020-06-21 14:09:22 +00:00
Tim Mocny
3bbadca04f M21 - 21 June 2020-06-21 14:09:21 +00:00
Michael Kamensky
9034b28747 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2893
2020-06-21 14:04:21 +00:00
Michael Kamensky
332116509d Merge branch 'patch' into 'master'
Jumpstart: Add Tinybones, Trinket Thief

See merge request core-developers/forge!2894
2020-06-21 11:23:56 +00:00
CCTV-1
37c846330f response code review 2020-06-21 12:20:14 +08:00
swordshine
93dfb28b70 Jumpstart: Add Tinybones, Trinket Thief 2020-06-21 11:51:33 +08:00
Michael Kamensky
20e41c4fda Merge branch 'M21support' into 'master'
M21 support

See merge request core-developers/forge!2892
2020-06-21 03:30:09 +00:00
Tim Mocny
5d61cd795a M21 support 2020-06-21 03:30:09 +00:00
CCTV-1
4513976f20 some m21 cards 2020-06-21 09:17:41 +08:00
Michael Kamensky
ba0b5f813b Merge branch 'patch' into 'master'
Add Basri Ket

See merge request core-developers/forge!2890
2020-06-20 18:33:46 +00:00
swordshine
1e3531efc6 Add AI hints 2020-06-20 23:03:24 +08:00
swordshine
0e9287ba2f Merge branch 'M21.19' into 'master'
M21 - 19 June

See merge request core-developers/forge!2887
2020-06-20 14:35:25 +00:00
Tim Mocny
f65ec5455f M21 - 19 June 2020-06-20 14:35:24 +00:00
swordshine
26e0bdb545 Merge branch 'typo' into 'master'
biomass_mutation.txt typo

See merge request core-developers/forge!2888
2020-06-20 14:33:16 +00:00
swordshine
dc300a9929 Update Basri Ket's second ability (the script is implemented by Tim Mocny) 2020-06-20 22:30:23 +08:00
swordshine
d171577127 Merge branch 'patch' into 'master'
Add Carrion Grub

See merge request core-developers/forge!2889
2020-06-20 14:26:28 +00:00
swordshine
c9e0d7722c Add Carrion Grub 2020-06-20 21:52:09 +08:00
Northmoc
a95321de4e biomass_mutation.txt typo 2020-06-20 08:21:02 -04:00
Michael Kamensky
2ec4479994 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2886
2020-06-19 14:32:34 +00:00
CCTV-1
414b8b0bae response codereview 2020-06-19 19:16:04 +08:00
CCTV-1
b4686e5643 some m21 cards 2020-06-19 11:13:42 +08:00
Michael Kamensky
28f6edaccb Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2884
2020-06-18 12:39:03 +00:00
CCTV-1
2359a4b435 fix typo 2020-06-18 16:03:43 +08:00
CCTV-1
5b0bdff50c response codereview 2020-06-18 11:32:47 +08:00
Michael Kamensky
a7c5dd2681 Merge branch 'patch-6' into 'master'
Update de-DE.properties

See merge request core-developers/forge!2876
2020-06-18 03:14:14 +00:00
Michael Kamensky
4d9bbef480 Merge branch 'M21.16' into 'master'
M21 - 16 June

See merge request core-developers/forge!2883
2020-06-18 03:13:48 +00:00
Tim Mocny
20b599d52a M21 - 16 June 2020-06-18 03:13:48 +00:00
Michael Kamensky
e9bcdcc133 Merge branch 'fix_menace_counters' into 'master'
Fix menace counters

See merge request core-developers/forge!2885
2020-06-18 03:12:01 +00:00
Sol
90dc1a6898 Update frillscare_mentor.txt 2020-06-18 02:40:47 +00:00
Sol
3a56cd60b8 Update blood_curdle.txt 2020-06-18 02:40:20 +00:00
CCTV-1
51ec7b049b light_of_promise.txt 2020-06-18 08:59:37 +08:00
CCTV-1
1061b2e605 some m21 cards 2020-06-17 21:09:20 +08:00
swordshine
a71f8e2932 Merge branch 'M21.15' into 'master'
M21 - 15 June

See merge request core-developers/forge!2882
2020-06-17 01:33:24 +00:00
Tim Mocny
90e9f738b0 M21 - 15 June 2020-06-17 01:33:23 +00:00
swordshine
68a33b1322 Merge branch 'typos' into 'master'
Typos :: TgtPromp$ -> TgtPrompt$

See merge request core-developers/forge!2881
2020-06-16 04:50:01 +00:00
Northmoc
d74f4aa671 TgtPromp$ -> TgtPrompt$ 2020-06-15 16:10:24 -04:00
Michael Kamensky
498acbd496 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2880
2020-06-15 12:49:09 +00:00
CCTV-1
56cb550850 response codereview 2020-06-15 18:24:00 +08:00
CCTV-1
f28b9c8d03 code cleanup 2020-06-15 16:15:07 +08:00
CCTV-1
9a00c7d02a response codereview 2020-06-15 15:59:49 +08:00
CCTV-1
a7c69d6841 some m21 cards 2020-06-15 10:42:32 +08:00
Michael Kamensky
63f9457162 Merge branch '1451-archenemy-modes-are-not-working-as-intended' into 'master'
Resolve "Archenemy modes are not working as intended"

Closes #1451

See merge request core-developers/forge!2878
2020-06-14 03:19:57 +00:00
Hans Mackowiak
0a18cff766 Player: fix Scheme not triggering for set in motion 2020-06-13 21:15:39 +02:00
Andreas Bendel
95e5316336 Update de-DE.properties 2020-06-13 15:37:23 +00:00
swordshine
9888263507 Merge branch 'M21ed.rough' into 'master'
M21 - edition file

See merge request core-developers/forge!2862
2020-06-13 13:50:14 +00:00
Tim Mocny
2001d6e685 M21 - edition file 2020-06-13 13:50:14 +00:00
swordshine
39899fe859 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2875
2020-06-13 13:49:41 +00:00
CCTV-1
1ef8d32dfe response codereview 2020-06-13 21:23:42 +08:00
CCTV-1
9b16919c37 four m21 cards 2020-06-13 21:09:52 +08:00
CCTV-1
a4f70cea78 some m21 cards 2020-06-13 20:34:08 +08:00
swordshine
103669eee3 Merge branch 'hounddog' into 'master'
Hound -> Dog

Closes #1454

See merge request core-developers/forge!2868
2020-06-13 12:17:05 +00:00
Tim Mocny
25260f8d7c Hound -> Dog 2020-06-13 12:17:05 +00:00
swordshine
eeec573798 Merge branch 'M21.11' into 'master'
M21 - 11 June

See merge request core-developers/forge!2872
2020-06-13 05:09:45 +00:00
Tim Mocny
f6e56ee23f M21 - 11 June 2020-06-13 05:09:44 +00:00
Michael Kamensky
d175ca87c7 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2873
2020-06-12 20:25:52 +00:00
CCTV-1
a59412550d some m21 cards 2020-06-12 13:18:15 +08:00
CCTV-1
dd78ab67eb fix card 'Havoc Jester' P/T 2020-06-12 13:17:31 +08:00
swordshine
05100f5689 Merge branch 'M21.10' into 'master'
M21 - 10 June

See merge request core-developers/forge!2869
2020-06-12 01:44:02 +00:00
Tim Mocny
69b30e4313 M21 - 10 June 2020-06-12 01:44:02 +00:00
swordshine
d509c87371 Merge branch 'new_cards' into 'master'
some m21 cards

See merge request core-developers/forge!2871
2020-06-12 01:42:41 +00:00
CCTV-1
aa15b7d5da remove LegacyImage 2020-06-12 07:53:30 +08:00
CCTV-1
674514c158 some m21 cards 2020-06-11 20:50:51 +08:00
Michael Kamensky
961fdae04a Merge branch 'cube_patch' into 'master'
update cubes

See merge request core-developers/forge!2870
2020-06-11 04:51:46 +00:00
swordshine
73ac827d0b Merge branch 'lord.AI' into 'master'
lord_of_atlantis.txt DeckHints

See merge request core-developers/forge!2867
2020-06-11 01:17:27 +00:00
swordshine
6961d63127 Merge branch 'tahngarth.typo' into 'master'
tahngarth_first_mate.txt typo

See merge request core-developers/forge!2866
2020-06-11 01:17:10 +00:00
CCTV-1
19f36789c2 support amaz peasant cube 2020-06-11 08:28:03 +08:00
CCTV-1
31dea9a94d update mtga cube list 2020-06-11 08:27:37 +08:00
CCTV-1
c6839717f9 remove duplicate cube 2020-06-11 08:27:14 +08:00
Northmoc
5a0f5bc4ba lord_of_atlantis.txt DeckHints 2020-06-10 10:27:35 -04:00
Northmoc
ead2f62b5f tahngarth_first_mate.txt CARDNAME missing 2020-06-10 09:18:46 -04:00
Michael Kamensky
779db06765 Merge branch 'M21.9' into 'master'
M21 - 9 June

See merge request core-developers/forge!2865
2020-06-10 05:29:04 +00:00
Tim Mocny
288fe96a94 M21 - 9 June 2020-06-10 05:29:02 +00:00
Michael Kamensky
f3b86e0532 Merge branch 'tamitypo' into 'master'
tamiyo_field_researcher.txt typo

See merge request core-developers/forge!2864
2020-06-10 05:28:03 +00:00
Michael Kamensky
deeccf93d4 Merge branch 'chandraflamecat' into 'master'
chandra_flames_catalyst.txt

See merge request core-developers/forge!2863
2020-06-10 05:27:25 +00:00
Northmoc
c03848dc1d tamiyo_field_researcher.txt typo 2020-06-09 10:49:48 -04:00
Northmoc
a44b2a31cd chandra_flames_catalyst.txt 2020-06-09 10:48:56 -04:00
Michael Kamensky
9370dc0036 Merge branch 'patch-6' into 'master'
Update de-DE.properties

See merge request core-developers/forge!2857
2020-06-09 08:17:46 +00:00
Michael Kamensky
4ef89b9963 Merge branch 'M21.8' into 'master'
M21 - 8 June

See merge request core-developers/forge!2861
2020-06-09 05:18:55 +00:00
Tim Mocny
30dcdfb88a M21 - 8 June 2020-06-09 05:18:55 +00:00
Michael Kamensky
833395fb92 Merge branch 'dnaga' into 'master'
desiccated_naga.txt AI update

See merge request core-developers/forge!2859
2020-06-08 14:48:06 +00:00
Michael Kamensky
52b5271af5 Merge branch 'M21.6' into 'master'
liliana_death_mage.txt

See merge request core-developers/forge!2860
2020-06-08 14:47:57 +00:00
Northmoc
b8a7696f40 liliana_death_mage.txt 2020-06-08 09:34:18 -04:00
Northmoc
3cb80c43bf desiccated_naga.txt AI update 2020-06-08 09:25:27 -04:00
Sol
225247d9dc Merge branch 'trackerRevealLKI' into 'master'
PlayerControllerHuman: fix reveal on LKI card list

See merge request core-developers/forge!2848
2020-06-07 14:44:16 +00:00
Hans Mackowiak
2db862ce2d PlayerControllerHuman: fix reveal on LKI card list 2020-06-07 14:44:16 +00:00
Andreas Bendel
e0a1990014 Update de-DE.properties
Typo in translation of lblSelectUpToNumCardFromPlayerZone
2020-06-07 09:33:10 +00:00
Michael Kamensky
68a559552d Merge branch 'M21.6' into 'master'
M21 - 6 June

See merge request core-developers/forge!2856
2020-06-06 15:26:21 +00:00
Michael Kamensky
2ddcb34a08 Merge branch 'chandra' into 'master'
Chandra SSB

See merge request core-developers/forge!2855
2020-06-06 15:24:33 +00:00
Michael Kamensky
28f794743c Merge branch 'M21.5' into 'master'
M21 - 5 June

See merge request core-developers/forge!2853
2020-06-06 15:24:30 +00:00
Tim Mocny
5b830aeb37 M21 - 5 June 2020-06-06 15:24:28 +00:00
Northmoc
499f33ed69 teferis_protege.txt 2020-06-06 11:02:40 -04:00
Northmoc
46ead353d0 ss3 2020-06-06 10:37:03 -04:00
Michael Kamensky
36c04efbff Merge branch 'trampleFix' into 'master'
PlayerControllerHuman: fix trample assign to defender, fix trample counter

See merge request core-developers/forge!2854
2020-06-06 09:50:49 +00:00
Hans Mackowiak
653d214027 PlayerControllerHuman: fix trample assign to defender, fix trample counter 2020-06-06 09:10:05 +02:00
Michael Kamensky
f60fdf3fa5 Merge branch 'M21.4' into 'master'
M21 - 4 June

See merge request core-developers/forge!2851
2020-06-06 03:35:43 +00:00
Tim Mocny
b3015128a1 M21 - 4 June 2020-06-06 03:35:43 +00:00
Sol
2c038396b6 Update retribution_of_the_ancients.txt 2020-06-05 16:17:28 +00:00
Michael Kamensky
2370c2c8ba Merge branch 'counterTypeNetwork' into 'master'
CounterType: needs to be serializable for Network

See merge request core-developers/forge!2852
2020-06-05 05:56:19 +00:00
Hans Mackowiak
d743bd5168 CounterType: needs to be serializable for Network 2020-06-05 07:42:15 +02:00
Michael Kamensky
4880448102 Merge branch 'migrate.upcoming' into 'master'
Migrate remaining IKO/C20 from upcoming

See merge request core-developers/forge!2850
2020-06-04 17:49:38 +00:00
Northmoc
b34fd44cfd Migrate remaining IKO/C20 from upcoming 2020-06-04 12:08:34 -04:00
Michael Kamensky
4acfd71123 Merge branch 'references' into 'master'
References cleanups

Closes #1395

See merge request core-developers/forge!2813
2020-06-02 02:50:34 +00:00
Tim Mocny
dd72be2f7a References cleanups 2020-06-02 02:50:34 +00:00
Michael Kamensky
b140ca57be Merge branch 'patch-7' into 'master'
Update Secret Lair Drop Series.txt

See merge request core-developers/forge!2845
2020-06-02 02:49:53 +00:00
Michael Kamensky
14f2b25c45 Merge branch 'patch-8' into 'master'
Update Amalia Sheran Sharm 1.dck

Closes #1440

See merge request core-developers/forge!2846
2020-06-02 02:49:47 +00:00
Michael Kamensky
8bfcd1815a Merge branch 'sedgeSliverFix' into 'master'
Card: fix addChangedCardTraits when multiple StaticAbilities has the same timestamp

See merge request core-developers/forge!2849
2020-06-02 02:49:04 +00:00
Sol
95a8f5c031 Update pyrewild_shaman.txt 2020-06-02 02:34:22 +00:00
Hans Mackowiak
1b40987bbd Card: fix addChangedCardTraits when multiple StaticAbilities has the same timestamp 2020-06-01 22:04:55 +02:00
Sol
febeaf4eec Merge branch '1Junbnr' into 'master'
1 June bannings

See merge request core-developers/forge!2847
2020-06-01 19:40:07 +00:00
Tim Mocny
1079ad8e83 1 June bannings 2020-06-01 19:40:07 +00:00
Tim Mocny
d67a1e7534 Update Amalia Sheran Sharm 1.dck 2020-06-01 14:20:10 +00:00
Tim Mocny
46b3c622f0 Update Secret Lair Drop Series.txt 2020-06-01 14:15:43 +00:00
Michael Kamensky
8714399b51 Merge branch '1441-avoid-bad-performance-pattern-involving-interger-parseint' into 'master'
Resolve "Avoid bad performance pattern involving Interger.parseInt"

Closes #1441

See merge request core-developers/forge!2844
2020-05-31 14:22:26 +00:00
Hans Mackowiak
19c07f5bef Resolve "Avoid bad performance pattern involving Interger.parseInt" 2020-05-31 14:22:25 +00:00
Michael Kamensky
33e7cde2d6 Merge branch 'sld' into 'master'
SLD summer drops

Closes #1438

See merge request core-developers/forge!2842
2020-05-31 05:25:55 +00:00
Michael Kamensky
12d6790495 Merge branch 'cycling' into 'master'
flourishing_fox.txt fix

Closes #1435

See merge request core-developers/forge!2843
2020-05-31 05:25:47 +00:00
Northmoc
37f2e75dc4 flourishing_fox.txt fix 2020-05-30 20:17:13 -04:00
Northmoc
019969d804 SLD summer drops 2020-05-30 20:08:15 -04:00
Michael Kamensky
8564d30efc Merge branch 'wrappedAbilityCleanup' into 'master'
WrappedAbility & Trigger: some cleanup

Closes #1400

See merge request core-developers/forge!2841
2020-05-30 17:19:31 +00:00
Hans Mackowiak
51c15a5a4c WrappedAbility & Trigger: some cleanup 2020-05-30 08:29:53 +02:00
Michael Kamensky
3a475f44e4 Merge branch 'cultivate' into 'master'
Cultivate and etc round 2

See merge request core-developers/forge!2836
2020-05-30 03:50:58 +00:00
Tim Mocny
47f2123286 Cultivate and etc round 2 2020-05-30 03:50:57 +00:00
Hans Mackowiak
65ef844444 Merge branch '1439-cardtype-kills-performance' into 'master'
Resolve "CardType kills performance"

Closes #1439

See merge request core-developers/forge!2840
2020-05-29 08:32:19 +00:00
Hans Mackowiak
57b4135f95 CardType: use stringTo Maps as Cache again 2020-05-29 09:44:59 +02:00
Michael Kamensky
3d32915d9f Merge branch 'guiChoiceFixGameCache' into 'master'
Player Human: fix chooseSingleEntityForEffect

See merge request core-developers/forge!2839
2020-05-29 07:19:44 +00:00
Hans Mackowiak
379f9699e8 Player Human: fix chooseSingleEntityForEffect 2020-05-29 09:12:08 +02:00
Hans Mackowiak
0e831f88b9 Merge branch '1434-iko-shredded-sails-incorrect-dmg-to-flying-creature' into 'master'
Resolve "[IKO] Shredded Sails, incorrect dmg to flying creature"

Closes #1434

See merge request core-developers/forge!2838
2020-05-28 08:45:59 +00:00
Hans Mackowiak
8e0c1f4fe3 Update shredded_sails.txt 2020-05-28 07:15:42 +00:00
Hans Mackowiak
d7293c7830 Update boot_nipper.txt 2020-05-27 19:29:36 +00:00
Sol
817b8bf15b Merge branch 'gameCacheGone' into 'master'
PlayerControllerHuman: remove gameCache entirely, always ask Game for Card by ID

See merge request core-developers/forge!2837
2020-05-27 02:18:30 +00:00
Sol
26694ffa5c Merge branch 'counterStringType' into 'master'
CounterType: use String inside CounterType to handle KeywordCounter

See merge request core-developers/forge!2798
2020-05-27 00:17:28 +00:00
Hans Mackowiak
6fde7149a4 - Basic support for CountersMoveAi (e.g. The Ozolith) so at least it doesn't crash, needs improvement. 2020-05-27 00:17:28 +00:00
Hans Mackowiak
815b2bc4aa PlayerControllerHuman: remove gameCache entirely, always ask Game for Card by ID 2020-05-26 23:21:44 +02:00
swordshine
5c7a0adf33 Merge branch 'cultivate' into 'master'
Cultivate and such UI update

See merge request core-developers/forge!2835
2020-05-26 01:34:11 +00:00
Tim Mocny
3a2c66df0b Cultivate and such UI update 2020-05-26 01:34:11 +00:00
Michael Kamensky
b249560dbb Merge branch 'replacementEffectString' into 'master'
ReplacementEffect: add HostCard Name to toString for Human GUI

See merge request core-developers/forge!2834
2020-05-25 16:40:27 +00:00
Hans Mackowiak
a165f314d3 Update Keyword: fix Bloodthirst 2020-05-25 13:59:37 +00:00
Hans Mackowiak
0c27a41566 ReplacementEffect: add HostCard Name to toString for Human GUI 2020-05-25 14:09:54 +02:00
Hans Mackowiak
955a16f1e0 Update ongoing_investigation.txt 2020-05-24 16:09:04 +00:00
Michael Kamensky
1ced1058c9 Merge branch 'gameCacheRework' into 'master'
Human Play: try to remove usage of game.getCard

See merge request core-developers/forge!2804
2020-05-24 11:02:52 +00:00
Hans Mackowiak
ea26f6c689 Human Play: try to remove usage of game.getCard 2020-05-24 11:02:51 +00:00
Michael Kamensky
fc706c8035 Merge branch '1431-npe-in-computerutil-canregenerate' into 'master'
Resolve "NPE in ComputerUtil.canRegenerate"

Closes #1431

See merge request core-developers/forge!2833
2020-05-23 14:00:18 +00:00
Hans Mackowiak
74589d59e4 TokenAi: fix setting Owner of the Token to prevent NPE 2020-05-23 15:42:56 +02:00
Sol
70046c5261 Merge branch 'patch-7' into 'master'
Update liliana_dreadhorde_general.txt

See merge request core-developers/forge!2832
2020-05-22 14:50:16 +00:00
Tim Mocny
3165c57b0e Update liliana_dreadhorde_general.txt 2020-05-22 12:48:43 +00:00
Hans Mackowiak
27968cd561 Merge branch 'buildPluginFix' into 'master'
build-helper-maven-plugin: update version to 3.1.0

See merge request core-developers/forge!2827
2020-05-22 06:44:31 +00:00
swordshine
9cb4911e29 Merge branch 'friarsol-master-patch-87682' into 'master'
Fix Mystic Barrier swallowing triggers

See merge request core-developers/forge!2831
2020-05-22 05:22:11 +00:00
Sol
933fe7ad49 Fix Mystic Barrier swallowing triggers 2020-05-22 05:22:11 +00:00
friarsol
b13503c8a7 Merge remote-tracking branch 'origin/master' 2020-05-21 21:47:52 -04:00
Sol
2bdd598565 Merge branch 'patch-7' into 'master'
typo precognition_field.txt

See merge request core-developers/forge!2830
2020-05-22 00:48:42 +00:00
friarsol
81bcacefc0 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2020-05-21 20:47:24 -04:00
Tim Mocny
215cd20b90 typo precognition_field.txt 2020-05-21 23:50:45 +00:00
Michael Kamensky
0701fd6bbc Merge branch '1424-oome-by-zone-lateststatecardsaddedthisturn' into 'master'
Resolve "OOME by Zone.latestStateCardsAddedThisTurn"

Closes #1424

See merge request core-developers/forge!2828
2020-05-21 15:58:24 +00:00
Michael Kamensky
3e89f64944 Merge branch 'master' into 'master'
Fix DestroyAi hanging when considering auras that control AI's cards

Closes #1425

See merge request core-developers/forge!2829
2020-05-21 14:31:33 +00:00
Agetian
3041788be1 - Fix DestroyAi hanging when considering auras that control AI's cards 2020-05-21 17:18:48 +03:00
Hans Mackowiak
f5e5ddbbb9 MagicStack: call resetCardsAddedThisTurn on onNextTurn 2020-05-21 10:36:03 +00:00
Michael Kamensky
c0578fb246 Merge branch 'synchronize-activator-rd2' into 'master'
Synchronize activator Round 2

See merge request core-developers/forge!2825
2020-05-21 05:14:13 +00:00
Hans Mackowiak
0489a2ba83 Update tireless_tracker fix TrigInvestigate 2020-05-21 00:45:09 +00:00
Michael Kamensky
25109de700 Merge branch 'digMultipleChooseZone' into 'master'
DigMultipleEffect: add extra ChosenZone to select N from the Chosen

See merge request core-developers/forge!2826
2020-05-20 16:35:23 +00:00
Hans Mackowiak
d86aa31ab8 DigMultipleEffect: add extra ChosenZone to select N from the Chosen 2020-05-20 16:35:23 +00:00
Hans Mackowiak
0846017766 build-helper-maven-plugin: update version to 3.1.0 to fix version can neither be null, empty nor blank 2020-05-20 11:43:15 +02:00
rory
a964f5b71b checking for unique mana symbols correctly considers generic mana costs on split cards 2020-05-19 21:58:13 -04:00
rory
d311231c96 move CantPayGenericCosts higher up in mana restrictions so that the activated restriction doesn't short circuit for loop 2020-05-19 21:58:13 -04:00
rory
b2018aafe6 Jegantha, the Wellspring 2020-05-19 21:58:13 -04:00
Northmoc
7ab4d13507 Vintage.txt Lurrus fix 2020-05-19 21:58:13 -04:00
friarsol
7a6409c11c Synchronize activator Round 2 2020-05-19 21:54:47 -04:00
friarsol
25fb9857d8 Synchronize activator Round 2 2020-05-19 21:53:33 -04:00
swordshine
b7b2c88916 Merge branch 'jegantha' into 'master'
Jegantha

See merge request core-developers/forge!2802
2020-05-20 00:49:58 +00:00
swordshine
2b714672a2 Merge branch 'vintagebnr' into 'master'
Vintage.txt Lurrus fix

See merge request core-developers/forge!2824
2020-05-20 00:49:24 +00:00
Northmoc
0ed4670cfb Vintage.txt Lurrus fix 2020-05-19 09:03:25 -04:00
Sol
fa610b4bfd Merge branch 'revert-c793065c' into 'master'
Revert "Merge branch 'synchronize-activator-restriction' into 'master'"

See merge request core-developers/forge!2823
2020-05-19 12:01:48 +00:00
Sol
2af1895e26 Revert "Merge branch 'synchronize-activator-restriction' into 'master'"
This reverts merge request !2821
2020-05-19 11:45:47 +00:00
Michael Kamensky
b919ccb50c Merge branch 'master' into 'master'
Fix a typo in code.

See merge request core-developers/forge!2822
2020-05-19 07:50:26 +00:00
Agetian
87ed2140b4 - Fix a typo in code. 2020-05-19 10:38:06 +03:00
Michael Kamensky
b9d5326c30 Merge branch 'tokenCopyInvestigateRework' into 'master'
Effects: Effects that create Tokens now use common base class

Closes #1379 and #1350

See merge request core-developers/forge!2816
2020-05-19 03:46:43 +00:00
Hans Mackowiak
0af1085f79 Effects: Effects that create Tokens now use common base class 2020-05-19 03:46:43 +00:00
swordshine
c793065cae Merge branch 'synchronize-activator-restriction' into 'master'
Synchronize activator restriction

See merge request core-developers/forge!2821
2020-05-19 01:11:22 +00:00
swordshine
248a2447d2 Merge branch 'may2020bnr' into 'master'
18 May 2020 bans

See merge request core-developers/forge!2820
2020-05-19 01:08:37 +00:00
Tim Mocny
df2932bec5 18 May 2020 bans 2020-05-19 01:08:37 +00:00
friarsol
b7fb854389 Fix Personal Incarnation activator missing owner 2020-05-18 20:42:03 -04:00
Michael Kamensky
7c322e1e33 Merge branch 'quest-menu-update' into 'master'
Quest menu update

See merge request core-developers/forge!2817
2020-05-18 03:29:30 +00:00
Sol
74b3ecd8ce Quest menu update 2020-05-18 03:29:30 +00:00
Michael Kamensky
82060740c6 Merge branch 'fix-get-best-land' into 'master'
Fix FindBestLand ai

Closes #1415

See merge request core-developers/forge!2818
2020-05-18 03:24:22 +00:00
friarsol
45b1b3f38b Convert all Activator Restrictions to a combined key/value 2020-05-17 23:16:52 -04:00
Michael Kamensky
f72526fa08 Merge branch 'fix-capricopian' into 'master'
Fix Capricopian

Closes #1411

See merge request core-developers/forge!2819
2020-05-18 03:13:35 +00:00
friarsol
e96fa0cc96 Fix Capricopian 2020-05-17 21:40:09 -04:00
friarsol
7966684424 Fix FindBestLand ai 2020-05-17 21:12:03 -04:00
Michael Kamensky
56b5a6d3c2 Merge branch 'master' into 'master'
IKO and C20 initial AI hints.

See merge request core-developers/forge!2815
2020-05-17 17:59:06 +00:00
Agetian
0516693eec - IKO and C20 initial AI hints. 2020-05-17 20:49:03 +03:00
Michael Kamensky
8c40ba9ef3 Merge branch '1407-lazav-dimir-mastermind-causes-npe' into 'master'
Resolve ""Lazav, Dimir Mastermind" causes NPE"

Closes #1407

See merge request core-developers/forge!2814
2020-05-16 16:53:31 +00:00
Hans Mackowiak
b12f97daa2 TriggerChangesZone: Trigger on leaving the battlefield look back in time using LKI 2020-05-15 14:15:34 +02:00
rory
815a0f5da9 checking for unique mana symbols correctly considers generic mana costs on split cards 2020-05-14 11:51:40 -07:00
Michael Kamensky
2e319a4c9b Merge branch 'discardLengFix' into 'master'
Fix Discard cost with Library of Leng

See merge request core-developers/forge!2812
2020-05-14 08:26:18 +00:00
Hans Mackowiak
7b151bf78a Fix Discard cost with Library of Leng 2020-05-14 08:26:18 +00:00
Michael Kamensky
f091c0592e Merge branch 'master' into 'master'
Fix AI cheating with ChooseTypeEffect

Closes #1410

See merge request core-developers/forge!2811
2020-05-14 05:31:04 +00:00
Agetian
76ade204bb - Fix AI cheating with ChooseTypeEffect 2020-05-14 08:24:03 +03:00
swordshine
046f2a58d9 Merge branch 'patch-6' into 'master'
Update de-DE.properties

See merge request core-developers/forge!2810
2020-05-14 00:51:04 +00:00
Andreas Bendel
a0e2de0aec Update de-DE.properties
more than 100 new lines tranlated
2020-05-13 22:10:41 +00:00
Michael Kamensky
fffb01a81c Merge branch 'companion-ai' into 'master'
Add "AI" for Companion choosing

Closes #1406

See merge request core-developers/forge!2809
2020-05-13 05:16:08 +00:00
friarsol
022875f07a Add "AI" for Companion choosing 2020-05-12 21:26:41 -04:00
Michael Kamensky
e60daf0536 Merge branch 'brawl' into 'master'
Add IKO to Brawl

See merge request core-developers/forge!2808
2020-05-12 16:58:48 +00:00
Tim Mocny
b17c4a188c Add IKO to Brawl 2020-05-12 16:58:48 +00:00
Michael Kamensky
da32b24fa8 Merge branch 'costPaymentMatrixFix' into 'master'
CostPayment: reset CardMatrix after being used

Closes #1408

See merge request core-developers/forge!2807
2020-05-12 10:19:29 +00:00
Hans Mackowiak
d25825c595 CostPayment: reset CardMatrix after being used 2020-05-12 10:19:29 +00:00
Michael Kamensky
15eca3f80a Merge branch 'tokenPermanentFix' into 'master'
Effects and Emblems are not token, cards on the field without card types are sill permanents

See merge request core-developers/forge!2806
2020-05-12 06:57:53 +00:00
Hans Mackowiak
3f428ee7d4 Effects and Emblems are not token, cards on the field without card types are sill permanents 2020-05-12 06:57:53 +00:00
swordshine
df9b462353 Merge branch 'patch-6' into 'master'
Update de-DE.properties

See merge request core-developers/forge!2803
2020-05-12 06:28:10 +00:00
rory
77c15b1673 move CantPayGenericCosts higher up in mana restrictions so that the activated restriction doesn't short circuit for loop 2020-05-11 16:46:48 -07:00
Sol
c4a1f22584 Merge branch 'newBranch' into 'master'
Fix CardArtCache,LoadingCache Dispose Textures

See merge request core-developers/forge!2805
2020-05-11 15:23:08 +00:00
swordshine
369a366b4f Merge branch 'master' into 'master'
translate some text

See merge request core-developers/forge!2502
2020-05-11 10:57:49 +00:00
Anthony Calosa
bcb626872f Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-05-11 11:13:38 +08:00
Anthony Calosa
deb0d7e2f1 Fix CardArtCache,LoadingCache Dispose Textures 2020-05-11 10:22:13 +08:00
Sol
75ab38836e Update combine_guildmage.txt 2020-05-11 01:48:06 +00:00
Andreas Bendel
68cece62c3 Update de-DE.properties
Typo fixes
2020-05-10 21:34:10 +00:00
rory
51e945df72 Merge branch 'master' into jegantha 2020-05-10 11:39:14 -07:00
rory
4eb21594b4 Jegantha, the Wellspring 2020-05-10 11:34:07 -07:00
Michael Kamensky
6362390e6a Merge branch 'master' into 'master'
Fix NPE in chooseCardName (AI)

Closes #1404

See merge request core-developers/forge!2801
2020-05-10 16:30:20 +00:00
Agetian
e7f0b33dd2 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2020-05-10 19:03:28 +03:00
Agetian
b0300edc9f - Fix NPE in chooseCardName (AI) 2020-05-10 19:03:01 +03:00
Michael Kamensky
d8a5e573da Merge branch 'spellCopyPaidFix' into 'master'
SpellAbility: copy PaidHash when copy spell ability

See merge request core-developers/forge!2800
2020-05-10 15:32:08 +00:00
Hans Mackowiak
bb84b4a4d4 SpellAbility: copy PaidHash when copy spell ability 2020-05-10 16:53:34 +02:00
CCTV-1
b66eb6266d translate Companion choose dialog,update translations,update chinese characters. 2020-05-10 16:40:24 +08:00
CCTV-1
e0b61e7453 Merge remote-tracking branch 'upstream/master' 2020-05-10 16:36:25 +08:00
Michael Kamensky
7018beab62 Merge branch 'patch-6' into 'master'
Update de-DE.properties

See merge request core-developers/forge!2789
2020-05-10 05:28:35 +00:00
swordshine
09fba334d4 Merge branch 'fixes' into 'master'
Fixes

Closes #1396

See merge request core-developers/forge!2799
2020-05-10 03:11:28 +00:00
Tim Mocny
f6d6e45fed Fixes 2020-05-10 03:11:28 +00:00
Michael Kamensky
7d15b021aa Merge branch 'yannik' into 'master'
yannik_scavenging_sentinel.txt fixes

See merge request core-developers/forge!2796
2020-05-09 16:57:45 +00:00
Tim Mocny
83774d57df yannik_scavenging_sentinel.txt fixes 2020-05-09 16:57:45 +00:00
Michael Kamensky
414665166c Merge branch 'historic' into 'master'
Historic updates

See merge request core-developers/forge!2797
2020-05-09 04:07:32 +00:00
Tim Mocny
ab6d856880 Historic updates 2020-05-09 04:07:31 +00:00
Sol
538430009b Merge branch 'patch' into 'master'
Update Companion cards

See merge request core-developers/forge!2793
2020-05-09 01:06:50 +00:00
Sol
1db29e8846 Merge branch 'newBranch' into 'master'
Hotfix Android Crash on New User Installation

See merge request core-developers/forge!2794
2020-05-09 01:00:10 +00:00
Sol
6ad5e73089 Merge branch 'recentsets' into 'master'
Some recent set support

See merge request core-developers/forge!2795
2020-05-09 00:56:07 +00:00
Tim Mocny
e4c0a3e6b3 Some recent set support 2020-05-09 00:56:07 +00:00
Anthony Calosa
311c8138d6 Hotfix Android Crash on New User Installation 2020-05-09 06:36:45 +08:00
swordshine
447453977d Update scripts 2020-05-08 22:52:10 +08:00
swordshine
085c9f0042 Add Umori, the Collector 2020-05-08 21:58:28 +08:00
swordshine
ed4be69c93 Update Gyruda 2020-05-08 21:56:39 +08:00
swordshine
97bcf8f9c7 Update more Companion cards based on Northmoc's scripts 2020-05-08 19:49:37 +08:00
swordshine
2fd4f9c31f Update Companion restriction for Lurrus and Zirda 2020-05-08 15:08:18 +08:00
Michael Kamensky
d9ee072064 Merge branch 'totemDamageFix' into 'master'
DamageDealEffect: fix removeDamage

See merge request core-developers/forge!2792
2020-05-08 05:53:19 +00:00
Hans Mackowiak
d1199e2698 DamageDealEffect: fix removeDamage 2020-05-08 05:53:19 +00:00
swordshine
d5b1799cba Update some scripts 2020-05-08 13:08:34 +08:00
Michael Kamensky
a1d241dd6e Merge branch 'companion' into 'master'
Companion

See merge request core-developers/forge!2714
2020-05-08 03:43:23 +00:00
Michael Kamensky
82d11283f7 Merge branch 'lethalDamagePTFix' into 'master'
LethalDamage: update Property when PT or counter changes

See merge request core-developers/forge!2791
2020-05-08 03:38:44 +00:00
Hans Mackowiak
35dd052c93 LethalDamage: update Property when PT or counter changes 2020-05-08 03:38:44 +00:00
Michael Kamensky
09d2e1fb30 Merge branch 'castSALastZoneFix' into 'master'
CastSA: fix LastZone use LKI copy when put on stack

See merge request core-developers/forge!2790
2020-05-08 03:38:11 +00:00
Hans Mackowiak
cc10e91431 CastSA: fix LastZone use LKI copy when put on stack 2020-05-08 03:38:11 +00:00
friarsol
8ab0857750 Add Companion keyword 2020-05-07 22:54:15 -04:00
Andreas Bendel
21989c31a5 Update de-DE.properties 2020-05-06 20:57:06 +00:00
Michael Kamensky
f651cd42f4 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.34.001 [incremental].

See merge request core-developers/forge!2788
2020-05-06 10:50:47 +00:00
Agetian
b628b8ca00 - Preparing Forge for Android publish 1.6.34.001 [incremental]. 2020-05-06 13:17:07 +03:00
Blacksmith
3534f1ec05 Clear out release files in preparation for next release 2020-05-05 16:12:14 +00:00
Blacksmith
98d80a1328 [maven-release-plugin] prepare for next development iteration 2020-05-05 16:05:39 +00:00
Blacksmith
2d3a538f6d [maven-release-plugin] prepare release forge-1.6.34 2020-05-05 16:05:31 +00:00
Blacksmith
573902f51e Update README.txt for release 2020-05-05 16:01:55 +00:00
Sol
47fd6734ab Merge branch 'inputManaCacheFix' into 'master'
InputPayMana: fix ManaInput Dialog using getAbilityToPlay

See merge request core-developers/forge!2787
2020-05-05 01:57:31 +00:00
Hans Mackowiak
4047dfe727 InputPayMana: fix ManaInput Dialog using getAbilityToPlay 2020-05-05 01:57:31 +00:00
Michael Kamensky
64085463d8 Merge branch 'damageTrample' into 'master'
DealDamage: add ExcessDamage

See merge request core-developers/forge!2784
2020-05-04 14:04:02 +00:00
Hans Mackowiak
18154ca0b7 DealDamage: add ExcessDamage 2020-05-04 14:04:02 +00:00
swordshine
0fcbc62801 Merge branch 'eachplyrcounters' into 'master'
Placing counters fixes

See merge request core-developers/forge!2785
2020-05-04 02:12:04 +00:00
Tim Mocny
84455ba61d Placing counters fixes 2020-05-04 02:12:04 +00:00
Michael Kamensky
7c27efbd64 Merge branch 'newBranch' into 'master'
Update Portrait Layout (Mobile)

See merge request core-developers/forge!2781
2020-05-03 19:27:46 +00:00
Michael Kamensky
6246b16372 Merge branch 'patch-5' into 'master'
Update cazur_ruthless_stalker.txt

See merge request core-developers/forge!2783
2020-05-03 17:50:58 +00:00
Tim Mocny
f497f75c3d Update cazur_ruthless_stalker.txt 2020-05-03 17:13:34 +00:00
Anthony Calosa
4a957c240a Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-05-03 18:35:46 +08:00
Michael Kamensky
7910a37902 Merge branch 'delayedPutCounterFix' into 'master'
cards: some fixes with delayed trigger and putcounter

See merge request core-developers/forge!2782
2020-05-03 10:13:06 +00:00
Hans Mackowiak
3b6160cd88 cards: some fixes with delayed trigger and putcounter 2020-05-03 12:06:08 +02:00
Anthony Calosa
ae545ed169 Update Portrait Layout
Fixes team button visibility and deck button text readability.
2020-05-03 17:55:16 +08:00
Michael Kamensky
4406c7ba72 Merge branch 'evenOdd' into 'master'
add ChooseEvenOdd

See merge request core-developers/forge!2780
2020-05-03 04:55:13 +00:00
Hans Mackowiak
b964cc6448 add ChooseEvenOdd 2020-05-03 04:55:13 +00:00
Michael Kamensky
ca4687f79a Merge branch 'fix' into 'master'
rielle_the_everwise.txt static fix

See merge request core-developers/forge!2779
2020-05-02 16:37:34 +00:00
Tim Mocny
42daf6b5ee rielle_the_everwise.txt static fix 2020-05-02 16:37:34 +00:00
Michael Kamensky
f696a5488c Merge branch 'iko-release' into 'master'
Iko release

See merge request core-developers/forge!2778
2020-05-01 04:36:29 +00:00
Michael Kamensky
853aad6e65 Merge branch 'huntedNightmareAI' into 'master'
Hunted Nightmare and AI fix

See merge request core-developers/forge!2777
2020-05-01 04:26:03 +00:00
Hans Mackowiak
3fe1aa45a2 Hunted Nightmare and AI fix 2020-05-01 04:26:03 +00:00
friarsol
d8ebc3b5f7 Migrate C2020 2020-04-30 21:36:36 -04:00
friarsol
23f35854ba Migrate upcoming IKO cards 2020-04-30 21:32:07 -04:00
friarsol
5cecbe63b1 Update release files 2020-04-30 21:29:50 -04:00
Michael Kamensky
ae6e290a33 Merge branch 'triggerDiscardedAll' into 'master'
TriggerDiscardAll: new trigger for Rielle, the Everwise

See merge request core-developers/forge!2776
2020-04-30 09:50:55 +00:00
Hans Mackowiak
eb0a30f013 TriggerDiscardAll: new trigger for Rielle, the Everwise 2020-04-30 09:50:55 +00:00
Michael Kamensky
be1574b44d Merge branch 'newBranch' into 'master'
Fix Card Display on Network Client

Closes #159

See merge request core-developers/forge!2775
2020-04-30 04:19:56 +00:00
Anthony Calosa
c5aa8cfae7 Fix Card Display on Network Client
Adventure, Flip, Transform, Manifest, Morph etc display properly on Client Side (fix #159)
Also Fix Aura Display

I don't encounter issue #512 anyomre but I leave it open (limited testing)
2020-04-30 06:20:05 +08:00
Michael Kamensky
2e3e3537fb Merge branch '1387-npe-in-triggerdamagedealtonce-getdamagetargets-triggerdamagedealtonce-java-126' into 'master'
Resolve "NPE in TriggerDamageDealtOnce.getDamageTargets(TriggerDamageDealtOnce.java:126)"

Closes #1387

See merge request core-developers/forge!2774
2020-04-29 08:02:31 +00:00
Hans Mackowiak
39378e9776 Trigger: fix NPE if ValidSource or ValidTarget is missing for damage trigger 2020-04-29 08:53:31 +02:00
swordshine
6a73a990db Merge branch 'gzlands' into 'master'
SLD - Godzilla lands

See merge request core-developers/forge!2773
2020-04-29 01:03:12 +00:00
Tim Mocny
be73f20ce0 SLD - Godzilla lands 2020-04-29 01:03:12 +00:00
Michael Kamensky
44e411f925 Merge branch 'fixCastSA' into 'master'
GameAction: hotfix for CastSA

See merge request core-developers/forge!2772
2020-04-28 17:09:35 +00:00
Hans Mackowiak
c7f0def063 GameAction: hotfix for CastSA 2020-04-28 17:09:35 +00:00
CCTV-1
986a273772 update translation 2020-04-28 16:23:28 +08:00
CCTV-1
6a7bfd48bf translate new menu item 2020-04-28 16:23:12 +08:00
Michael Kamensky
4e6addcf84 Merge branch 'damageMultipleAmount' into 'master'
DamageMap: TriggerDamageDealtOnce and TriggerDamageDoneOnce now filter the amount

Closes #1382

See merge request core-developers/forge!2771
2020-04-28 08:22:20 +00:00
CCTV-1
5a3db18220 Merge remote-tracking branch 'upstream/master' 2020-04-28 16:21:04 +08:00
Hans Mackowiak
2df5373902 DamageMap: TriggerDamageDealtOnce and TriggerDamageDoneOnce now filter the amount 2020-04-28 08:09:59 +02:00
Michael Kamensky
3a53ab8a9c Merge branch 'lastStateLandFix' into 'master'
Last state land fix

Closes #1386

See merge request core-developers/forge!2770
2020-04-28 05:24:50 +00:00
Hans Mackowiak
1ea93a6f2e Last state land fix 2020-04-28 05:24:49 +00:00
swordshine
970c3451e9 Merge branch 'bans' into 'master'
April 2020 Bans

See merge request core-developers/forge!2769
2020-04-28 00:38:08 +00:00
Tim Mocny
0960ed98f0 April 2020 Bans 2020-04-28 00:38:08 +00:00
swordshine
4701371b17 Merge branch 'raid' into 'master'
Raid wording change

Closes #1357

See merge request core-developers/forge!2768
2020-04-28 00:37:54 +00:00
Tim Mocny
11c5b00130 Raid wording change 2020-04-28 00:37:54 +00:00
Michael Kamensky
e0f2d09dfd Merge branch 'master' into 'master'
Fix an issue with imprinting not working correctly in game states after the first game.

Closes #1383

See merge request core-developers/forge!2766
2020-04-27 17:23:59 +00:00
Agetian
2d355d4ea3 - Fix an issue with imprinting not working correctly in game states after the first game. 2020-04-27 20:18:35 +03:00
Michael Kamensky
bea46a7a8c Merge branch 'fixes' into 'master'
Fixes - 27 April

See merge request core-developers/forge!2765
2020-04-27 17:13:07 +00:00
Tim Mocny
d13439500f Fixes - 27 April 2020-04-27 17:13:07 +00:00
Michael Kamensky
bd54bbe026 Merge branch 'patch' into 'master'
Add The Ozolith

See merge request core-developers/forge!2764
2020-04-27 15:54:35 +00:00
Michael Kamensky
15f147ac9c Merge branch 'removeSpellAbilityCache' into 'master'
Game: remove SpellAbilityCache

See merge request core-developers/forge!2763
2020-04-27 10:32:17 +00:00
Hans Mackowiak
c2248ef905 Game: remove SpellAbilityCache 2020-04-27 10:32:17 +00:00
swordshine
74c92590fc Add The Ozolith 2020-04-27 16:16:11 +08:00
Michael Kamensky
552a7130a5 Merge branch '1380-selective-adaptation-triggers-excessive-memory-usage' into 'master'
Resolve "'Selective Adaptation' triggers excessive memory usage"

Closes #1380

See merge request core-developers/forge!2762
2020-04-26 15:54:16 +00:00
Hans Mackowiak
8d1c02012e Resolve "'Selective Adaptation' triggers excessive memory usage" 2020-04-26 15:54:15 +00:00
Michael Kamensky
c4963821e5 Merge branch 'raptorBlockedFix' into 'master'
fix Labyrinth Raptor

Closes #1375

See merge request core-developers/forge!2761
2020-04-26 15:15:53 +00:00
Michael Kamensky
8a648c9ccf Merge branch 'newBranch' into 'master'
Update Win/Lose Overlay (mobile)

Closes #1367 and #928

See merge request core-developers/forge!2760
2020-04-26 15:15:48 +00:00
Hans Mackowiak
a2b5bb911c fix Labyrinth Raptor 2020-04-26 16:57:54 +02:00
Anthony Calosa
e7cbee211d Update controls 2020-04-26 18:37:10 +08:00
Anthony Calosa
a553103e39 AI vs AI match shows Match Results (mobile) 2020-04-26 17:25:44 +08:00
Anthony Calosa
45a5e76e63 refactor CardAreaPanel.resetForNewGame
fix issue ##1367
2020-04-26 16:44:32 +08:00
Anthony Calosa
8122589842 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-26 15:26:14 +08:00
Anthony Calosa
d754c2c4d3 Update Win/Lose Overlay (mobile)
At the end of the match, user can minimize the overlay to see the last battlefield and browse other zones, to bring up the overlay, click game menu, and click Show WinLose Overlay.

Also fixes issue #928
2020-04-26 15:00:57 +08:00
swordshine
7e9843aae5 Merge branch 'heliodsp' into 'master'
Heliod's Punishment stack cleanup (ORIGINALHOST stack issue)

See merge request core-developers/forge!2647
2020-04-26 03:46:06 +00:00
Tim Mocny
2897d4304d Heliod's Punishment stack cleanup (ORIGINALHOST stack issue) 2020-04-26 03:46:06 +00:00
swordshine
f5400d18bd Merge branch 'extinctionfix' into 'master'
extinction_event.txt - fix

Closes #1377

See merge request core-developers/forge!2759
2020-04-26 00:48:39 +00:00
Tim Mocny
46983de66f extinction_event.txt - fix 2020-04-26 00:48:39 +00:00
Michael Kamensky
049e129606 Merge branch 'fixXPaidZeroCyclingCastTrigger' into 'master'
fix Cycling for Zero with xPaid, also do Zaxara with xPaid

See merge request core-developers/forge!2758
2020-04-25 19:56:37 +00:00
Hans Mackowiak
b5deb0b252 fix Cycling for Zero with xPaid, also do Zaxara with xPaid 2020-04-25 19:56:37 +00:00
Michael Kamensky
0bb42a2794 Merge branch '1372-used-memory-grows-quadratic-in-the-number-of-triggered-spells' into 'master'
Resolve "Used memory grows quadratic in the number of triggered spells"

Closes #1372

See merge request core-developers/forge!2756
2020-04-25 17:36:50 +00:00
Hans Mackowiak
a9b5e1d112 Resolve "Used memory grows quadratic in the number of triggered spells" 2020-04-25 17:36:50 +00:00
Michael Kamensky
c1c9271458 Merge branch 'master' into 'master'
Add color requirement AI hints to the ELD land cycle that usually comes tapped.

See merge request core-developers/forge!2757
2020-04-25 15:52:43 +00:00
Agetian
44e4dfecca - Add color requirement AI hints to the ELD land cycle that usually comes tapped and has a "comes untapped" effect. 2020-04-25 18:38:36 +03:00
swordshine
d809fa6b91 Merge branch 'mysticsubdual' into 'master'
IKO - mystic_subdual.txt

See merge request core-developers/forge!2754
2020-04-25 04:47:10 +00:00
Tim Mocny
c5a89747b8 IKO - mystic_subdual.txt 2020-04-25 04:47:10 +00:00
Michael Kamensky
36341a85cd Merge branch 'move' into 'master'
Tweaks - 24 April

See merge request core-developers/forge!2753
2020-04-24 14:34:22 +00:00
Tim Mocny
253256799c Tweaks - 24 April 2020-04-24 14:34:22 +00:00
Michael Kamensky
16fa79132b Merge branch 'zaxara' into 'master'
Zaxara (C20)

See merge request core-developers/forge!2735
2020-04-24 14:33:18 +00:00
Tim Mocny
f02ab6c073 Zaxara (C20) 2020-04-24 14:33:18 +00:00
swordshine
ef208f3442 Merge branch 'fixes.4.23' into 'master'
Fixes - 23 April

See merge request core-developers/forge!2752
2020-04-24 00:23:42 +00:00
Northmoc
bdcaf785bd labyrinth_raptor.txt - ChangeNum$ -> Amount$ 2020-04-23 19:14:54 -04:00
Northmoc
318c4891a4 grave_betrayal.txt - RememberObjects$ TriggeredCard 2020-04-23 19:14:54 -04:00
Michael Kamensky
a6fcec519d Merge branch 'master' into 'master'
Added an AI hint for Leyline of Abundance.

See merge request core-developers/forge!2750
2020-04-23 15:33:19 +00:00
Agetian
7f3bc8f7f9 - Added an AI hint for Leyline of Abundance. 2020-04-23 18:09:42 +03:00
Michael Kamensky
f2e7068706 Merge branch 'titansnest' into 'master'
Titans' Nest (IKO)

See merge request core-developers/forge!2708
2020-04-23 15:00:05 +00:00
Tim Mocny
67c0722db8 Titans' Nest (IKO) 2020-04-23 15:00:05 +00:00
Michael Kamensky
60ad4cf0d1 Merge branch 'master' into 'master'
Added a couple AI hints.

See merge request core-developers/forge!2749
2020-04-23 09:43:14 +00:00
Agetian
d76004509d - Added a couple AI hints. 2020-04-23 11:02:51 +03:00
Michael Kamensky
bac8497bc3 Merge branch 'newBranch' into 'master'
Fix uncleared selectables when a player concedes and restarts next game

See merge request core-developers/forge!2748
2020-04-23 06:54:33 +00:00
Anthony Calosa
ac9636c44e Fix uncleared selectables when a player concedes and restarts next game 2020-04-23 14:07:15 +08:00
Michael Kamensky
89b534a580 Merge branch 'master' into 'master'
Add basic AI logic for Capricopian.

See merge request core-developers/forge!2747
2020-04-22 18:16:28 +00:00
Agetian
daa982389e - Add basic logic for Capricopian. 2020-04-22 21:05:37 +03:00
Michael Kamensky
e56ee38933 Merge branch 'capricopian' into 'master'
Capricopian (C20)

See merge request core-developers/forge!2742
2020-04-22 17:12:23 +00:00
Tim Mocny
b12ed3307a Capricopian (C20) 2020-04-22 17:12:23 +00:00
Michael Kamensky
08446a344c Merge branch 'master' into 'master'
Add an attack effect hint for Krenko, Tin Street Kingpin.

See merge request core-developers/forge!2746
2020-04-22 16:42:47 +00:00
Agetian
5ec6589175 - Add an attack effect hint for Krenko, Tin Street Kingpin. 2020-04-22 19:30:28 +03:00
Michael Kamensky
bdff4a12e7 Merge branch 'master' into 'master'
Run the AI trigger code in case the SA is pre-targeted earlier in the code (fixes Nyx Herald) + improve AI Adventure support

See merge request core-developers/forge!2745
2020-04-22 16:25:43 +00:00
Agetian
f610203a53 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2020-04-22 19:19:53 +03:00
Agetian
37b7408163 - Improve support for AI casting Sorcery speed Adventure cards. 2020-04-22 19:16:30 +03:00
Agetian
67684fa4ec - Don't cut short when checking whether to run the AI trigger code if the triggered ability was pre-targeted in earlier checks before doTrigger is called. 2020-04-22 18:43:22 +03:00
Michael Kamensky
5787bf7660 Merge branch 'xyris' into 'master'
Xyris (C20)

See merge request core-developers/forge!2734
2020-04-22 15:13:31 +00:00
Tim Mocny
e621972ad2 Xyris (C20) 2020-04-22 15:13:30 +00:00
Michael Kamensky
84146df00e Merge branch 'manascape' into 'master'
Manascape Refractor (C20)

See merge request core-developers/forge!2737
2020-04-22 14:57:46 +00:00
Northmoc
a27673ef5b manascape_refractor.txt 2020-04-22 10:46:40 -04:00
Michael Kamensky
4c8072afd2 Merge branch 'master' into 'master'
Added several new cubes ported from XMage + two submitted cubes

See merge request core-developers/forge!2744
2020-04-22 08:09:34 +00:00
Agetian
6340f92c95 - Added several new cubes ported from XMage + two cubes submitted on Slightlymagic (by thegreatone1357 and dolphi5). 2020-04-22 11:02:28 +03:00
Michael Kamensky
9349477f21 Merge branch 'newBranch' into 'master'
Improve Online Lobby (Mobile Port)

Closes #659, #658, #172, and #914

See merge request core-developers/forge!2738
2020-04-22 04:24:19 +00:00
Anthony Calosa
96e243e4c9 Refactor stack -> Deque, add check for transformCount 2020-04-22 07:29:49 +08:00
Anthony Calosa
828885c9b0 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-22 05:55:38 +08:00
Michael Kamensky
4694ea8014 Merge branch 'mutual_destruction' into 'master'
Mutual Destruction fix :: AffectedZones -> EffectZone

See merge request core-developers/forge!2743
2020-04-21 18:29:05 +00:00
Tim Mocny
41d0fa9227 Mutual Destruction fix :: AffectedZones -> EffectZone 2020-04-21 18:29:05 +00:00
Michael Kamensky
7e158620f3 Merge branch 'nikara_yannik' into 'master'
Nikara and Yannik (C20)

See merge request core-developers/forge!2736
2020-04-21 18:28:38 +00:00
Tim Mocny
4ffbaf87a0 Nikara and Yannik (C20) 2020-04-21 18:28:37 +00:00
Michael Kamensky
0a32dcffa6 Merge branch 'cleanup' into 'master'
Cleanups - 21 April

See merge request core-developers/forge!2741
2020-04-21 17:06:24 +00:00
Tim Mocny
f20f4dcfe4 Cleanups - 21 April 2020-04-21 17:06:24 +00:00
Michael Kamensky
377e2dc9a6 Merge branch 'patch-2' into 'master'
Update alpine_moon.txt

See merge request core-developers/forge!2740
2020-04-21 16:56:01 +00:00
Michael Kamensky
a25404d029 Merge branch 'whenyoudo' into 'master'
Fixing triggers for "When you do" clause

See merge request core-developers/forge!2739
2020-04-21 16:55:53 +00:00
Tim Mocny
838c4daf25 Fixing triggers for "When you do" clause 2020-04-21 16:55:53 +00:00
Michael Kamensky
ef8533237e Merge branch 'commandertohand' into 'master'
Netherborn Altar (C20) and Command Beacon update

See merge request core-developers/forge!2732
2020-04-21 16:52:30 +00:00
Tim Mocny
30cdf13d88 Netherborn Altar (C20) and Command Beacon update 2020-04-21 16:52:30 +00:00
Michael Kamensky
e739894759 Merge branch 'c20.20' into 'master'
C20 - 20 April

See merge request core-developers/forge!2733
2020-04-21 16:51:18 +00:00
Tim Mocny
dfd07d1d12 C20 - 20 April 2020-04-21 16:51:18 +00:00
Computica
3ae3ec003e Update alpine_moon.txt
"AffectedZones$ All" to "AffectedZone$ All"
2020-04-21 15:55:04 +00:00
Anthony Calosa
f68ac2e43a refactor stack -> deque 2020-04-21 20:31:41 +08:00
Anthony Calosa
8acb143fea Improve Online Lobby (Mobile port) 2020-04-21 17:52:05 +08:00
Anthony Calosa
3cdbf3eb67 Update FControlGameEventHandler
some method don't exist on mobile port and are specifically for desktop so let those routine run for its specific platform
2020-04-21 17:50:25 +08:00
Michael Kamensky
1f7faa773c Merge branch 'gavi' into 'master'
Gavi, Nest Warden

See merge request core-developers/forge!2656
2020-04-20 12:05:33 +00:00
Tim Mocny
f27748eeca Gavi, Nest Warden 2020-04-20 12:05:32 +00:00
Michael Kamensky
789019fff1 Merge branch 'c20.19s' into 'master'
C20 - 19 April (Svaldan)

See merge request core-developers/forge!2727
2020-04-20 07:54:05 +00:00
Tim Mocny
88d768f8b7 C20 - 19 April (Svaldan) 2020-04-20 07:54:04 +00:00
Michael Kamensky
e2f7faa4d7 Merge branch 'drannithfix' into 'master'
Drannith Magistrate - stop command zone casting

See merge request core-developers/forge!2730
2020-04-20 07:49:08 +00:00
Tim Mocny
344792d91c Drannith Magistrate - stop command zone casting 2020-04-20 07:49:08 +00:00
Michael Kamensky
879322d3b0 Merge branch 'c20.19' into 'master'
C20 - 19 April

See merge request core-developers/forge!2728
2020-04-20 07:43:45 +00:00
Tim Mocny
e9a93a0f8d C20 - 19 April 2020-04-20 07:43:45 +00:00
Michael Kamensky
a9482c349e Merge branch 'selective_adaptation' into 'master'
Selective Adaption - Causing lag?

See merge request core-developers/forge!2731
2020-04-20 04:52:44 +00:00
Tim Mocny
2c8bc0b582 Selective Adaption - Causing lag? 2020-04-20 04:52:44 +00:00
Michael Kamensky
62ba27d09f Merge branch 'fireflux_squad' into 'master'
Fireflux Squad (C20)

See merge request core-developers/forge!2723
2020-04-20 04:15:20 +00:00
Tim Mocny
d6efcee188 Fireflux Squad (C20) 2020-04-20 04:15:19 +00:00
Michael Kamensky
4744f11e69 Merge branch 'newBranch' into 'master'
Update KeywordCard, add Flash Icon, try to prevent rotate bug

See merge request core-developers/forge!2715
2020-04-19 16:28:04 +00:00
Michael Kamensky
20549fe0ca Merge branch 'martial_impetus' into 'master'
Martial Impetus and Frontier Warmonger (C20)

See merge request core-developers/forge!2722
2020-04-19 16:07:30 +00:00
Tim Mocny
8c023fbfea Martial Impetus and Frontier Warmonger (C20) 2020-04-19 16:07:29 +00:00
Michael Kamensky
158711f7a9 Merge branch 'c20.17' into 'master'
C20 - 17 April

See merge request core-developers/forge!2721
2020-04-19 16:03:33 +00:00
Tim Mocny
5be2ab9358 C20 - 17 April 2020-04-19 16:03:33 +00:00
Anthony Calosa
99f07c1471 update changes 2020-04-19 21:16:23 +08:00
Michael Kamensky
f7b1a24fdd Merge branch 'c20.18' into 'master'
C20 - 18 April

See merge request core-developers/forge!2724
2020-04-19 05:11:09 +00:00
Tim Mocny
610e0e546a C20 - 18 April 2020-04-19 05:11:09 +00:00
Michael Kamensky
eb02f4acec Merge branch 'cyclingIKO' into 'master'
Cycling: add YouCycledThisTurn, OnlyFirst for Trigger and ValidCause for ReplaceDraw

Closes #1344

See merge request core-developers/forge!2725
2020-04-19 03:24:10 +00:00
Hans Mackowiak
ef95f02fa2 Cycling: add YouCycledThisTurn, OnlyFirst for Trigger and ValidCause for ReplaceDraw 2020-04-19 03:24:10 +00:00
Sol
6b38bc4b7f Merge branch 'update-formats' into 'master'
Update IKO into Format files

See merge request core-developers/forge!2726
2020-04-19 00:39:34 +00:00
friarsol
57e788a69d Update IKO into Format files 2020-04-18 20:29:06 -04:00
Anthony Calosa
e2c28897d1 update additional 2020-04-18 22:13:24 +08:00
Anthony Calosa
34cb7ff9de updated code 2020-04-18 20:57:18 +08:00
Anthony Calosa
07123286aa add reset (on libgdx discord they said before transforming, you need to reset) 2020-04-18 19:39:57 +08:00
Anthony Calosa
017f9f1984 revert previous attempt to fix the rotate bug 2020-04-18 18:11:27 +08:00
Anthony Calosa
06b9143d57 update endtransform 2020-04-18 17:43:13 +08:00
Anthony Calosa
b1e9f4a110 startRotateTransform 2020-04-18 16:14:49 +08:00
Anthony Calosa
d24fa32175 add flash indicator for desktop 2020-04-18 05:57:17 +08:00
Anthony Calosa
1f7dade4f9 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-18 05:56:27 +08:00
Michael Kamensky
58e99ca69b Merge branch 'iko16' into 'master'
IKO edition - Yidaro rarity fix

See merge request core-developers/forge!2720
2020-04-17 15:05:11 +00:00
Tim Mocny
ca43cf8934 IKO edition - Yidaro rarity fix 2020-04-17 15:05:11 +00:00
Michael Kamensky
56d14d25eb Merge branch 'winota' into 'master'
★Winota

See merge request core-developers/forge!2707
2020-04-17 13:08:58 +00:00
Tim Mocny
bf548096f1 ★Winota 2020-04-17 13:08:57 +00:00
Michael Kamensky
e53e9a5bdf Merge branch 'iko14a' into 'master'
Extinction Event

See merge request core-developers/forge!2711
2020-04-17 11:53:34 +00:00
Northmoc
64f1ad9778 extinction_event.txt 2020-04-17 07:43:34 -04:00
Michael Kamensky
c3621cc8e6 Merge branch 'master' into 'master'
Added Ikoria planeswalker achievements by Marek.

See merge request core-developers/forge!2719
2020-04-17 06:32:53 +00:00
Agetian
250f4484ce - Added Ikoria planeswalker achievements by Marek. 2020-04-17 08:11:36 +03:00
Michael Kamensky
4d65ab429d Merge branch 'kathril' into 'master'
Kathril, Aspect Warper

See merge request core-developers/forge!2718
2020-04-17 03:54:54 +00:00
Tim Mocny
2cfb4917b1 Kathril, Aspect Warper 2020-04-17 03:54:54 +00:00
Michael Kamensky
4bcb516abd Merge branch 'ikoc20translation' into 'master'
Add IKO and C20 Card Translations

See merge request core-developers/forge!2717
2020-04-17 03:54:46 +00:00
Anthony Calosa
29c4d6d4d1 limit rotate transform to overlay and child objects 2020-04-17 06:54:14 +08:00
Michael Kamensky
a7b3d18f66 Merge branch 'c20.14' into 'master'
C20 - 14 April

See merge request core-developers/forge!2712
2020-04-16 16:46:01 +00:00
Tim Mocny
32256a398a C20 - 14 April 2020-04-16 16:46:01 +00:00
klaxnek
14e6baf455 Add IKO and C20 Card Translations
Fixed cardnamesTranslations.py to support adding new patched cards.
2020-04-16 18:19:59 +02:00
klaxnek
24e7cc7999 Merge remote-tracking branch 'core-developers/master' 2020-04-16 17:57:58 +02:00
Sol
210a6637bb Merge branch 'iko14b' into 'master'
IKO edition/booster update

See merge request core-developers/forge!2713
2020-04-16 01:13:51 +00:00
Tim Mocny
23688b281b IKO edition/booster update 2020-04-16 01:13:51 +00:00
Anthony Calosa
f968e310f2 allow startRotateTransform for child FdisplayObject 2020-04-16 08:09:22 +08:00
Anthony Calosa
afc55d4b2e Refactor updatePhase 2020-04-16 07:43:03 +08:00
Anthony Calosa
ebd0e12bee Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-15 17:48:41 +08:00
Anthony Calosa
bd6a1f3a2b Update 2020-04-15 16:46:24 +08:00
Michael Kamensky
ca6873d893 Merge branch 'fixTriggerNullAi' into 'master'
WrappedAbility: fix trigger not set for confirmTrigger

See merge request core-developers/forge!2716
2020-04-15 08:13:16 +00:00
Hans Mackowiak
759703bf56 WrappedAbility: fix trigger not set for confirmTrigger 2020-04-15 08:13:16 +00:00
Hans Mackowiak
d52d850c85 Merge branch 'callofdd' into 'master'
★Call of the Death-Dweller

See merge request core-developers/forge!2673
2020-04-15 07:16:28 +00:00
Tim Mocny
475ae289fd ★Call of the Death-Dweller 2020-04-15 07:16:27 +00:00
CCTV-1
ac6b983cb5 update translations 2020-04-15 14:05:21 +08:00
CCTV-1
1f4f7fc7f4 translate mobile online screen 2020-04-15 14:05:05 +08:00
CCTV-1
e85ed216be Merge remote-tracking branch 'upstream/master' 2020-04-15 13:58:10 +08:00
Anthony Calosa
427e34607d Prevent EmptyStackException 2020-04-15 13:43:58 +08:00
Anthony Calosa
2778318b10 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-15 12:49:58 +08:00
Anthony Calosa
102119679c Update Flash Icons
Add a helper icon for cards with flash or can be cast as though it had flash (if show ability icons is enabled)
2020-04-15 12:33:31 +08:00
Anthony Calosa
5467701fa0 Update Keyword Effects
Whenever a keyword is added/removed to the player, it will update the keyword card, and will auto remove it if its empty
2020-04-15 12:29:55 +08:00
Sol
d6dc081e42 Merge branch 'newBranch' into 'master'
Network Improvements

See merge request core-developers/forge!2701
2020-04-15 02:40:18 +00:00
Anthony Calosa
d87d825bce Network Improvements 2020-04-15 02:40:18 +00:00
Anthony Calosa
d4625864df Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-15 07:39:35 +08:00
Michael Kamensky
7ca5eee57e Merge branch 'iko13' into 'master'
IKO - 13 April

See merge request core-developers/forge!2704
2020-04-14 17:25:43 +00:00
Tim Mocny
38d708ce65 IKO - 13 April 2020-04-14 17:25:43 +00:00
Michael Kamensky
c6f1dc6bd1 Merge branch 'imagekeyrobustness' into 'master'
Alternative image lookup to avoid issues with multiple printings in a single...

See merge request core-developers/forge!2705
2020-04-14 06:27:07 +00:00
Michael Kamensky
aeb0bfc971 Merge branch 'counterPutChooser' into 'master'
CounterPutEffect: add Choicer Param

See merge request core-developers/forge!2709
2020-04-14 06:25:53 +00:00
Hans Mackowiak
f1690f2d84 CounterPutEffect: add Choicer Param 2020-04-14 06:25:53 +00:00
Anthony Calosa
e20c79fa4b Update 2020-04-14 10:10:53 +08:00
austinio7116
f6201d178e Alternative image lookup to avoid issues with multiple printings in a single edition - e.g. supporting loading *1.full.jpg if only .full.jpg is present, or loading the standard card if the promo is missing. 2020-04-13 17:47:30 +01:00
Anthony Calosa
17b2a2b023 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-13 22:21:25 +08:00
austinio7116
d17015cc88 Merge branch 'patch-5' into 'master'
Update ImageKeys.java to support .full images first art variant renaming optional

See merge request core-developers/forge!2703
2020-04-13 13:55:17 +00:00
Anthony Calosa
5649ac6d7d Update ImageKeys.java 2020-04-13 12:55:13 +00:00
Anthony Calosa
d1cc547239 Update ImageKeys.java to support .full images first art variant renaming optional 2020-04-13 12:51:23 +00:00
Michael Kamensky
ce1aca2674 Merge branch 'fixMaxTotalTargetCMC' into 'master'
SpellAbility: fix MaxTotalTargetCMC

Closes #1346

See merge request core-developers/forge!2702
2020-04-13 11:57:43 +00:00
Hans Mackowiak
f3729d0059 SpellAbility: fix MaxTotalTargetCMC 2020-04-13 11:57:43 +00:00
Anthony Calosa
d6c5d7f04d Network Improvements 2020-04-13 15:42:56 +08:00
Hans Mackowiak
fdd009908d Merge branch 'mythos2' into 'master'
IKO - Mythos cycle tweaks

See merge request core-developers/forge!2697
2020-04-13 04:42:16 +00:00
Tim Mocny
4be26f575c IKO - Mythos cycle tweaks 2020-04-13 04:42:16 +00:00
Sol
84519d10ea Merge branch 'iko12' into 'master'
IKO - 12 April

See merge request core-developers/forge!2700
2020-04-13 01:26:11 +00:00
Tim Mocny
380a2649d0 IKO - 12 April 2020-04-13 01:26:11 +00:00
Sol
e555c577de Merge branch 'iko11' into 'master'
IKO - 11 April

See merge request core-developers/forge!2694
2020-04-13 01:08:46 +00:00
Tim Mocny
377c0b6a9a IKO - 11 April 2020-04-13 01:08:45 +00:00
Sol
63f0df433f Merge branch 'ikoeditionsupdate' into 'master'
More complete IKO editions file - probably not final, but parsed from scryfall

See merge request core-developers/forge!2696
2020-04-13 00:56:40 +00:00
Sol
1fb56331f9 Merge branch 'typos' into 'master'
More typos

See merge request core-developers/forge!2699
2020-04-13 00:55:34 +00:00
Tim Mocny
5a348f06cd More typos 2020-04-13 00:55:34 +00:00
austinio7116
d869d6b43f Corrected edition type 2020-04-12 18:05:46 +01:00
Michael Kamensky
6e9827719b Merge branch 'spellAbilityXPaid' into 'master'
SpellAbility: do xPaid inside spellAbility

See merge request core-developers/forge!2698
2020-04-12 15:19:04 +00:00
Hans Mackowiak
0d1105377e SpellAbility: do xPaid inside spellAbility 2020-04-12 15:19:04 +00:00
Michael Kamensky
9b9f88129f Merge branch 'iko10' into 'master'
IKO - 10 April

See merge request core-developers/forge!2687
2020-04-12 15:07:02 +00:00
Tim Mocny
d7d59d64b8 IKO - 10 April 2020-04-12 15:07:01 +00:00
austinio7116
015e51d668 More complete IKO editions file - probably not final, but parsed from scryfall 2020-04-12 12:32:21 +01:00
Sol
8f8fca8d80 Merge branch 'tormods' into 'master'
Tormod's Crypt fix

See merge request core-developers/forge!2691
2020-04-11 23:50:49 +00:00
Tim Mocny
81d8c42f29 Tormod's Crypt fix 2020-04-11 23:50:49 +00:00
Sol
630b9d3dd7 Merge branch 'counters' into 'master'
IKO - Counters revisions

See merge request core-developers/forge!2692
2020-04-11 23:50:29 +00:00
Tim Mocny
0db2e0d95b IKO - Counters revisions 2020-04-11 23:50:29 +00:00
Sol
0be5a1180f Merge branch 'newBranch' into 'master'
Fix chooseEntitiesForEffect, Fix Scry Crash (Desktop vs Mobile)

See merge request core-developers/forge!2688
2020-04-11 23:46:50 +00:00
Sol
079ad0223a Merge branch 'typos' into 'master'
Typos

See merge request core-developers/forge!2690
2020-04-11 23:44:54 +00:00
Tim Mocny
bcdc3c849a Typos 2020-04-11 23:44:54 +00:00
Hans Mackowiak
cb7d879abb Merge branch '1358-choosegenericeffect-atrandom-param-update-needed' into 'master'
Resolve "ChooseGenericEffect AtRandom param update needed"

Closes #1358

See merge request core-developers/forge!2693
2020-04-11 20:48:04 +00:00
Hans Mackowiak
a0ea1f1d3f ChooseGenericEffect: when using AtRandom with IsPresent Requirement add check when no choices left 2020-04-11 20:08:18 +02:00
Michael Kamensky
b4cc8421c5 Merge branch 'mythosCycle' into 'master'
IKO: Mythos cycle

See merge request core-developers/forge!2689
2020-04-11 10:21:38 +00:00
Hans Mackowiak
1ac8026b7f IKO: Mythos cycle 2020-04-11 10:21:38 +00:00
Anthony Calosa
f68e3dee71 Fix crash for scry (desktop vs android) match 2020-04-11 17:44:30 +08:00
Anthony Calosa
7abbab5f42 Fix chooseEntitiesForEffect (Cards like Once Upon a Time, etc.. using this will work on network) 2020-04-11 15:06:00 +08:00
Michael Kamensky
9033bbd410 Merge branch 'oracle' into 'master'
Oracle changes - April 10

See merge request core-developers/forge!2685
2020-04-11 04:43:01 +00:00
Tim Mocny
8d96dd99fa Oracle changes - April 10 2020-04-11 04:43:00 +00:00
Michael Kamensky
e327c74976 Merge branch 'otters' into 'master'
205.3 subtype lists - Lukka and Otter

See merge request core-developers/forge!2686
2020-04-11 04:42:45 +00:00
Tim Mocny
4319111c55 205.3 subtype lists - Lukka and Otter 2020-04-11 04:42:45 +00:00
Michael Kamensky
efaac25920 Merge branch 'c20.9' into 'master'
C20 - 9 April

See merge request core-developers/forge!2683
2020-04-11 04:40:39 +00:00
Tim Mocny
82ffc4e9d5 C20 - 9 April 2020-04-11 04:40:38 +00:00
Michael Kamensky
bda8c00e13 Merge branch 'iko9' into 'master'
IKO - 9 April

See merge request core-developers/forge!2682
2020-04-11 04:40:17 +00:00
Tim Mocny
e21d2408bb IKO - 9 April 2020-04-11 04:40:17 +00:00
Michael Kamensky
aede20c610 Merge branch 'mirrodin' into 'master'
Mirrodin Besieged corrections

See merge request core-developers/forge!2684
2020-04-10 10:11:37 +00:00
Tim Mocny
205f3462b1 Mirrodin Besieged corrections 2020-04-10 10:11:37 +00:00
Michael Kamensky
742cfea656 Merge branch 'agitatorant' into 'master'
agitator_ant.txt

See merge request core-developers/forge!2679
2020-04-09 05:13:38 +00:00
Tim Mocny
7af1f7a452 agitator_ant.txt 2020-04-09 05:13:38 +00:00
Michael Kamensky
e649db6775 Merge branch 'iko8' into 'master'
IKO - 8 April

See merge request core-developers/forge!2680
2020-04-09 05:06:48 +00:00
Tim Mocny
461b72376f IKO - 8 April 2020-04-09 05:06:47 +00:00
Michael Kamensky
9b03426f0e Merge branch 'cache' into 'master'
Mana Cache!

Closes #81

See merge request core-developers/forge!2639
2020-04-09 05:06:11 +00:00
Tim Mocny
e1b14ecb51 Mana Cache! 2020-04-09 05:06:11 +00:00
Michael Kamensky
972327bd72 Merge branch 'iko7' into 'master'
IKO - 7 April

See merge request core-developers/forge!2676
2020-04-09 05:04:35 +00:00
Tim Mocny
db25466646 IKO - 7 April 2020-04-09 05:04:35 +00:00
Michael Kamensky
68ad5ad9c0 Merge branch 'typo' into 'master'
Random typo

See merge request core-developers/forge!2678
2020-04-09 05:04:12 +00:00
Tim Mocny
053fc12b35 Random typo 2020-04-09 05:04:12 +00:00
Michael Kamensky
5ec5cb5f7f Merge branch 'newBranch' into 'master'
fix desktop generated name

See merge request core-developers/forge!2681
2020-04-09 05:03:59 +00:00
Anthony Calosa
ccf2abc391 fix desktop generated name 2020-04-09 08:46:37 +08:00
CCTV-1
d2e5eb133b Merge remote-tracking branch 'upstream/master' 2020-04-08 08:47:11 +08:00
Michael Kamensky
5ba4ebbe38 Merge branch 'sld' into 'master'
SLD cards 59-62

Closes #1342

See merge request core-developers/forge!2677
2020-04-07 17:06:24 +00:00
Tim Mocny
5c1702c25b SLD cards 59-62 2020-04-07 17:06:24 +00:00
Michael Kamensky
65da3d55a2 Merge branch 'newBranch' into 'master'
Update Disconnect button view

See merge request core-developers/forge!2675
2020-04-07 17:06:18 +00:00
Anthony Calosa
3e1fe53b77 Update Disconnect button view 2020-04-07 19:00:53 +08:00
Michael Kamensky
0b9a9fc2a9 Merge branch 'iko6' into 'master'
IKO - 6 April

See merge request core-developers/forge!2671
2020-04-07 04:21:17 +00:00
Tim Mocny
86ff6b402a IKO - 6 April 2020-04-07 04:21:17 +00:00
Michael Kamensky
c43b14f850 Merge branch 'newBranch' into 'master'
Fix 180 rotation bug on Mobile

See merge request core-developers/forge!2670
2020-04-07 04:18:59 +00:00
Anthony Calosa
45b1e825e1 Fix 180 rotation bug on Mobile
(to repro, create local game human vs human, 2nd player will be rotated as usual, concede and
create a network game again, human vs human, or human vs AI)
2020-04-06 21:32:05 +08:00
CCTV-1
fa96bd5b5d fix grammar errors 2020-04-06 18:30:54 +08:00
CCTV-1
6c671eaf9d update translations 2020-04-06 18:24:03 +08:00
CCTV-1
190be3f7ea translate new option 2020-04-06 18:23:37 +08:00
CCTV-1
7642d588a4 Merge remote-tracking branch 'upstream/master' 2020-04-06 18:12:05 +08:00
Hans Mackowiak
a43b2a859b Merge branch 'revert-88736fb3' into 'master'
Keyword counter MK2

See merge request core-developers/forge!2669
2020-04-06 05:27:39 +00:00
Hans Mackowiak
5c79cb7de6 Revert "Merge branch 'revert-93f1bb70' into 'master'"
This reverts merge request !2668
2020-04-06 05:27:39 +00:00
Sol
b80d499a36 Merge branch 'startDuelSound' into 'master'
Start duel sound + correction in Unstable edition file (3 missing tokens)

See merge request core-developers/forge!2666
2020-04-06 02:48:25 +00:00
BlueWizard
0b5c70b4bd Start duel sound + correction in Unstable edition file (3 missing tokens) 2020-04-06 02:48:25 +00:00
Sol
cb4a4d81ae Merge branch 'iko5' into 'master'
IKO - 5 April

See merge request core-developers/forge!2664
2020-04-06 02:48:01 +00:00
Tim Mocny
349640a3a0 IKO - 5 April 2020-04-06 02:48:01 +00:00
Sol
c88399d7a0 Merge branch 'newBranch' into 'master'
Add network options, and some fixes during netplay,

See merge request core-developers/forge!2663
2020-04-06 02:45:15 +00:00
Anthony Calosa
aa86f8eae3 Forge constant for close command message 2020-04-06 09:21:10 +08:00
Anthony Calosa
b6408100e5 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-06 08:25:35 +08:00
Sol
88736fb3a7 Merge branch 'revert-93f1bb70' into 'master'
Revert "Merge branch 'keywordCounter' into 'master'"

See merge request core-developers/forge!2668
2020-04-06 00:11:34 +00:00
Sol
8523288884 Revert "Merge branch 'keywordCounter' into 'master'"
This reverts merge request !2667
2020-04-05 23:56:37 +00:00
Anthony Calosa
3d46a6e809 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-06 06:15:52 +08:00
Anthony Calosa
c82ed43c69 Update description 2020-04-06 05:18:53 +08:00
Anthony Calosa
9edaa9561e Add Disconnect for Mobile 2020-04-06 05:02:25 +08:00
Michael Kamensky
93f1bb70b4 Merge branch 'keywordCounter' into 'master'
Keyword counter

Closes #1338

See merge request core-developers/forge!2667
2020-04-05 20:13:43 +00:00
Hans Mackowiak
3bb42a95c9 CounterPutEffect: add Choices with inbuilt ChosenCard Effect 2020-04-05 21:57:32 +02:00
Hans Mackowiak
6ce62b7316 Keyword Counter: special counters add keywords to cards 2020-04-05 17:29:21 +02:00
Michael Kamensky
e40388c244 Merge branch 'C2020-3' into 'master'
C20 - Jirina & Kalamax

See merge request core-developers/forge!2659
2020-04-05 09:03:18 +00:00
Tim Mocny
8eab842416 C20 - Jirina & Kalamax 2020-04-05 09:03:18 +00:00
Michael Kamensky
4febc835e3 Merge branch 'grammar' into 'master'
Little grammar fix

See merge request core-developers/forge!2660
2020-04-05 09:02:27 +00:00
Tim Mocny
56dbb45d63 Little grammar fix 2020-04-05 09:02:26 +00:00
Michael Kamensky
3b50a9ef8b Merge branch 'iko4' into 'master'
IKO - 4 April

See merge request core-developers/forge!2661
2020-04-05 09:02:24 +00:00
Tim Mocny
ba3e8de481 IKO - 4 April 2020-04-05 09:02:24 +00:00
Anthony Calosa
a18f142add Update SettingsPage Desktop 2020-04-05 12:34:56 +08:00
Anthony Calosa
c2e4888711 Merge remote-tracking branch 'origin/newBranch' into newBranch 2020-04-05 11:43:49 +08:00
Anthony Calosa
b466ff38a3 Update SettingsPage 2020-04-05 11:41:21 +08:00
Anthony Calosa
96ce695aae Remove unnecessary lines 2020-04-05 01:15:09 +00:00
Anthony Calosa
52307c02d0 Add option to turn on Experimental Network Compatibility
the user can try to turn on this option to test compatibility, defaults to OFF
2020-04-05 07:14:03 +08:00
Anthony Calosa
c714187eee Refactor Object Decoder/Encoder
Prevent crash on netplay
2020-04-05 07:07:30 +08:00
Anthony Calosa
9f1b93373d Refactor check permission without supportv4 dependency 2020-04-05 07:02:13 +08:00
Michael Kamensky
eeacdf6c80 Merge branch 'fixCyclingZero' into 'master'
GameActionUtil: fix CyclingForZero

Closes #1341

See merge request core-developers/forge!2662
2020-04-04 14:17:47 +00:00
Hans Mackowiak
bf60039ee7 GameActionUtil: fix CyclingForZero 2020-04-04 14:17:47 +00:00
CCTV-1
78b2972943 Merge remote-tracking branch 'upstream/master' 2020-04-04 19:48:28 +08:00
Michael Kamensky
3eb322222a Merge branch 'lukka' into 'master'
lukka_coppercoat_outcast.txt

Closes #1340

See merge request core-developers/forge!2655
2020-04-04 11:00:41 +00:00
Tim Mocny
ef95d3eab9 lukka_coppercoat_outcast.txt 2020-04-04 11:00:41 +00:00
Michael Kamensky
829e49a2ba Merge branch 'patch-9' into 'master'
Mobile: Remove duplicated Enable Unknown Cards in SettingsPage.java

See merge request core-developers/forge!2657
2020-04-04 10:59:54 +00:00
Michael Kamensky
0a768211b9 Merge branch 'MTGA_Cube' into 'master'
support mtga cube

See merge request core-developers/forge!2658
2020-04-04 10:59:23 +00:00
CCTV-1
d0bdeec832 support mtga cube 2020-04-04 18:03:12 +08:00
klaxnek
9047168a3f Remove duplicated Enable Unknown Cards in SettingsPage.java 2020-04-04 09:14:47 +00:00
CCTV-1
9a2f2368e9 Merge remote-tracking branch 'upstream/master' 2020-04-04 16:47:07 +08:00
Michael Kamensky
5cf56e12c3 Merge branch 'iko2' into 'master'
Ikoria round 1

See merge request core-developers/forge!2654
2020-04-04 03:52:01 +00:00
Tim Mocny
a67deeda15 Ikoria round 1 2020-04-04 03:52:00 +00:00
Michael Kamensky
0b2a1ce44a Merge branch 'zilortha' into 'master'
Zilortha, Strength Incarnate

Closes #1337

See merge request core-developers/forge!2653
2020-04-04 03:51:32 +00:00
Tim Mocny
5ab7bcaf3f Zilortha, Strength Incarnate 2020-04-04 03:51:32 +00:00
Michael Kamensky
18bd6ec204 Merge branch 'newBranch' into 'master'
Add simple instructions for permission and Netty update

See merge request core-developers/forge!2652
2020-04-04 03:51:01 +00:00
Anthony Calosa
da984227b1 Use Netty Default Object Decoder/Encoder 2020-04-03 21:35:05 +08:00
Anthony Calosa
bd5cc06504 remove unused imports 2020-04-03 19:02:48 +08:00
Anthony Calosa
8f99034a02 Fix crash 2020-04-03 19:01:03 +08:00
Anthony Calosa
d66700cbf3 Preference for Desktop 2020-04-03 18:47:33 +08:00
Anthony Calosa
bb62c0bebb Preference 2020-04-03 18:00:44 +08:00
Anthony Calosa
13652e30ac Add Elsa Serializer Option (Off by default) 2020-04-03 18:00:10 +08:00
Anthony Calosa
b7d93783c0 Update Netty to 4.1.48.Final 2020-04-03 17:56:57 +08:00
Anthony Calosa
5ba9f5f58f Move Option 2020-04-03 16:36:13 +08:00
Anthony Calosa
fa93702bc8 fix android - pc network (disables elsa atm, needs investigation since this work before) 2020-04-03 12:53:43 +08:00
Anthony Calosa
c9c4d5492d Use statelist and onclick listener so the buttons don't bug out 2020-04-03 10:58:03 +08:00
Anthony Calosa
bcec151b1d button color pressed state 2020-04-03 09:43:25 +08:00
Anthony Calosa
4039c28140 Remade the instructions (much better way) 2020-04-03 09:04:55 +08:00
Anthony Calosa
a5ad3ad60a Add faster way to access storage permission (app details) 2020-04-03 00:50:23 +08:00
CCTV-1
d3e83b2601 translate new option 2020-04-02 21:35:12 +08:00
CCTV-1
0aee987536 Merge remote-tracking branch 'upstream/master' 2020-04-02 21:32:41 +08:00
Michael Kamensky
495257882b Merge branch 'newBranch' into 'master'
Update LibGDX March 29, 2020, Use Google cache

See merge request core-developers/forge!2649
2020-04-02 13:17:58 +00:00
Anthony Calosa
58f6463a5d Add reminder text on Storage Permission
The app displays message when it doesn't start properly because of Storage Permission
2020-04-02 18:20:01 +08:00
Michael Kamensky
65b7f2f4a3 Merge branch 'master' into 'master'
Added puzzles PS_THB8 and PS_THB9 - Possibility Storm - Theros Beyond Death 08 and 09.

See merge request core-developers/forge!2651
2020-04-02 09:30:49 +00:00
Agetian
ed67aafe2e - Added puzzles PS_THB8 and PS_THB9. 2020-04-02 12:25:29 +03:00
Anthony Calosa
71cc16953c Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-04-02 12:24:28 +08:00
Anthony Calosa
9a1e467bb7 Update LibGDX March 29, 2020, Use Google cache
(reverted the cache so there's room for dependency like android-support-v4, permissions in the future,
lighter than cache2k)
2020-04-02 12:15:01 +08:00
Michael Kamensky
a4d9e1ef84 Merge branch 'silverbl' into 'master'
Silverblade Paladin detail cleanup

See merge request core-developers/forge!2648
2020-03-31 17:15:35 +00:00
Tim Mocny
41dbc468bd Silverblade Paladin detail cleanup 2020-03-31 17:15:35 +00:00
Michael Kamensky
8a9984f7df Merge branch 'newBranch' into 'master'
Fix Plane and Phenomenon not triggering when the player PlaneswalkTo/Encounter to it...

See merge request core-developers/forge!2646
2020-03-31 15:47:56 +00:00
Anthony Calosa
eca7ea2fbe Fix Skybreen 2020-03-31 23:41:20 +08:00
Anthony Calosa
05e160cebe Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-31 23:15:33 +08:00
Anthony Calosa
447c3dff5a Fix Plane and Phenomenon not triggering when the player PlaneswalkTo/Encounter to it... 2020-03-31 23:12:22 +08:00
Michael Kamensky
2dd97028b1 Merge branch 'tawnos' into 'master'
Tawnos's Coffin!

Closes #114

See merge request core-developers/forge!2637
2020-03-31 13:11:46 +00:00
Tim Mocny
24db729e96 Tawnos's Coffin! 2020-03-31 13:11:46 +00:00
Michael Kamensky
c10c9f441f Merge branch 'newBranch' into 'master'
Fix stack description

See merge request core-developers/forge!2645
2020-03-31 07:51:33 +00:00
Anthony Calosa
6bf72e6828 space 2020-03-31 14:49:24 +08:00
Anthony Calosa
bf7b446586 period 2020-03-31 14:46:42 +08:00
Anthony Calosa
ec463b414f Refactor description 2020-03-31 14:44:37 +08:00
Anthony Calosa
faf8c57907 Fix stack description
Fix "null damage" & "null counter" stack description, and Volcano Hellion crash
2020-03-31 13:36:45 +08:00
Michael Kamensky
7b90b6a801 Merge branch 'faerieart' into 'master'
Faerie Artisans - trigger tidying

See merge request core-developers/forge!2642
2020-03-31 05:03:55 +00:00
Tim Mocny
cd8410e87a Faerie Artisans - trigger tidying 2020-03-31 05:03:55 +00:00
Michael Kamensky
7dbf6519a0 Merge branch 'nissapilgfix' into 'master'
Nissa's Pilgrimage fix

See merge request core-developers/forge!2641
2020-03-31 05:03:35 +00:00
Tim Mocny
9811eedfc5 Nissa's Pilgrimage fix 2020-03-31 05:03:34 +00:00
Michael Kamensky
e337107575 Merge branch 'narcomofix' into 'master'
narcomoeba.txt fix

See merge request core-developers/forge!2640
2020-03-31 05:02:47 +00:00
Tim Mocny
70b7af6f16 narcomoeba.txt fix 2020-03-31 05:02:47 +00:00
Michael Kamensky
17584a03f1 Merge branch 'newBranch' into 'master'
Add preference to enable/disable loading of Unknown Cards.

See merge request core-developers/forge!2644
2020-03-31 05:01:51 +00:00
Michael Kamensky
2472db72ca Merge branch 'fix-multiplayer-crash' into 'master'
A player who lost cannot initiate combat

Closes #1255

See merge request core-developers/forge!2643
2020-03-31 05:01:24 +00:00
Anthony Calosa
e57e87d3c2 Fix double "- - " on stack description 2020-03-31 12:01:57 +08:00
Anthony Calosa
7c9849f845 Add preference to enable/disable loading of Unknown Cards.
If a user don't wants to load a certain cards from deleted set/s in edition folder,
you can do so by disabling this option.
2020-03-31 10:54:27 +08:00
friarsol
1c61030aae A player who lost cannot initiate combat 2020-03-30 21:40:46 -04:00
Sol
bd8b136b2b Merge branch 'pyramids' into 'master'
Pyramids!

Closes #95

See merge request core-developers/forge!2635
2020-03-29 02:39:47 +00:00
Tim Mocny
4bb0bcfa90 Pyramids! 2020-03-29 02:39:46 +00:00
Sol
084a9812a7 Merge branch 'draftable' into 'master'
More CN2 "draft matters" draftable

See merge request core-developers/forge!2632
2020-03-29 02:38:49 +00:00
Tim Mocny
65947bee28 More CN2 "draft matters" draftable 2020-03-29 02:38:48 +00:00
Sol
10acab8bb9 Merge branch 'naturalunity' into 'master'
Natural Unity fix

See merge request core-developers/forge!2634
2020-03-29 02:38:16 +00:00
Tim Mocny
eb03c01cb0 Natural Unity fix 2020-03-29 02:38:16 +00:00
Sol
9f8f7f132a Merge branch 'perimeter' into 'master'
Hold the Perimeter!

Closes #67

See merge request core-developers/forge!2631
2020-03-29 02:37:37 +00:00
Tim Mocny
62aec9956e Hold the Perimeter! 2020-03-29 02:37:36 +00:00
Michael Kamensky
9376ba3429 Merge branch 'mb1tweak' into 'master'
MB1 printsheets tweak

See merge request core-developers/forge!2630
2020-03-27 09:34:28 +00:00
Tim Mocny
7f8ddb0cab MB1 printsheets tweak 2020-03-27 09:34:28 +00:00
Michael Kamensky
dd3c93287e Merge branch 'latestbling' into 'master'
Editions files for SLU and SS3

See merge request core-developers/forge!2624
2020-03-26 04:19:05 +00:00
Tim Mocny
6da9d86b1b Editions files for SLU and SS3 2020-03-26 04:19:04 +00:00
Michael Kamensky
ad4d429aff Merge branch 'typo' into 'master'
SLD edition typo - rogue comma

See merge request core-developers/forge!2629
2020-03-26 04:18:26 +00:00
Tim Mocny
051e607724 SLD edition typo - rogue comma 2020-03-26 04:18:25 +00:00
Michael Kamensky
cc1f5abe28 Merge branch 'master' into 'master'
- Preparing Forge for Android publish v1.6.33.001 [incremental]

See merge request core-developers/forge!2628
2020-03-22 08:09:47 +00:00
Agetian
27a6f9c3a4 - Preparing Forge for Android publish v1.6.33.001 [incremental] 2020-03-22 11:02:04 +03:00
Michael Kamensky
37eeec088d Merge branch 'emershep' into 'master'
Tidying BFZ rare Landfall creature cycle

See merge request core-developers/forge!2627
2020-03-22 04:06:20 +00:00
Tim Mocny
1c3e8c32b9 Tidying BFZ rare Landfall creature cycle 2020-03-22 04:06:19 +00:00
Sol
ee1b8d1c9a Merge branch 'historic' into 'master'
MTGA Historic Format

See merge request core-developers/forge!2622
2020-03-20 19:11:59 +00:00
Tim Mocny
7fb34b4887 MTGA Historic Format 2020-03-20 19:11:59 +00:00
Michael Kamensky
b65b0e4758 Merge branch 'fix-edition-tracking' into 'master'
Update EditionTracking for new Edition file things

See merge request core-developers/forge!2626
2020-03-20 11:13:36 +00:00
friarsol
4e8e77924a Update EditionTracking for new Edition file things 2020-03-19 23:24:48 -04:00
CCTV-1
3e7f8c8916 update translation 2020-03-20 11:13:50 +08:00
CCTV-1
5005cf9102 Merge remote-tracking branch 'upstream/master' 2020-03-20 11:07:17 +08:00
Blacksmith
dafd2e6a2a Clear out release files in preparation for next release 2020-03-20 00:42:01 +00:00
Blacksmith
4cfcbaf603 [maven-release-plugin] prepare for next development iteration 2020-03-20 00:35:58 +00:00
Blacksmith
22dc1a27a0 [maven-release-plugin] prepare release forge-1.6.33 2020-03-20 00:35:52 +00:00
Blacksmith
c374e0ae81 Update README.txt for release 2020-03-20 00:32:15 +00:00
Michael Kamensky
fc1b3547b2 Merge branch 'patch-5' into 'master'
Update DebuffEffect: fix if it doesn't use target

Closes #1325

See merge request core-developers/forge!2625
2020-03-19 06:38:22 +00:00
Hans Mackowiak
b0d3fbe783 Update DebuffEffect: fix if it doesn't use target 2020-03-19 06:38:22 +00:00
Michael Kamensky
3a02a10258 Merge branch 'voteKeywords' into 'master'
Vote: replace hidden keywords with timestamped properties

Closes #57, #1318, and #1258

See merge request core-developers/forge!2510
2020-03-19 06:22:44 +00:00
Hans Mackowiak
33d83dc0c5 Vote: replace hidden keywords with timestamped properties 2020-03-19 06:22:44 +00:00
Sol
d35a2cdead Merge branch 'peltcol' into 'master'
Pelt Collector fixup

See merge request core-developers/forge!2623
2020-03-17 12:40:38 +00:00
Tim Mocny
507c88269b Pelt Collector fixup 2020-03-17 12:40:37 +00:00
Michael Kamensky
2c7dfc0c41 Merge branch 'glyphre' into 'master'
Glyph of Reincarnation fixup

See merge request core-developers/forge!2621
2020-03-16 20:00:15 +00:00
Tim Mocny
a8ab95f321 - closer to "from the graveyard of the player who controlled that creature the last time it became blocked by that Wall" 2020-03-16 20:00:14 +00:00
Michael Kamensky
672cff54ef Merge branch 'krovam2' into 'master'
Krovikan Vampire - a bit more Cleanup

See merge request core-developers/forge!2620
2020-03-16 19:59:34 +00:00
Tim Mocny
44cbd9af3e Krovikan Vampire - a bit more Cleanup 2020-03-16 19:59:34 +00:00
Michael Kamensky
d3bcfea727 Merge branch 'krovam' into 'master'
Krovikan Vampire!

Closes #75

See merge request core-developers/forge!2619
2020-03-15 16:19:09 +00:00
Tim Mocny
20fa72d24e Krovikan Vampire! 2020-03-15 16:19:09 +00:00
Michael Kamensky
10faa20490 Merge branch 'newBranch' into 'master'
Stack display adjustment

See merge request core-developers/forge!2612
2020-03-15 06:06:38 +00:00
Sol
62c9d187eb Merge branch 'respectbanlist' into 'master'
Respect ban list in archetype deck generation and updated deckgen data

See merge request core-developers/forge!2618
2020-03-15 01:12:03 +00:00
austinio7116
a5148e8983 Added draft rankings 2020-03-14 21:19:19 +00:00
maustin
0bb7a84e55 Merge branch 'coremaster' into respectbanlist 2020-03-14 21:18:16 +00:00
Michael Kamensky
1218786b3e Merge branch 'master' into 'master'
A basic AI logic hook for Timmerian Fiends

See merge request core-developers/forge!2617
2020-03-14 16:45:51 +00:00
Agetian
62a1ee6d3d - A basic AI logic hook for Timmerian Fiends 2020-03-14 19:23:37 +03:00
Michael Kamensky
64f17b49fe Merge branch 'timmerian' into 'master'
Timmerian Fiends!

Closes #116

See merge request core-developers/forge!2610
2020-03-14 15:48:57 +00:00
Tim Mocny
0d939da60d Timmerian Fiends! 2020-03-14 15:48:56 +00:00
Michael Kamensky
cc321b1b2e Merge branch 'fixes' into 'master'
Fixes

Closes #1291, #1317, and #1322

See merge request core-developers/forge!2615
2020-03-14 15:42:36 +00:00
Michael Kamensky
71bf43b63a Merge branch 'glyphre' into 'master'
Glyph of Reincarnation!

Closes #64

See merge request core-developers/forge!2616
2020-03-14 15:41:43 +00:00
Tim Mocny
2d7840aa7d Glyph of Reincarnation! 2020-03-14 15:41:43 +00:00
Anthony Calosa
a1be9d0278 Fix Inventory View for Cards without Card Image 2020-03-14 13:34:31 +08:00
CCTV-1
1a99afa99e deduplication 2020-03-14 12:27:58 +08:00
CCTV-1
27eda6f9b2 Merge remote-tracking branch 'upstream/master' 2020-03-14 12:18:50 +08:00
Anthony Calosa
8a18f815b4 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-14 10:42:07 +08:00
Sol
2b529a07c2 Merge branch '1323-numberformatexception-for-input-string-2secondary-true' into 'master'
Resolve "NumberFormatException: For input string: "2Secondary$ True""

Closes #1323

See merge request core-developers/forge!2613
2020-03-14 00:55:55 +00:00
Jamin W. Collins
c0349d87fb implement and use new PredicateCard
This fixes the THB and ELD draft, possibly others

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-13 18:45:36 -06:00
Jamin W. Collins
c488ab4772 increase maximal heap size to 4096m
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-13 18:43:06 -06:00
Jamin W. Collins
d83f8deb7a remove vestigial scripts
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-13 18:43:06 -06:00
Jamin W. Collins
f1f480d16a explicitly set the encoding to UTF-8
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-13 18:43:06 -06:00
Hans Mackowiak
a1ffa625e1 CardFactoryUtil: fix Saga 2020-03-13 20:34:34 +00:00
Anthony Calosa
d7e38f7fd8 Format Stack Text
(Should be cleaner)
2020-03-14 03:05:29 +08:00
Anthony Calosa
a5683d4f12 Adjust Card Name & Ability Icons Ordering 2020-03-14 03:02:15 +08:00
Sol
cb1d4b7904 Merge branch 'updatertranslation' into 'master'
Auto Updater: Add missing translation strings

See merge request core-developers/forge!2598
2020-03-13 15:50:09 +00:00
Michael Kamensky
c6def2cc5b Merge branch 'Hanmac-Saga-Trigger' into 'master'
Sage Trigger Combined

See merge request core-developers/forge!2609
2020-03-13 15:11:05 +00:00
Hans Mackowiak
81dc9fecba Sage Trigger Combined 2020-03-13 15:11:05 +00:00
Sol
4629817268 Merge branch '12Mar20' into 'master'
the_triumph_of_anax.txt typo

See merge request core-developers/forge!2607
2020-03-12 22:11:37 +00:00
Tim Mocny
b6bbe3d18b the_triumph_of_anax.txt typo 2020-03-12 22:11:37 +00:00
Hans Mackowiak
b437db8ffa Merge branch 'tinyleadersPWcomm' into 'master'
Make Planeswalkers possible for Tiny Leaders

Closes #1311

See merge request core-developers/forge!2606
2020-03-12 16:00:04 +00:00
Tim Mocny
3be58fee75 Make Planeswalkers poss commander for Tiny Leaders, cleanup Brawl commander syntax
Legendary Planeswalkers only

Clean up Commander syntax for TL and Brawl
2020-03-12 16:00:03 +00:00
Michael Kamensky
fe09671795 Merge branch 'etbCounterManaPaid' into 'master'
ManaPart: use Effect for enter the battlefield when mana was spent

See merge request core-developers/forge!2604
2020-03-12 13:34:27 +00:00
Hans Mackowiak
9f35da4698 ManaPart: use Effect for enter the battlefield when mana was spent 2020-03-12 13:34:27 +00:00
Michael Kamensky
3c5a62056b Merge branch 'edfix9mar' into 'master'
Various fixes

See merge request core-developers/forge!2599
2020-03-12 05:40:05 +00:00
Tim Mocny
43a38e3c6d Various fixes 2020-03-12 05:40:05 +00:00
Michael Kamensky
f5a89afa93 Merge branch 'newBranch' into 'master'
remade border to have thin line edges

See merge request core-developers/forge!2603
2020-03-12 05:38:32 +00:00
Anthony Calosa
7a49dd28e1 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-12 12:16:20 +08:00
Sol
d14f20bc43 Merge branch 'collector_number' into 'master'
handle more complex imageKey parsing

See merge request core-developers/forge!2602
2020-03-12 02:56:33 +00:00
Anthony Calosa
14a40e493f Try first variant art for .fullborder images
(ie WAR variant has alternate art)
2020-03-12 08:54:08 +08:00
Anthony Calosa
9b8e63501a Reduce whiteborder sides 2020-03-11 22:21:48 +08:00
Anthony Calosa
61097e9f80 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-11 22:13:42 +08:00
Sol
404ce34076 Merge branch 'mar9banres' into 'master'
Brawl, Legacy, Modern bans

See merge request core-developers/forge!2605
2020-03-11 13:08:44 +00:00
Northmoc
e546b6a689 Brawl, Legacy, Modern bans 2020-03-11 09:01:11 -04:00
Anthony Calosa
7e31e15ead Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-11 16:52:34 +08:00
Anthony Calosa
62d7824155 remade border to have thin line edges
(simulate card edges)
2020-03-11 14:52:21 +08:00
Jamin W. Collins
8c5a90d6e9 handle more complex imageKey parsing
Should now be able to handle:
c:Town Gossipmonger|SOI|1$alt

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-10 21:23:29 -06:00
Sol
9345ff6725 Merge branch 'cardfixes' into 'master'
Card Fixes: Settle the Wreckage, Cavalier of Dawn

See merge request core-developers/forge!2601
2020-03-11 01:25:13 +00:00
Michael Kamensky
c45573ff2e Merge branch 'newBranch' into 'master'
Minor Visual Improvement & Update Android target SDK

See merge request core-developers/forge!2600
2020-03-10 18:10:14 +00:00
Adam Pantel
55300347ce Fix Settle the Wreckage, Cavalier of Dawn 2020-03-10 12:46:51 -04:00
Anthony Calosa
c85584445e update project.properties 2020-03-10 17:16:08 +08:00
Anthony Calosa
ceeb5d623f Increase Android target SDK so it will work with Android 10.
Need to download SDK 26 to compile.

(Just tested this on Android 6 and Android 9, it works, but need to test the change for Android 5 and Android 10, for Android 10, It needs to turn the storage permission settings manually since the project don't have running permission setup currently)
2020-03-10 16:53:59 +08:00
Anthony Calosa
1f4eff8b1c Adjust CroppedArea for Non Modern Card Frames
(fullborder images)
2020-03-10 16:45:08 +08:00
Anthony Calosa
41af869d3c Update Font 2020-03-10 16:35:39 +08:00
Michael Kamensky
2747d93e4c Merge branch 'fixXonCancel' into 'master'
GameAction: refactor setting CastSA

Closes #1320

See merge request core-developers/forge!2585
2020-03-10 06:35:34 +00:00
Hans Mackowiak
5c9251e295 SpellAbility: adding an Announce needs to be to originalMapParams too 2020-03-10 07:13:04 +01:00
Hans Mackowiak
fa67ee73a5 Card: cleanup multikicker values 2020-03-10 07:13:04 +01:00
Hans Mackowiak
e1659a4539 Combat: use lkiCase only if blocker itself is an lki 2020-03-10 07:13:04 +01:00
Hans Mackowiak
d5b578b306 Card: move reseting xmana paid to clearTemporaryVars 2020-03-10 07:13:04 +01:00
Hans Mackowiak
32b56018a6 GameAction: refactor setting CastSA 2020-03-10 07:13:04 +01:00
Peter
aa12085345 Add new translation strings about the new Auto Updater 2020-03-09 19:54:11 +01:00
Michael Kamensky
3dd20d9d0b Merge branch 'master' into 'master'
Fix AddsCounters

Closes #1264

See merge request core-developers/forge!2597
2020-03-09 18:27:54 +00:00
Agetian
8b922fc8f2 - Fix AddsCounters 2020-03-09 21:13:29 +03:00
CCTV-1
a527211bcf translate AutoUpdater 2020-03-09 20:15:36 +08:00
CCTV-1
c769a8adcf Merge remote-tracking branch 'upstream/master' 2020-03-09 19:21:43 +08:00
Agetian
c88a419e03 - Use ExecuteScript in PS_THB7 for a simpler implementation. 2020-03-09 12:32:06 +03:00
Michael Kamensky
b9618509be Merge branch 'desktop-autoupdate' into 'master'
check for updates button

See merge request core-developers/forge!2537
2020-03-09 03:59:40 +00:00
Sol
1076b1e29f Merge branch 'edition-fixes' into 'master'
improve handling of foil-only Kaya for CN2

See merge request core-developers/forge!2584
2020-03-09 01:10:26 +00:00
Jamin W. Collins
4717955afb improve handling of foil-only Kaya for CN2
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-08 09:43:58 -06:00
Michael Kamensky
af771d0c2c Merge branch 'master' into 'master'
Added puzzles PS_THB6 and PS_THB7 - Possibility Storm - Theros Beyond Death 06 and 07

See merge request core-developers/forge!2595
2020-03-08 12:12:36 +00:00
Michael Kamensky
8fea6b4cc0 Merge branch 'newBranch' into 'master'
Add Cancel Button for Puzzle Screen

See merge request core-developers/forge!2596
2020-03-08 12:12:30 +00:00
Anthony Calosa
9249029dc1 Add Cancel Button for Puzzle Screen
(If you decide not to solve puzzle or accidentally hit start on Puzzle Menu)
2020-03-08 18:37:36 +08:00
Agetian
e5d40554e1 - Error prevention on ID-based precast 2020-03-08 13:16:10 +03:00
Agetian
8b8e39ff41 - Added puzzles PS_THB6 and PS_THB7.
- Added a way to precast a spell from a specific host by ID.
2020-03-08 13:12:28 +03:00
Michael Kamensky
40591b04d2 Merge branch 'newBranch' into 'master'
Update Menu & App Icons

See merge request core-developers/forge!2591
2020-03-08 09:10:44 +00:00
Michael Kamensky
1c1e2416e4 Merge branch 'patch-4' into 'master'
Replace bg_match.jpg in Darkred skin

See merge request core-developers/forge!2593
2020-03-08 09:10:06 +00:00
CCTV-1
684e9327cd update forge-android support simplified chinese characters. 2020-03-08 16:22:20 +08:00
CCTV-1
5906891fec update translation 2020-03-08 16:18:02 +08:00
CCTV-1
e0c9d5e6e0 Merge remote-tracking branch 'upstream/master' 2020-03-08 16:11:00 +08:00
Anthony Calosa
bdf9d3f88e Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-08 12:34:47 +08:00
Sol
960760a564 Merge branch 'mb1fix' into 'master'
MB1 pool corrections

See merge request core-developers/forge!2590
2020-03-08 02:13:25 +00:00
Tim Mocny
f488cb1d0b MB1 pool corrections 2020-03-08 02:13:25 +00:00
Sol
c4e2004af3 Merge branch 'fixes' into 'master'
simplify regex usage to group numbers, support Android 6

See merge request core-developers/forge!2592
2020-03-08 02:11:07 +00:00
friarsol
dcb151f561 Get the Updater liike 90% of the way there. 2020-03-07 20:37:07 -05:00
Churrufli
4550ee26e3 Replace bg_match.jpg, previous one is a png renamed, I noticed may cause bugs in some Android versions 2020-03-07 18:15:23 +00:00
Jamin W. Collins
ecdea545fc simplify regex usage to group numbers, support Android 6
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-07 09:01:57 -07:00
Anthony Calosa
643c08850b Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-07 13:21:38 +08:00
Anthony Calosa
fed6d788cf Update Menu Icons 2020-03-07 13:21:13 +08:00
Anthony Calosa
3ccd979b63 Update App Icon 2020-03-07 13:20:07 +08:00
Michael Kamensky
be52fb772e Merge branch 'onceupon' into 'master'
Once Upon a Time (lowercase "a" throughout Forge)

See merge request core-developers/forge!2589
2020-03-06 15:30:37 +00:00
Tim Mocny
633c106708 Once Upon a Time (lowercase "a" throughout Forge) 2020-03-06 15:30:36 +00:00
Michael Kamensky
aec62cbffb Merge branch 'mysteryboost' into 'master'
Mystery Booster support!

See merge request core-developers/forge!2588
2020-03-06 15:30:25 +00:00
Tim Mocny
5b61712d70 Mystery Booster support! 2020-03-06 15:30:25 +00:00
Michael Kamensky
7fa248db4c Merge branch 'patch-joust' into 'master'
Update joust: add missing AILogic$ Fight

See merge request core-developers/forge!2586
2020-03-05 14:32:18 +00:00
Hans Mackowiak
33f04148d3 Update joust: add missing AILogic$ Fight 2020-03-05 14:32:17 +00:00
Michael Kamensky
3aa33be214 Merge branch 'patch-collector-number-thb' into 'master'
Update Theros Beyond Death: add missing CollectorNumber

See merge request core-developers/forge!2587
2020-03-05 14:32:11 +00:00
Hans Mackowiak
612045f8c0 Update Theros Beyond Death: add missing CollectorNumber 2020-03-05 14:32:11 +00:00
Michael Kamensky
0bd6b16247 Merge branch 'edition-fixes' into 'master'
Edition fixes

See merge request core-developers/forge!2583
2020-03-05 03:35:42 +00:00
Michael Kamensky
eaa7d296d2 Merge branch 'newBranch' into 'master'
Fix jerky animation on Conquest Reward Dialog

See merge request core-developers/forge!2581
2020-03-05 03:32:26 +00:00
Jamin W. Collins
235162fb84 fixing the collector numbers for Magic 2015
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 20:06:09 -07:00
Jamin W. Collins
fc4a491111 fixing collector numbers for Magic 2014
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 20:04:36 -07:00
Jamin W. Collins
0cd9b1435b fixing collector numbers for Khans of Tarkir
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 20:02:16 -07:00
Sol
61184ade4c Merge branch 'collector_number' into 'master'
change collector number to be a String

See merge request core-developers/forge!2578
2020-03-05 02:55:36 +00:00
Jamin W. Collins
f2e29c9c93 fixing collector numbers for Fate Reforged
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:54:54 -07:00
Sol
e676073548 Merge branch 'network-play-fixes' into 'master'
Network play fixes

See merge request core-developers/forge!2582
2020-03-05 02:51:16 +00:00
Jamin W. Collins
6b315b2571 adding missing card for Conspiracy Take the Crown
Kaya, Ghost Assassin is a foil-only booster card

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:46:40 -07:00
Jamin W. Collins
6e028a1c45 correct the rarities for Beatdown
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:40:27 -07:00
Jamin W. Collins
f07e2bc2ec correct the rarities for Battlebond
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:40:04 -07:00
Jamin W. Collins
3bc4124fe8 correct the rarities for Battle Royale
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:37:55 -07:00
Jamin W. Collins
bb5af6298e correct the collect numbers for Aether Revolt
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:32:28 -07:00
Jamin W. Collins
3c6c0f534d correct the tokens delimeter for Weatherlight
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:29:44 -07:00
Jamin W. Collins
4f3a8590dd semi-ignore non-fatal IndexOutOfBoundsException
Not entirely sure why there are IndexOutOfBoundsException being seen
currently, but they are not fatal and do not appear to result in game
state skew between client and server.  So, logging and moving on.

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:08:02 -07:00
Jamin W. Collins
2a993eb0e0 fixing openZones method signature for network-play
Changes introduced in ef0a1a84 altered the method signature for
openZones, but did not fully update the signature for network-play
calls.

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-04 19:06:07 -07:00
Anthony Calosa
f99e819ff0 Add puzzle improvements to Mobile Forge 2020-03-05 05:45:11 +08:00
Anthony Calosa
0f6b65a9ff Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-04 19:40:09 +08:00
austinio7116
6e94378cc1 Added filter to ensure banlist is respected 2020-03-04 06:05:07 +00:00
Jamin W. Collins
ff31718839 correct how collectorNumber is located
The existing logic will always return the first match for a given card
name, even if there are multiple different printings of the same card
name within a set. This change aligns the collectorNumber with the
alternate art index.

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-03 21:27:05 -07:00
Michael Kamensky
2ab5a286c5 Merge branch '030320' into 'master'
March 3 fixes

See merge request core-developers/forge!2580
2020-03-04 04:07:14 +00:00
Northmoc
e07208e81b dissenters_deliverance.txt correct filename 2020-03-03 14:15:54 -05:00
Hans Mackowiak
1ec9c6cade Merge branch 'glyphofdelusion' into 'master'
Glyph of Delusion

Closes #63

See merge request core-developers/forge!2482
2020-03-03 16:24:42 +00:00
Tim Mocny
04e94f68f5 Glyph of Delusion 2020-03-03 16:24:41 +00:00
Jamin W. Collins
e325f42ca8 change collector number to be a String
This change moves the internal storage of collector number from Integer
to String.

The parsed pattern for valid collector numbers is any number of digits
followed by an optional single non-digit character. This follows the
format used by Scryfall for the alternate art WAR planeswalkers and
cards from older formats sucha as FEM.

Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-03 08:59:09 -07:00
Michael Kamensky
f3c078b23c Merge branch 'Hanmac-master-patch-40459' into 'master'
CardProperty: extend blockedValidThisTurn and blockedByValidThisTurn using defined

Closes #1299

See merge request core-developers/forge!2579
2020-03-03 14:30:40 +00:00
Hans Mackowiak
4f0deea15f CardProperty: extend blockedValidThisTurn and blockedByValidThisTurn using defined 2020-03-03 14:30:39 +00:00
Michael Kamensky
db396e6b5c Merge branch '020320' into 'master'
Fixes - 2 Mar 2020

See merge request core-developers/forge!2577
2020-03-03 04:07:39 +00:00
Tim Mocny
dfe7ea0ecc Fixes - 2 Mar 2020 2020-03-03 04:07:39 +00:00
Michael Kamensky
55cba2513f Merge branch 'witchHuntAi' into 'master'
ControlGainAi: fix target logic for Witch Hunt

See merge request core-developers/forge!2576
2020-03-02 06:08:02 +00:00
Hans Mackowiak
9bbc3c8ef2 ControlGainAi: fix target logic for Witch Hunt 2020-03-02 06:59:33 +01:00
Anthony Calosa
c473ecb827 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-02 12:30:51 +08:00
Anthony Calosa
f654982e38 Fix Card Reveal Animation for default display 2020-03-02 12:30:02 +08:00
Michael Kamensky
38394ee263 Merge branch 'fixes' into 'master'
fix message when no cards in opponent's hand

See merge request core-developers/forge!2575
2020-03-02 03:55:12 +00:00
Jamin W. Collins
c9010d4224 fix message when no cards in opponent's hand
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-01 14:04:08 -07:00
Michael Kamensky
cb1b8024b4 Merge branch '1303-control-change-and-cda-not-reset' into 'master'
Resolve "Control Change and CDA not reset?"

Closes #1303

See merge request core-developers/forge!2573
2020-03-01 17:15:39 +00:00
Hans Mackowiak
075a0e99af Merieke Ri Berit: use Effect for Destroy Trigger 2020-03-01 17:37:06 +01:00
Jamin Collins
5f4c86697a Merge branch 'sld37' into 'master'
SLD - Thalia

See merge request core-developers/forge!2574
2020-03-01 15:42:59 +00:00
Tim Mocny
1fee06c843 SLD - Thalia 2020-03-01 15:42:59 +00:00
Hans Mackowiak
23bc7a629b Fix controllerChangeZoneCorrection when ControlGain is undone 2020-03-01 11:47:51 +01:00
Hans Mackowiak
86ec94ca0d Merge branch '1300-crash-on-desktop-1-6-32-snapshot-r123-2020-01-27-1-pm' into 'master'
Resolve "Crash on Desktop 1.6.32 Snapshot r123 (2020-01-27 ~1 PM)"

Closes #1300

See merge request core-developers/forge!2555
2020-03-01 10:30:45 +00:00
Hans Mackowiak
93f0ade107 MustBlockEffect: use Choose Card for Crashing Boars 2020-03-01 10:30:45 +00:00
Michael Kamensky
40bb3d2750 Merge branch 'newBranch' into 'master'
Update Sprite Icons (Default Theme)

See merge request core-developers/forge!2564
2020-03-01 04:16:22 +00:00
Michael Kamensky
86a9cb13d9 Merge branch 'WAR_JP_PW' into 'master'
WAR with Japanese Planeswalkers added (option 2)

Closes #1305

See merge request core-developers/forge!2566
2020-03-01 04:15:18 +00:00
Tim Mocny
e1138ff7b5 WAR with Japanese Planeswalkers added (option 2) 2020-03-01 04:15:17 +00:00
Michael Kamensky
52fe82b834 Merge branch 'sliverfixes' into 'master'
Forum fixes Leap Day

See merge request core-developers/forge!2571
2020-03-01 04:14:47 +00:00
Tim Mocny
15e3c4f5e5 Forum fixes Leap Day 2020-03-01 04:14:47 +00:00
Michael Kamensky
4e5853e29a Merge branch 'triggerFixStack' into 'master'
GameAction: fix Trigger for Stack

Closes #1309

See merge request core-developers/forge!2572
2020-03-01 04:14:44 +00:00
Hans Mackowiak
34d0d143c5 GameAction: fix Trigger for Stack 2020-03-01 04:14:44 +00:00
Michael Kamensky
d37cb22698 Merge branch 'master' into 'master'
Added puzzle PS_THB5 + AI logic improvement for Kenrith, the Returned King

See merge request core-developers/forge!2568
2020-03-01 04:13:57 +00:00
Anthony Calosa
b5787407b6 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-03-01 11:10:55 +08:00
Anthony Calosa
4d1d79098d Better Icon Render 2020-03-01 10:47:48 +08:00
Sol
3fc0c1e20f Merge branch 'fixes' into 'master'
Fixes

See merge request core-developers/forge!2570
2020-03-01 02:44:30 +00:00
Jamin Collins
726b8bfbe5 correct sprite load progress bar to 100% max
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-03-01 02:44:30 +00:00
Anthony Calosa
0306ab97f1 Fix Crash on Desktop, Menu Arrangement, Added some Icons 2020-03-01 07:42:20 +08:00
Jamin Collins
083df572b8 Merge branch 'tinyban' into 'master'
Tiny Leaders ban - Najeela

See merge request core-developers/forge!2569
2020-02-29 21:50:28 +00:00
Tim Mocny
12c705476d Tiny Leaders ban - Najeela 2020-02-29 21:50:28 +00:00
Agetian
4880d70129 - Simple modification for AI PumpAll on Kenrith 2020-02-29 19:33:35 +03:00
Agetian
f49d5e2352 - Better AI targeting for Kenrith, the Returned King's {4}{B} ability. 2020-02-29 19:25:24 +03:00
Agetian
f8b9a31bf2 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2020-02-29 17:06:04 +03:00
Michael Kamensky
808a43b44d Merge branch 'editions28feb' into 'master'
Editions support for Grand Prix Promos, Unsanctioned

See merge request core-developers/forge!2562
2020-02-29 14:02:09 +00:00
Tim Mocny
f2c523c267 Editions support for Grand Prix Promos, Unsanctioned 2020-02-29 14:02:09 +00:00
Michael Kamensky
b847f7f8c9 Merge branch 'immolation' into 'master'
Mask of Immolation typos fix

See merge request core-developers/forge!2560
2020-02-29 14:01:26 +00:00
Tim Mocny
a9f13ee503 Mask of Immolation typos fix 2020-02-29 14:01:26 +00:00
Agetian
e0b7ea4960 - Added puzzle PS_THB5. 2020-02-29 16:49:53 +03:00
Sol
a41c0454fa Merge branch 'update-modern-banned' into 'master'
updating the Modern banned list

See merge request core-developers/forge!2565
2020-02-29 04:39:58 +00:00
Jamin W. Collins
226716c816 updating Pioneer ban list
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-02-28 19:18:59 -07:00
Jamin W. Collins
3c6f82294b updating the Modern banned list
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2020-02-28 19:05:27 -07:00
Anthony Calosa
600d672b4a Update Sprite Icons on Mobile Forge
(Default theme)
2020-02-29 05:05:51 +08:00
Anthony Calosa
48cb11566f Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-02-28 23:16:14 +08:00
Anthony Calosa
c3be51c117 Fix Missing Translation on Planar Conquest 2020-02-28 23:15:29 +08:00
Hans Mackowiak
841808d99a Merge branch 'combo_attack' into 'master'
Band Together / Combo Attack

See merge request core-developers/forge!2551
2020-02-28 15:12:42 +00:00
Tim Mocny
258f0a2072 Band Together / Combo Attack 2020-02-28 15:12:42 +00:00
Michael Kamensky
0b2e60b0c1 Merge branch 'maddening_imp' into 'master'
Maddening Imp round 2

See merge request core-developers/forge!2559
2020-02-28 05:11:31 +00:00
Tim Mocny
669bc9ceaa Maddening Imp round 2 2020-02-28 05:11:31 +00:00
Michael Kamensky
93d9d12879 Merge branch 'maddening_imp' into 'master'
Today's fixes

See merge request core-developers/forge!2558
2020-02-27 04:34:47 +00:00
Tim Mocny
9d0f3f325b Today's fixes 2020-02-27 04:34:47 +00:00
Michael Kamensky
d66b61f0a3 Merge branch 'quenchable_fire' into 'master'
Quenchable Fire - Ready!

Closes #580

See merge request core-developers/forge!2533
2020-02-26 20:01:06 +00:00
Tim Mocny
9d79b6c262 Quenchable Fire - Ready! 2020-02-26 20:01:06 +00:00
Michael Kamensky
7721b227cb Merge branch '24Feb2020' into 'master'
Nahiri, the Lithomancer +2 ability (cosmetic only)

See merge request core-developers/forge!2554
2020-02-26 19:58:08 +00:00
Tim Mocny
d1106f8df7 Nahiri, the Lithomancer +2 ability (cosmetic only) 2020-02-26 19:58:07 +00:00
Michael Kamensky
794fcdafe5 Merge branch 'sld51' into 'master'
SLD - IWD 2020 cards

See merge request core-developers/forge!2557
2020-02-26 19:57:31 +00:00
Tim Mocny
344126d5aa SLD - IWD 2020 cards 2020-02-26 19:57:31 +00:00
Anthony Calosa
2a72a87ef4 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-02-26 23:42:42 +08:00
Michael Kamensky
7b1af4035d Merge branch 'attachNPEfix' into 'master'
AttachEffect: ChooseAnObject if list is empty and chosen is null, don't add to list

See merge request core-developers/forge!2556
2020-02-26 11:05:24 +00:00
Hans Mackowiak
931d08d3ac AttachEffect: ChooseAnObject if list is empty and chosen is null, don't add to list 2020-02-26 11:05:23 +00:00
CCTV-1
85b2409a66 Merge remote-tracking branch 'upstream/master' 2020-02-26 17:52:04 +08:00
Michael Kamensky
ea582088a6 Merge branch 'newBranch' into 'master'
Updated Sprite Buttons on Mobile Forge

See merge request core-developers/forge!2552
2020-02-26 04:00:34 +00:00
Sol
468dd46205 Merge branch 'bronzetablet' into 'master'
Bronze Tablet

Closes #37

See merge request core-developers/forge!2493
2020-02-25 16:39:46 +00:00
Tim Mocny
b03f263fce Bronze Tablet 2020-02-25 16:39:45 +00:00
Anthony Calosa
15b69d3d70 Merge remote-tracking branch 'remotes/core/master' into newBranch 2020-02-26 00:07:16 +08:00
Hans Mackowiak
8004892058 Merge branch '1298-wrong-player-controls-etb-trigger-of-clone' into 'master'
Resolve "Wrong player controls ETB trigger of Clone"

Closes #1302 and #1298

See merge request core-developers/forge!2553
2020-02-25 15:03:21 +00:00
Hans Mackowiak
f03e386399 Resolve "Wrong player controls ETB trigger of Clone" 2020-02-25 15:03:20 +00:00
CCTV-1
5b9d19cfce fix unused import 2020-02-25 21:28:55 +08:00
CCTV-1
e7d5700dac update translation 2020-02-25 21:14:16 +08:00
CCTV-1
5a133686ec translate online game message 2020-02-25 21:14:04 +08:00
CCTV-1
58df46261e update translations 2020-02-25 19:00:25 +08:00
CCTV-1
9bf7e08f01 translate import deck confirm dialog 2020-02-25 19:00:03 +08:00
Anthony Calosa
40478a45ac Update Icons 2020-02-25 18:43:57 +08:00
CCTV-1
3c8b8a04e1 update translation 2020-02-25 12:24:32 +08:00
CCTV-1
82e520ca67 translate desktop sideboard dialog message 2020-02-25 12:24:22 +08:00
Anthony Calosa
01a17b4b2c Upscaled Zone Icons and FlipCard Icons 2020-02-25 12:23:04 +08:00
friarsol
63f958fa60 Some cleanup 2020-02-24 20:56:59 -05:00
CCTV-1
f3d739a5d8 update translation 2020-02-24 20:06:43 +08:00
CCTV-1
453f14760c translate desktop phase tooltip 2020-02-24 20:06:34 +08:00
CCTV-1
9f19b3f93f translate desktop deck import 2020-02-24 20:06:04 +08:00
CCTV-1
cc5d2c47ee translate some text 2020-02-24 20:05:44 +08:00
Michael Kamensky
c916c4da31 Merge branch 'tempest_efreet' into 'master'
Tempest Efreet

Closes #115

See merge request core-developers/forge!2550
2020-02-24 09:01:45 +00:00
Tim Mocny
9e79d7810f Tempest Efreet 2020-02-24 09:01:44 +00:00
Michael Kamensky
0dbbcd4edc Merge branch 'newBranch' into 'master'
Upscaled Start Button

See merge request core-developers/forge!2549
2020-02-24 09:00:58 +00:00
Anthony Calosa
eb039b3bdd Update Start Button 2020-02-23 22:38:33 +08:00
CCTV-1
f4dfa6038c fix translation format 2020-02-23 21:10:22 +08:00
Michael Kamensky
9be6a5a6a3 Merge branch 'newBranch' into 'master'
Add Support for HD Buttons on Mobile Forge

See merge request core-developers/forge!2547
2020-02-23 12:44:06 +00:00
Anthony Calosa
81c06f230a Add Support for Upscaling Buttons on Mobile Forge 2020-02-23 19:10:11 +08:00
Michael Kamensky
645a11f9c3 Merge branch 'master' into 'master'
Initial logic implementation for Mercenaries

See merge request core-developers/forge!2546
2020-02-23 05:19:38 +00:00
Agetian
68ca9ec622 - Initial logic implementation for Mercenaries 2020-02-23 08:14:48 +03:00
Michael Kamensky
b4883eb77e Merge branch 'mercenaries' into 'master'
Mercenaries!

See merge request core-developers/forge!2545
2020-02-23 04:39:16 +00:00
Tim Mocny
7e57ffb62d Mercenaries! 2020-02-23 04:39:14 +00:00
Michael Kamensky
820666b278 Merge branch 'fumble' into 'master'
Fumble - Ready!

See merge request core-developers/forge!2535
2020-02-23 04:31:23 +00:00
Tim Mocny
9d0c2968aa Fumble - Ready! 2020-02-23 04:31:23 +00:00
Michael Kamensky
d3f2b07c83 Merge branch 'emergencypowers' into 'master'
Emergency Powers Addendum

See merge request core-developers/forge!2544
2020-02-23 04:31:04 +00:00
Tim Mocny
57ebad948d Emergency Powers Addendum 2020-02-23 04:31:04 +00:00
Michael Kamensky
3f1b9df62a Merge branch '1290-trigger-needs-cleanup-after-cost-is-paid' into 'master'
Resolve "Trigger needs cleanup after cost is paid"

Closes #1290

See merge request core-developers/forge!2543
2020-02-22 14:46:44 +00:00
Hans Mackowiak
f990f19795 Resolve "Trigger needs cleanup after cost is paid" 2020-02-22 14:46:44 +00:00
Michael Kamensky
b2e1855949 Merge branch '1295-runtimeexception-abilityfactory-getability-startled-awake-has-no-svar-trigbounce' into 'master'
Resolve "RuntimeException: AbilityFactory : getAbility -- Startled Awake has no SVar: TrigBounce"

Closes #1295

See merge request core-developers/forge!2540
2020-02-22 11:10:19 +00:00
Hans Mackowiak
850e54fbbc Resolve "RuntimeException: AbilityFactory : getAbility -- Startled Awake has no SVar: TrigBounce" 2020-02-22 11:10:19 +00:00
Michael Kamensky
9931b33be7 Merge branch '1294-anax-hardened-in-the-forge-power-abnormal' into 'master'
Resolve "'Anax, Hardened in the Forge' power abnormal"

Closes #1294

See merge request core-developers/forge!2542
2020-02-22 10:17:40 +00:00
Hans Mackowiak
040518d094 Resolve "'Anax, Hardened in the Forge' power abnormal" 2020-02-22 10:17:40 +00:00
Michael Kamensky
823c651532 Merge branch 'master' into 'master'
Added puzzle PS_THB4 - Possibility Storm - Theros Beyond Death 04

See merge request core-developers/forge!2541
2020-02-22 10:17:32 +00:00
Agetian
b412a361b9 - Added puzzle PS_THB4. 2020-02-22 11:33:32 +03:00
Michael Kamensky
022ea1bb75 Merge branch 'PSLD1292' into 'master'
Secret Lair Promos.txt update

Closes #1292

See merge request core-developers/forge!2538
2020-02-22 06:33:58 +00:00
Tim Mocny
f08f7b09d5 Secret Lair Promos.txt update 2020-02-22 06:33:58 +00:00
Michael Kamensky
16452dd11a Merge branch 'tezzeret21Feb' into 'master'
Forum fixes

See merge request core-developers/forge!2539
2020-02-22 06:33:45 +00:00
Tim Mocny
b0791a0c6a Forum fixes 2020-02-22 06:33:45 +00:00
friarsol
2b8d826209 I think this should be working now! 2020-02-21 22:26:33 -05:00
CCTV-1
f37eee21cd update translations 2020-02-21 20:48:13 +08:00
CCTV-1
e195fe40b9 translate some message text 2020-02-21 20:47:38 +08:00
Michael Kamensky
900ba9ec5b Merge branch '1276-display-divided-value' into 'master'
Display Divided Values in stack description

Closes #1276

See merge request core-developers/forge!2524
2020-02-21 04:08:16 +00:00
CCTV-1
b2526523d8 fix key typo 2020-02-20 18:48:08 +08:00
Michael Kamensky
8db0281f91 Merge branch '559' into 'master'
Search zones for any number of cards named X and exile (or something else)

Closes #559

See merge request core-developers/forge!2527
2020-02-20 08:43:39 +00:00
Tim Mocny
9637091ab5 Search zones for any number of cards named X and exile (or something else) 2020-02-20 08:43:39 +00:00
Michael Kamensky
45771ec8c0 Merge branch 'mausoleum_wanderer' into 'master'
Mausoleum Wanderer proofread

See merge request core-developers/forge!2532
2020-02-20 08:42:39 +00:00
Tim Mocny
5c3ff8297e Mausoleum Wanderer proofread 2020-02-20 08:42:39 +00:00
Michael Kamensky
722f512e53 Merge branch '504-shared-fate-can-not-cast-spell-queller-via-flash' into 'master'
Resolve "Shared Fate -- can not cast Spell Queller via Flash"

Closes #504

See merge request core-developers/forge!2534
2020-02-20 08:42:33 +00:00
Michael Kamensky
0cceaf0485 Merge branch '1286' into 'master'
Challenger 2020 Precon Decks (Quest Mode)

Closes #1286

See merge request core-developers/forge!2531
2020-02-20 08:40:55 +00:00
Tim Mocny
23d0d70478 Challenger 2020 Precon Decks (Quest Mode) 2020-02-20 08:40:55 +00:00
Hans Mackowiak
2eea49a8e4 Spell: add getAlternateHost for spells that would change the CardState 2020-02-20 07:03:24 +01:00
CCTV-1
c96ded2508 update translations 2020-02-20 10:15:23 +08:00
CCTV-1
f0a6760312 translate quest starting pool type 2020-02-20 10:15:08 +08:00
CCTV-1
55db217c74 update translations 2020-02-19 21:19:14 +08:00
CCTV-1
11c5283014 translate some desktop quest text 2020-02-19 21:18:58 +08:00
CCTV-1
bad3227e4f update translation 2020-02-19 11:37:49 +08:00
CCTV-1
7ea0a5268c translate deck viewer 2020-02-19 11:37:26 +08:00
CCTV-1
456083d2b0 translate tip text 2020-02-19 11:36:52 +08:00
CCTV-1
ad0766d9a6 Merge remote-tracking branch 'upstream/master' 2020-02-19 11:35:53 +08:00
CCTV-1
e1dbdcc051 update translations 2020-02-19 08:34:13 +08:00
Michael Kamensky
a7d8a62a69 Merge branch '1288-unstable-shapeshifter-not-unstable' into 'master'
Resolve "Unstable Shapeshifter not unstable"

Closes #1288

See merge request core-developers/forge!2530
2020-02-18 17:03:10 +00:00
Hans Mackowiak
c8fdc6f272 Resolve "Unstable Shapeshifter not unstable" 2020-02-18 17:03:10 +00:00
Sol
9990062ec1 Merge branch '1281-general-ui-display-commander-tax' into 'master'
Resolve "[General / UI] Display Commander Tax"

Closes #1281

See merge request core-developers/forge!2528
2020-02-18 14:23:48 +00:00
Hans Mackowiak
6817b4af66 Resolve "[General / UI] Display Commander Tax" 2020-02-18 14:23:48 +00:00
friarsol
133f1656d8 Some more progress with autoupdate button 2020-02-17 21:51:18 -05:00
friarsol
599d75351c Hook up AutoUpdater to do its thing 2020-02-17 16:51:34 -05:00
Hans Mackowiak
c42202a140 Merge branch 'Hanmac-master-patch-75614' into 'master'
Anax, Hardened in the Forge: updated triggers, need two for itself and other

See merge request core-developers/forge!2496
2020-02-16 15:36:07 +00:00
Hans Mackowiak
d6c0cf6ef8 Anax, Hardened in the Forge: updated triggers, need two for itself and other 2020-02-16 15:36:07 +00:00
MS
72ad7804ca Update CountersPutEffect.java 2020-02-16 07:41:06 +00:00
CCTV-1
11e33bfaa0 update translation 2020-02-16 13:28:35 +08:00
CCTV-1
b1ad316134 translate some tab/menu text 2020-02-16 13:28:16 +08:00
CCTV-1
f2dc8e3e80 update translation 2020-02-16 12:02:10 +08:00
CCTV-1
3ff20effc8 translate floating zone title 2020-02-16 12:01:20 +08:00
CCTV-1
eb4ae865d4 Merge remote-tracking branch 'upstream/master' 2020-02-16 12:00:01 +08:00
Michael Kamensky
6bf1af44d8 Merge branch 'master' into 'master'
Added puzzle PS_THB3 - Possibility Storm - Theros Beyond Death 03

See merge request core-developers/forge!2529
2020-02-15 19:13:40 +00:00
Agetian
a74f1a1427 - Added puzzle PS_THB3. 2020-02-15 16:28:36 +03:00
Michael Kamensky
df88cb970f Merge branch '13Feb2020' into 'master'
Quest Shop Precons - Commander 2018

Closes #205

See merge request core-developers/forge!2525
2020-02-15 03:51:04 +00:00
Tim Mocny
452dee7e11 Quest Shop Precons - Commander 2018 2020-02-15 03:51:04 +00:00
Michael Kamensky
f6a6c33193 Merge branch '14Feb2020SLD' into 'master'
SLD - Theros Stargazing

See merge request core-developers/forge!2526
2020-02-15 03:50:36 +00:00
Tim Mocny
6a98c8f371 SLD - Theros Stargazing 2020-02-15 03:50:35 +00:00
Michael Kamensky
9546594e8d Merge branch 'target-other-zones' into 'master'
Show ZoneAreas when targeting non-Stack zones

See merge request core-developers/forge!2492
2020-02-14 15:01:02 +00:00
Michael Kamensky
23f5b7696a Merge branch 'kessCancelFix' into 'master'
HumanPlaySpellAbility: fix CastSA and CastFrom reset when ability is canceld

Closes #1282

See merge request core-developers/forge!2523
2020-02-14 14:01:16 +00:00
Hans Mackowiak
93ae66ad39 HumanPlaySpellAbility: fix CastSA and CastFrom reset when ability is canceld 2020-02-14 14:01:16 +00:00
ESE_Manuel
4d3ce706a5 workaround for divideMap not cleared after canceling ability 2020-02-14 12:50:52 +01:00
ESE_Manuel
5b57ef3531 Revert "fixed bug, dividedMap clear"
This reverts commit eadc0afe1a.
2020-02-14 12:06:02 +01:00
ESE_Manuel
eadc0afe1a fixed bug, dividedMap clear
needs to be cleared when SA was not put on the stack or wrong stack description
2020-02-14 11:38:09 +01:00
ESE_Manuel
687b5f18ef made stack description more clear for DamageDealEffect
changed stack description for distribute parameter (x counter)
2020-02-14 10:54:58 +01:00
ESE_Manuel
25178869ae fallback if there is no targetrestriction on divide damage effects 2020-02-14 10:09:52 +01:00
ESE_Manuel
eedcad8280 removed unused import 2020-02-14 08:32:24 +01:00
ESE_Manuel
50c94755fb Display Divided Values in stack description 2020-02-14 07:58:19 +01:00
friarsol
ec79434759 Improve Android zone restoration 2020-02-13 23:17:26 -05:00
Michael Kamensky
4192d56909 Merge branch 'mana_symbols_vanish' into 'master'
changed hardcoded symbol WIDTH and HEIGHT to constants

See merge request core-developers/forge!2520
2020-02-14 03:26:08 +00:00
Michael Kamensky
2c82aedb74 Merge branch 'bling' into 'master'
Secret Lair Drop Series and Promos

See merge request core-developers/forge!2522
2020-02-13 18:15:02 +00:00
Tim Mocny
049ed5f9c4 Secret Lair Drop Series and Promos 2020-02-13 18:15:02 +00:00
Michael Kamensky
b183862e8d Merge branch 'triggerDamageAll' into 'master'
TriggerDamageAll: add new Trigger for Mindblade Render

See merge request core-developers/forge!2519
2020-02-13 15:12:52 +00:00
Hans Mackowiak
57bc3f930a TriggerDamageAll: add new Trigger for Mindblade Render 2020-02-13 15:12:52 +00:00
Michael Kamensky
48a3b4d652 Merge branch '1272-battle-lands-etb-tap-untap-issue' into 'master'
Resolve "Battle Lands ETB tap/untap issue"

Closes #1272

See merge request core-developers/forge!2521
2020-02-13 15:12:03 +00:00
Hans Mackowiak
bee93cbab3 Player: update LastState when Land is played 2020-02-13 10:29:00 +00:00
Michael Kamensky
9d0a683db8 Merge branch 'release-updates' into 'master'
Update some release files

See merge request core-developers/forge!2516
2020-02-13 05:55:16 +00:00
Michael Kamensky
e163132a1e Merge branch 'bling' into 'master'
Bling cards

See merge request core-developers/forge!2517
2020-02-13 05:54:32 +00:00
Tim Mocny
d35cb8de32 Bling cards 2020-02-13 05:54:31 +00:00
Michael Kamensky
162a27f5a1 Merge branch '12Feb2020' into 'master'
Today's tweaks

See merge request core-developers/forge!2514
2020-02-13 05:53:48 +00:00
Tim Mocny
d1c2096024 Today's tweaks 2020-02-13 05:53:48 +00:00
Zimtente
50c8e129d0 changed hardcoded symbol WIDTH and HEIGHT to constants 2020-02-12 19:07:45 +01:00
Sol
01bd5e5d54 Update CONTRIBUTORS.txt 2020-02-12 18:05:09 +00:00
Sol
562a9e1f8d Update ANNOUNCEMENTS.txt 2020-02-12 18:04:34 +00:00
Sol
548811b370 Merge branch 'mana_symbols_vanish' into 'master'
fixed mana symbols vanishing/not being in the right place in card descriptions

See merge request core-developers/forge!2515
2020-02-12 17:59:25 +00:00
Zimtente
6ae29a311a fixed mana symbols vanishing/not being in the right place in card descriptions 2020-02-12 17:40:50 +01:00
Sol
9934e20f8b Merge branch 'promoarts' into 'master'
Promo arts – correcting a few errors

See merge request core-developers/forge!2513
2020-02-12 14:43:40 +00:00
Tim Mocny
e7a5ee57f1 Promo arts – correcting a few errors 2020-02-12 14:43:40 +00:00
Michael Kamensky
06f2f416e0 Merge branch 'brawl_update' into 'master'
Brawl format update

Closes #1277

See merge request core-developers/forge!2511
2020-02-12 04:24:38 +00:00
Tim Mocny
8bda30179e Brawl format update 2020-02-12 04:24:38 +00:00
Michael Kamensky
9806c2c63c Merge branch 'promoarts' into 'master'
Promo arts update (THB, ELD)

See merge request core-developers/forge!2512
2020-02-12 04:24:23 +00:00
Tim Mocny
9d5d6dd6d2 Promo arts update (THB, ELD) 2020-02-12 04:24:23 +00:00
Michael Kamensky
8fecf07c47 Merge branch '7Feb2020' into 'master'
2/10/2020 tweaks

See merge request core-developers/forge!2508
2020-02-11 03:12:46 +00:00
Tim Mocny
a539d9bf5a 2/10/2020 tweaks 2020-02-11 03:12:46 +00:00
friarsol
ddc531c5f2 Updates for Android 2020-02-10 21:30:19 -05:00
CCTV-1
102b366c1e update translation 2020-02-10 20:24:11 +08:00
CCTV-1
26fb509cb9 translate FFileChooser 2020-02-10 20:24:01 +08:00
CCTV-1
81e616ad16 progress start with 1 2020-02-10 20:23:25 +08:00
CCTV-1
c140ae7647 Merge remote-tracking branch 'upstream/master' 2020-02-10 20:21:23 +08:00
friarsol
ef0a1a843d Pop up other zones during targeting 2020-02-09 21:32:24 -05:00
Michael Kamensky
bf200de73b Merge branch 'triggerFixChangedCopy' into 'master'
Trigger: fix copy need new Map for params

See merge request core-developers/forge!2507
2020-02-09 19:34:03 +00:00
Hans Mackowiak
9a56fb8998 Trigger: fix copy need new Map for params 2020-02-09 19:34:03 +00:00
Michael Kamensky
4a3740dac7 Merge branch 'staticAbilitySuspendedFix' into 'master'
StaticAbility: fix ability is removed by other ability

See merge request core-developers/forge!2505
2020-02-08 17:33:05 +00:00
Hans Mackowiak
31145ef2eb StaticAbility: fix ability is removed by other ability 2020-02-08 17:33:04 +00:00
Michael Kamensky
23ab256f7d Merge branch 'gameActionCloneFix' into 'master'
GameAction: fix Clone working again

See merge request core-developers/forge!2506
2020-02-08 17:33:00 +00:00
Hans Mackowiak
0f435b58a1 GameAction: fix Clone working again 2020-02-08 18:17:21 +01:00
Michael Kamensky
5d1a0421fd Merge branch 'fixAddTypeChosen' into 'master'
StaticAbilityContinuous: fix AddType ChosenType

See merge request core-developers/forge!2504
2020-02-08 04:44:45 +00:00
Hans Mackowiak
55ed4c1bc0 StaticAbilityContinuous: fix AddType ChosenType 2020-02-08 04:44:45 +00:00
Michael Kamensky
22a6a72f12 Merge branch 'master' into 'master'
Added puzzle PS_THB2 - Possibility Storm - Theros Beyond Death 02

See merge request core-developers/forge!2503
2020-02-07 18:14:55 +00:00
Agetian
7c38ac7dfa - Fixed scripted targeting in GameState not remembering targets when necessary.
- Added puzzle PS_THB2.
2020-02-07 20:54:36 +03:00
Michael Kamensky
d29dc72831 Merge branch 'fixesGrafCage' into 'master'
Fixes graf cage

Closes #1195

See merge request core-developers/forge!2377
2020-02-07 17:29:54 +00:00
Hans Mackowiak
e062c83c02 Fixes graf cage 2020-02-07 17:29:54 +00:00
Hans Mackowiak
c25971bba9 Merge branch '6Feb2020' into 'master'
tawnos_urzas_apprentice.txt UI tweaks ONLY

See merge request core-developers/forge!2500
2020-02-07 04:58:58 +00:00
Tim Mocny
92a11d801c tawnos_urzas_apprentice.txt UI tweaks ONLY 2020-02-07 04:58:57 +00:00
CCTV-1
0ce636c6b4 Merge remote-tracking branch 'upstream/master' 2020-02-07 12:37:45 +08:00
CCTV-1
65969d4ae2 update translation 2020-02-07 12:31:48 +08:00
CCTV-1
0ba3cdfe87 translate mobile achievements title 2020-02-07 12:31:27 +08:00
CCTV-1
5dd0edb317 translate Statistics 2020-02-07 12:30:42 +08:00
CCTV-1
2bb6379232 translate desktop some DragTab 2020-02-07 12:30:06 +08:00
CCTV-1
ebdd532343 translate group 2020-02-07 12:27:57 +08:00
CCTV-1
ac97774639 translate achievement menu 2020-02-07 12:27:38 +08:00
CCTV-1
f6f690ae01 Delve message show exile progress 2020-02-07 12:27:04 +08:00
Michael Kamensky
87e6b38fa5 Merge branch 'patch-8' into 'master'
Update new translations es-ES.properties

See merge request core-developers/forge!2491
2020-02-07 04:09:34 +00:00
Michael Kamensky
2dcc56934d Merge branch 'ashiok' into 'master'
Improve cleanup on ashiok

See merge request core-developers/forge!2490
2020-02-07 04:07:39 +00:00
Michael Kamensky
f5cb80cec5 Merge branch 'magicStackSpellAbilityFix' into 'master'
Magic stack spell ability fix

See merge request core-developers/forge!2501
2020-02-07 04:06:55 +00:00
Hans Mackowiak
1d71b1efea Magic stack spell ability fix 2020-02-07 04:06:54 +00:00
Michael Kamensky
62e206f8ed Merge branch 'effectUntilCounterRemoved' into 'master'
Refactor: Effects with "For as long" it has CounterType

Closes #1271

See merge request core-developers/forge!2494
2020-02-07 04:06:25 +00:00
Hans Mackowiak
0de140538c Refactor: Effects with "For as long" it has CounterType 2020-02-07 04:06:24 +00:00
Michael Kamensky
55167c5dca Merge branch 'master' into 'master'
Fix AI for Domri's Ambush

Closes #1273

See merge request core-developers/forge!2499
2020-02-06 18:17:56 +00:00
Michael Kamensky
9c78dbfde4 Merge branch 'pioneerdeckgenthb' into 'master'
Updated pioneer and standard data for theros metagame

See merge request core-developers/forge!2498
2020-02-06 17:47:15 +00:00
Agetian
0ca0458656 - Fix AI for Domri's Ambush.
- Don't reset targets on DamageDealAi if it's parented to an ability with valid number of targets set.
2020-02-06 20:33:56 +03:00
austinio7116
1b86738d10 Updated pioneer and standard data for theros metagame
(cherry picked from commit 4b503cb)
2020-02-06 11:27:52 +00:00
swordshine
ccfbaf5b3d Merge branch '5Feb2020' into 'master'
2/5/2020 fixes

See merge request core-developers/forge!2497
2020-02-06 09:37:18 +00:00
Tim Mocny
16ecae29f0 2/5/2020 fixes 2020-02-06 09:37:18 +00:00
Michael Kamensky
7a9fb7a4d8 Merge branch '4Feb2020' into 'master'
Today's tweaks

See merge request core-developers/forge!2495
2020-02-05 03:45:14 +00:00
Tim Mocny
aef84aed51 Today's tweaks 2020-02-05 03:45:14 +00:00
klaxnek
a8b1ce3c32 Update es-ES.properties 2020-02-04 20:39:51 +00:00
klaxnek
7dde40beff Update new translations es-ES.properties 2020-02-03 20:15:15 +00:00
Adam Pantel
ccf39adde4 Improve cleanup on ashiok 2020-02-03 14:24:48 -05:00
Michael Kamensky
5b37a6fb53 Merge branch 'rebirth' into 'master'
Rebirth

See merge request core-developers/forge!2487
2020-02-03 16:00:50 +00:00
Tim Mocny
942225291f Rebirth 2020-02-03 16:00:50 +00:00
Michael Kamensky
4787784d15 Merge branch 'master' into 'master'
translate some text and fix Localizer

Closes #1270

See merge request core-developers/forge!2450
2020-02-03 15:05:28 +00:00
Sol
093f157f77 Merge branch 'master' into 'master'
MillAI logic for Rebirth.

See merge request core-developers/forge!2489
2020-02-03 14:55:17 +00:00
Agetian
78f3614c0a - Smaller life threshold for AILogic Rebirth. 2020-02-03 17:49:01 +03:00
Agetian
ae060a1b76 - MillAI logic for Rebirth. 2020-02-03 17:29:46 +03:00
Michael Kamensky
244b3d6d24 Merge branch 'staticKeywordChangeList' into 'master'
refactor Keywords using Chosen Values

See merge request core-developers/forge!2462
2020-02-03 11:35:28 +00:00
Hans Mackowiak
01bf10c719 refactor Keywords using Chosen Values 2020-02-03 11:35:28 +00:00
CCTV-1
5718072f60 fix miss call Localizer.getInstance().getMessage 2020-02-03 19:31:57 +08:00
CCTV-1
1dfd977238 fix compile error 2020-02-03 18:48:30 +08:00
CCTV-1
9030a39d1d update translation 2020-02-03 18:43:10 +08:00
CCTV-1
d74a4143f3 translate mulligan log 2020-02-03 18:42:35 +08:00
CCTV-1
f6509dd30e Merge remote-tracking branch 'upstream/master' 2020-02-03 18:40:13 +08:00
Michael Kamensky
6c512dd451 Merge branch 'allBasicLandType' into 'master'
All basic land type and AdjustLandPlays

See merge request core-developers/forge!2467
2020-02-03 10:09:45 +00:00
Hans Mackowiak
00c83f1d25 All basic land type and AdjustLandPlays 2020-02-03 10:09:45 +00:00
Michael Kamensky
28615040e8 Merge branch '1269-momir-basic-mode-broken' into 'master'
Resolve "Momir Basic Mode Broken"

Closes #1269

See merge request core-developers/forge!2488
2020-02-03 09:44:42 +00:00
Hans Mackowiak
0482d4636b Resolve "Momir Basic Mode Broken" 2020-02-03 09:44:42 +00:00
Michael Kamensky
86de537fcb Merge branch 'keywordLanguageChange' into 'master'
Keyword: fix problems with other languages

See merge request core-developers/forge!2485
2020-02-03 05:03:29 +00:00
Hans Mackowiak
fb7fdb65f2 Keyword: fix problems with other languages 2020-02-03 05:03:29 +00:00
Sol
15c36118d6 Merge branch '2Feb2020' into 'master'
little Elspeth PW deck edition tweak

See merge request core-developers/forge!2486
2020-02-03 02:26:43 +00:00
Tim Mocny
092eae52fe little Elspeth PW deck edition tweak 2020-02-03 02:26:43 +00:00
CCTV-1
ac58058938 escape single quotes 2020-02-03 09:26:58 +08:00
CCTV-1
64117ad1fc update translation 2020-02-02 19:48:56 +08:00
Michael Kamensky
317833af6d Merge branch 'master' into 'master'
Added puzzle PS_THB1 (both variants A and B)

See merge request core-developers/forge!2484
2020-02-02 10:25:30 +00:00
Agetian
54d367ae8c - Added puzzle PS_THB1 (both variants A and B). 2020-02-02 10:36:01 +03:00
CCTV-1
1381de7d55 add comment 2020-02-02 09:14:43 +08:00
CCTV-1
caacde3aad non creature permanent effect translation 2020-02-02 09:14:12 +08:00
CCTV-1
49e55f1326 update translation 2020-02-02 08:48:53 +08:00
CCTV-1
5082da429f log formatter full translation 2020-02-02 08:48:34 +08:00
CCTV-1
ea4e821f51 Merge remote-tracking branch 'upstream/master' 2020-02-02 08:43:42 +08:00
Sol
83c0195648 Merge branch '31Jan2020' into 'master'
Today's tweaks

See merge request core-developers/forge!2483
2020-02-01 03:58:34 +00:00
Tim Mocny
5c465f8bf0 Today's tweaks 2020-02-01 03:58:34 +00:00
Michael Kamensky
c670d175d9 Merge branch 'master' into 'master'
Check to make sure the cards are targetable by AI in DamageDealAi (mandatory).

See merge request core-developers/forge!2481
2020-01-31 14:38:37 +00:00
Agetian
415e2a1623 - Remove the unneeded mandatory parameter. 2020-01-31 16:54:29 +03:00
Agetian
dff5962b8e - Check to make sure the cards are targetable by AI. 2020-01-31 15:05:56 +03:00
Michael Kamensky
d7febae2e1 Merge branch 'master' into 'master'
Improved DamageDealAi and DrawAi

Closes #1267

See merge request core-developers/forge!2480
2020-01-31 10:20:22 +00:00
Michael Kamensky
a757e033d9 Merge branch 'triggerRunParams' into 'master'
Trigger: remove runParams from Trigger

See merge request core-developers/forge!2479
2020-01-31 10:15:31 +00:00
Hans Mackowiak
c3b05157c5 Trigger: remove runParams from Trigger 2020-01-31 10:15:31 +00:00
Agetian
cb3430b806 - Remove the unneeded mandatory check 2020-01-31 13:08:01 +03:00
Agetian
a86dad40c3 - DamageDealAi: target own indestructible stuff when able (if mandatory and has no better targets) 2020-01-31 12:46:32 +03:00
Agetian
04066b9bc2 - Fix DrawAi not accounting for pay costs on trigger 2020-01-31 12:34:05 +03:00
Agetian
6580883ccc - Improved DamageDealAi for mandatory triggers requiring a choice of planeswalker (e.g. Chandra, Artisan of Fire vs. a Hexproof opponent) 2020-01-31 09:58:51 +03:00
CCTV-1
fa30bbe67c Merge remote-tracking branch 'upstream/master' 2020-01-31 09:10:46 +08:00
CCTV-1
e39b70a5d8 update translation 2020-01-31 09:10:29 +08:00
CCTV-1
45f33106f2 display escape exile card progress 2020-01-31 09:10:01 +08:00
Michael Kamensky
415f911e46 Merge branch 'stupidideas' into 'master'
Soul Echo!

See merge request core-developers/forge!2475
2020-01-30 13:19:27 +00:00
Tim Mocny
7b4b869992 Soul Echo! 2020-01-30 13:19:26 +00:00
Michael Kamensky
3d57759d73 Merge branch 'patch-3' into 'master'
Update net-decks.txt adding Current MTGA Decks

See merge request core-developers/forge!2473
2020-01-30 13:15:26 +00:00
Michael Kamensky
ad0bec318f Merge branch '29Jan2020forumfixes' into 'master'
Various fixes reported on forum

See merge request core-developers/forge!2476
2020-01-30 13:12:24 +00:00
Tim Mocny
9571b2695f Various fixes reported on forum 2020-01-30 13:12:24 +00:00
Michael Kamensky
f09bcc4a66 Merge branch 'master' into 'master'
Fix Garruk, Cursed Huntsman achievement definition.

Closes #1262

See merge request core-developers/forge!2477
2020-01-30 13:09:39 +00:00
Agetian
fc424b1bdd - Fix Garruk, Cursed Huntsman achievement definition. 2020-01-30 14:19:13 +03:00
CCTV-1
8a9b7c562c fix lblReturnForLondon translation 2020-01-30 11:00:45 +08:00
CCTV-1
4d9c730f6f make zh-CN reminder text work(update generate script) 2020-01-29 20:16:14 +08:00
CCTV-1
9a1223c228 fix INVALID PROPERTY: 'Report' 2020-01-29 09:58:21 +08:00
CCTV-1
d7787dc974 update translation 2020-01-29 08:12:55 +08:00
CCTV-1
a3f30d899b fix missing prompt translation 2020-01-29 08:12:38 +08:00
Churrufli
ca48e75a9d Update net-decks.txt adding Current MTGA Decks 2020-01-28 22:16:33 +00:00
CCTV-1
e5051d2635 Merge remote-tracking branch 'upstream/master' 2020-01-28 22:34:10 +08:00
Michael Kamensky
c5a6145ed7 Merge branch 'patch-7' into 'master'
Mobile: AI Personality Translation

See merge request core-developers/forge!2454
2020-01-28 13:23:50 +00:00
Michael Kamensky
b2398ec8e0 Merge branch 'thbtranslation' into 'master'
Updated card translations (Theros: Beyond Death)

See merge request core-developers/forge!2471
2020-01-28 13:22:52 +00:00
Michael Kamensky
1b739ab6e5 Merge branch 'fix-thb-edition' into 'master'
Updating edition file until we have extra art ready to download

See merge request core-developers/forge!2465
2020-01-28 13:22:27 +00:00
Michael Kamensky
2e20a88b3b Merge branch '27jan2020' into 'master'
viviens_grizzly.txt fix

See merge request core-developers/forge!2470
2020-01-28 13:21:53 +00:00
Tim Mocny
9d6798e698 viviens_grizzly.txt fix 2020-01-28 13:21:53 +00:00
klaxnek
f3078059b2 Updated card translations (Theros: Beyond Death). Added Italian to script. 2020-01-28 10:05:23 +01:00
CCTV-1
fe2c3c90d6 Merge remote-tracking branch 'upstream/master' 2020-01-28 08:47:21 +08:00
Michael Kamensky
b994bce116 Merge branch 'master' into 'master'
Added puzzle PS_THB0b - Possibility Storm - Theros Beyond Death 00b (Preseason Puzzle 2)

See merge request core-developers/forge!2466
2020-01-26 16:45:38 +00:00
Agetian
f86d6fc2a8 - Added puzzle PS_THB0b. 2020-01-26 13:55:07 +03:00
CCTV-1
747fa3eb3c update translation 2020-01-26 09:17:09 +08:00
CCTV-1
f723f3347a fix INVALID PROPERTY: 'lblAbleToCastAnytingNiceBeing.' 2020-01-26 09:16:56 +08:00
friarsol
8d1367461d Updating edition file until we have extra art ready to download 2020-01-25 19:44:20 -05:00
CCTV-1
3fd3b2d642 update translation 2020-01-25 20:58:08 +08:00
CCTV-1
0f853983c9 translate some Achievements 2020-01-25 20:57:10 +08:00
CCTV-1
1d20aeddda update translation 2020-01-25 13:57:54 +08:00
CCTV-1
ba10aa935a display localization card name/type 2020-01-25 13:57:34 +08:00
CCTV-1
56c63bc6d1 translate some text 2020-01-25 13:54:32 +08:00
CCTV-1
ef70434277 update translation 2020-01-25 10:51:00 +08:00
CCTV-1
313112a488 translate some text 2020-01-25 10:50:39 +08:00
CCTV-1
9030939938 Merge remote-tracking branch 'upstream/master' 2020-01-25 09:20:03 +08:00
Michael Kamensky
c87fdb820b Merge branch 'issue1253' into 'master'
Number of colors matters cards

Closes #1253

See merge request core-developers/forge!2464
2020-01-24 15:21:09 +00:00
Tim Mocny
fd260af645 Number of colors matters cards 2020-01-24 15:21:08 +00:00
CCTV-1
f7904aac2b Merge remote-tracking branch 'upstream/master' 2020-01-24 09:43:40 +08:00
CCTV-1
c338988650 update translation 2020-01-24 09:42:12 +08:00
CCTV-1
07c4e1b57b fix translation lable typo,incorrect use of symbolLookup. 2020-01-24 09:41:38 +08:00
Michael Kamensky
a5b58aa3ae Merge branch 'patch-3' into 'master'
Update nightcreep, added missing RemoveIntrinsicAbilities

See merge request core-developers/forge!2463
2020-01-23 09:13:11 +00:00
Hans Mackowiak
31fc6e3650 Update nightcreep, added missing RemoveIntrinsicAbilities 2020-01-23 09:13:11 +00:00
CCTV-1
75dc2674d6 update translation 2020-01-23 12:54:10 +08:00
CCTV-1
f212cf1dc8 translate SleeveSelector 2020-01-23 12:53:10 +08:00
CCTV-1
0a3f1bf43c Merge remote-tracking branch 'upstream/master' 2020-01-23 12:52:10 +08:00
Michael Kamensky
1039657a82 Merge branch '22Jan2020' into 'master'
thassa_deep_dwelling.txt fix

Closes #1246

See merge request core-developers/forge!2461
2020-01-23 04:37:59 +00:00
Tim Mocny
43299a5298 thassa_deep_dwelling.txt fix 2020-01-23 04:37:59 +00:00
CCTV-1
5f8f82fc93 update Simplified Chinese characters list 2020-01-23 11:51:50 +08:00
CCTV-1
171cc23dba THB card translation 2020-01-23 11:50:12 +08:00
CCTV-1
9e5e05ae3c add ELD Scryfall missing translation 2020-01-23 11:49:55 +08:00
CCTV-1
e67b63375c update translation 2020-01-22 12:52:07 +08:00
CCTV-1
dda23854a3 translate some text 2020-01-22 12:51:44 +08:00
CCTV-1
625673e167 Merge remote-tracking branch 'upstream/master' 2020-01-22 12:48:25 +08:00
swordshine
d8845a413d Merge branch 'removeNoCyclingRule' into 'master'
Remove no cycling rule

See merge request core-developers/forge!2460
2020-01-22 03:43:53 +00:00
Hans Mackowiak
30f80f75df Remove no cycling rule 2020-01-22 03:43:53 +00:00
swordshine
c4c9d5e042 Merge branch 'master' into 'master'
Improve the AI play logic for Lotus Field.

See merge request core-developers/forge!2459
2020-01-22 03:42:08 +00:00
swordshine
b56de30ea2 Merge branch '21Jan2020' into 'master'
Psychic Possession (issue 1239)

Closes #1239

See merge request core-developers/forge!2458
2020-01-22 03:41:37 +00:00
Tim Mocny
2782046bed Psychic Possession (issue 1239) 2020-01-22 03:41:37 +00:00
Agetian
116fa84b16 - Improve the AI play logic for Lotus Field. 2020-01-21 23:02:24 +03:00
Michael Kamensky
bdb10fe59c Merge branch 'master' into 'master'
Added puzzle PS_THB0a - Possibility Storm - Theros Beyond Death 00a (preseason 1)

See merge request core-developers/forge!2457
2020-01-21 17:50:53 +00:00
Agetian
7aa93d61b3 - Added puzzle PS_THB0a. 2020-01-21 20:31:03 +03:00
CCTV-1
74ed34b6dd Merge remote-tracking branch 'upstream/master' 2020-01-21 17:22:43 +08:00
CCTV-1
faf9ace2ab update translation 2020-01-21 17:22:27 +08:00
Michael Kamensky
1602a1e78a Merge branch 'autodownload-expansion' into 'master'
Auto download from Quest WinLose screen

See merge request core-developers/forge!2456
2020-01-21 06:38:01 +00:00
Michael Kamensky
c6b0a0e072 Merge branch 'fixEnumTypes' into 'master'
Use EnumSet in Conditions/Restrictions

See merge request core-developers/forge!2455
2020-01-21 06:37:53 +00:00
Hans Mackowiak
311eaa70e3 Use EnumSet in Conditions/Restrictions 2020-01-21 06:37:53 +00:00
friarsol
659b1c7a63 Auto download from Quest WinLose screen 2020-01-20 21:55:12 -05:00
CCTV-1
c29432cef2 update translation 2020-01-20 23:46:12 +08:00
CCTV-1
7256cc2f8f translate mobile PlanarConquest and other some text 2020-01-20 23:45:49 +08:00
Sol
a9693495d7 Update mystic_sanctuary.txt 2020-01-20 04:22:24 +00:00
CCTV-1
feae4ebf81 fix:charset detect don't work 2020-01-20 11:24:20 +08:00
CCTV-1
e97ca38cbe fix var name wrong 2020-01-20 09:35:06 +08:00
CCTV-1
eff1be31da fix:in desktop,use chinese,if translation text use placeholder strings, getMessage return a garbled string(a string,the content have two encoding) 2020-01-20 09:26:52 +08:00
CCTV-1
9ee07411d0 Merge remote-tracking branch 'upstream/master' 2020-01-20 09:18:20 +08:00
klaxnek
a0e94f2f51 Mobile: AI Personality Translation 2020-01-19 16:09:47 +00:00
CCTV-1
be99725251 fix missing translation 2020-01-19 18:58:41 +08:00
Michael Kamensky
25e9b942b1 Merge branch 'master' into 'master'
Improve ProtectAi for cards that sacrifice themselves as a part of cost payment.

See merge request core-developers/forge!2453
2020-01-19 07:26:13 +00:00
Agetian
ac041a79f6 - Improve ProtectAi for cards that sacrifice themselves as a part of cost payment. 2020-01-19 10:18:01 +03:00
Michael Kamensky
c59d99b8ae Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.32.001 [incremental].

See merge request core-developers/forge!2452
2020-01-19 05:22:28 +00:00
Agetian
3885e02d60 - Preparing Forge for Android publish 1.6.32.001 [incremental]. 2020-01-19 08:11:34 +03:00
CCTV-1
8b432cffd9 update translation 2020-01-19 10:04:25 +08:00
CCTV-1
51e5ce0e17 translate advanced search 2020-01-19 10:04:14 +08:00
CCTV-1
f2f984aff6 Merge remote-tracking branch 'upstream/master' 2020-01-19 10:03:19 +08:00
Blacksmith
a0d8a8a241 Clear out release files in preparation for next release 2020-01-19 00:59:24 +00:00
Blacksmith
b8101d0387 [maven-release-plugin] prepare for next development iteration 2020-01-19 00:54:23 +00:00
Blacksmith
55d02d5adb [maven-release-plugin] prepare release forge-1.6.32 2020-01-19 00:54:18 +00:00
Blacksmith
cf91b69d90 Update README.txt for release 2020-01-19 00:51:26 +00:00
Michael Kamensky
c2fdd86c29 Merge branch 'master' into 'master'
THB basic AI hints, quest precons, achievements, minor fixes + ELD quest precons

See merge request core-developers/forge!2451
2020-01-18 08:10:12 +00:00
Agetian
81af887694 - Enable THB on the Theros plane in Planar Conquest. 2020-01-18 10:47:52 +03:00
Agetian
85ef3aaa23 - Only 3 known booster pack images for ELD 2020-01-18 10:46:00 +03:00
Agetian
c8610da04b - Added quest precons for ELD and THB.
- Fixed a quest precon: Simic Guild Kit.
2020-01-18 10:27:47 +03:00
Agetian
490e204060 - Stylistic correction for an achievement. 2020-01-18 10:27:13 +03:00
Agetian
b2044944ff - THB achievements by Marek14. 2020-01-18 10:26:47 +03:00
Agetian
cbf7cc0b4c - Basic AI hints for THB. Minor card corrections. 2020-01-18 10:26:17 +03:00
CCTV-1
b9dbc14a4d Merge remote-tracking branch 'upstream/master' 2020-01-18 14:06:31 +08:00
CCTV-1
d1364066db update translation 2020-01-18 14:06:02 +08:00
CCTV-1
72d16f0636 translate some text 2020-01-18 14:05:40 +08:00
swordshine
3aa43b8246 Merge branch 'fix-translation' into 'master'
Fix missing translation

See merge request core-developers/forge!2449
2020-01-18 04:59:04 +00:00
Sol
ad288f5303 Merge branch 'thb17janb' into 'master'
THB fixes

See merge request core-developers/forge!2448
2020-01-18 04:21:49 +00:00
Tim Mocny
fcc96cf303 THB fixes 2020-01-18 04:21:48 +00:00
friarsol
ca1504b839 Fix missing translation 2020-01-17 23:20:39 -05:00
Sol
e265cb84cc Merge branch 'thb-formats' into 'master'
Add THB to rotating formats

See merge request core-developers/forge!2447
2020-01-18 03:01:27 +00:00
friarsol
6452189938 Add THB to rotating formats 2020-01-17 21:43:17 -05:00
Sol
3d7bd388e1 Merge branch 'patch-3' into 'master'
Update arena_trickster.txt

See merge request core-developers/forge!2446
2020-01-17 20:56:17 +00:00
Sol
21cfcac0c9 Merge branch 'thb17jan' into 'master'
THB 1/17

See merge request core-developers/forge!2445
2020-01-17 19:34:29 +00:00
Tim Mocny
5eae6acae0 THB 1/17 2020-01-17 19:34:28 +00:00
Sol
1c0cb3a885 Update arena_trickster.txt 2020-01-17 19:33:52 +00:00
Hans Mackowiak
b43fbcfabc Merge branch 'patch-3' into 'master'
Update dreamshaper_shaman.txt

See merge request core-developers/forge!2444
2020-01-17 14:27:07 +00:00
Sol
76146d3c6b Update dreamshaper_shaman.txt 2020-01-17 14:08:36 +00:00
Sol
641a443c82 Merge branch 'migrate-tbd' into 'master'
Migrating Theros Beyond Death

See merge request core-developers/forge!2443
2020-01-17 13:37:39 +00:00
tehdiplomat
e1027ce7ef Migrating Theros Beyond Death 2020-01-17 08:31:28 -05:00
Sol
46422a163b Merge branch 'patch-2' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!2442
2020-01-17 13:20:30 +00:00
Sol
556d8bfd48 Update ANNOUNCEMENTS.txt 2020-01-17 13:15:15 +00:00
swordshine
5b8e709271 Merge branch 'mana-duplication' into 'master'
Maybe fix Mana Reflection mana duplication

See merge request core-developers/forge!2430
2020-01-17 13:09:25 +00:00
Michael Kamensky
6fce5cc5a4 Merge branch 'patch011520' into 'master'
More Oracle updates, Essence of the Wild fix (issue #1234) and Once and Future QOL

Closes #1234

See merge request core-developers/forge!2439
2020-01-17 04:19:39 +00:00
Tim Mocny
b504b60112 More Oracle updates, Essence of the Wild fix (issue #1234) and Once and Future QOL 2020-01-17 04:19:39 +00:00
Michael Kamensky
c8b4e574b8 Merge branch 'thbdraft' into 'master'
Draft Rankings for THB and other settings to allow drafting

See merge request core-developers/forge!2441
2020-01-17 04:19:29 +00:00
austinio7116
32f117c7ec Added draft block, printsheet and booster details 2020-01-16 21:59:42 +00:00
maustin
95d3642d2e Merge branch 'coremaster' into thbdraft 2020-01-16 21:51:55 +00:00
austinio7116
c2ed631327 Merge branch 'thb15' into 'master'
THB 1/15 tweaks and such

See merge request core-developers/forge!2440
2020-01-16 21:49:58 +00:00
Tim Mocny
1f90f4e470 THB 1/15 tweaks and such 2020-01-16 21:49:58 +00:00
austinio7116
d397db9cfb Added draft rankings 2020-01-16 21:42:42 +00:00
swordshine
b5616362b0 Merge branch 'patch-6' into 'master'
Update es-ES.properties

See merge request core-developers/forge!2438
2020-01-16 01:14:41 +00:00
klaxnek
5d2a32c114 Update es-ES.properties 2020-01-15 15:38:43 +00:00
swordshine
5a64b6c297 Merge branch 'master' into 'master'
translate some text

See merge request core-developers/forge!2436
2020-01-15 13:42:36 +00:00
Michael Kamensky
095e720435 Merge branch 'patch-5' into 'master'
Update StaticAbilityContinuous: for Gain Abilities, only set OriginalHost if it wasn't already set

See merge request core-developers/forge!2437
2020-01-15 13:37:15 +00:00
Hans Mackowiak
6e4908acc3 Update StaticAbilityContinuous: for Gain Abilities, only set OriginalHost if it wasn't already set 2020-01-15 13:37:15 +00:00
CCTV-1
b053f79de3 update translation 2020-01-15 20:20:48 +08:00
CCTV-1
33564d023c translate some text 2020-01-15 20:20:25 +08:00
swordshine
57f445b791 Merge branch 'master' into 'master'
update translation

See merge request core-developers/forge!2433
2020-01-15 11:31:57 +00:00
swordshine
f79e3cad2a Merge branch 'patch-5' into 'master'
Update es-ES.properties

See merge request core-developers/forge!2434
2020-01-15 11:31:27 +00:00
swordshine
0d8a2d4a1d Merge branch 'patch' into 'master'
Add Heliod's Punishment

See merge request core-developers/forge!2435
2020-01-15 11:31:21 +00:00
swordshine
2df1770781 Fix a typo in the oracle text 2020-01-15 18:51:47 +08:00
klaxnek
51ec73bdf9 Update es-ES.properties 2020-01-15 10:42:05 +00:00
klaxnek
4299db4041 Update es-ES.properties 2020-01-15 10:41:09 +00:00
swordshine
c3a95a07a1 Add Heliod's Punishment 2020-01-15 18:39:46 +08:00
CCTV-1
38d614a567 update simplified chinese translation 2020-01-15 16:54:28 +08:00
CCTV-1
c0d77a7fdf fix translation key does not match 2020-01-15 16:53:54 +08:00
swordshine
806d62129b Merge branch 'patch' into 'master'
Add three cards

See merge request core-developers/forge!2432
2020-01-15 08:46:47 +00:00
swordshine
dffd0cd62c Add three cards 2020-01-15 16:33:43 +08:00
swordshine
333a96bb8d Merge branch 'patch' into 'master'
Add Hateful Eidolon

See merge request core-developers/forge!2431
2020-01-15 08:30:41 +00:00
swordshine
1aadc7991f Add Hateful Eidolon 2020-01-15 13:12:47 +08:00
swordshine
a41dc4bbd9 Merge branch 'master' into 'master'
translate some text

See merge request core-developers/forge!2422
2020-01-15 04:00:38 +00:00
friarsol
6529e02c83 Maybe fix Mana Reflection mana duplication 2020-01-14 21:12:47 -05:00
swordshine
476c2e4ce3 Merge branch 'patch' into 'master'
Fix The Birth of Meletis

See merge request core-developers/forge!2429
2020-01-15 02:08:41 +00:00
swordshine
706055f1b5 Fix The Birth of Meletis 2020-01-15 09:21:34 +08:00
swordshine
18c964ee3c Merge branch 'thb14' into 'master'
THB 1/14

See merge request core-developers/forge!2423
2020-01-15 00:48:35 +00:00
Tim Mocny
2a6ba11552 THB 1/14 2020-01-15 00:48:35 +00:00
swordshine
ef9fb6ea68 Merge branch 'temp' into 'master'
Hostage Taker wording

See merge request core-developers/forge!2427
2020-01-15 00:47:59 +00:00
swordshine
7055c11d16 Merge branch 'Jan14Oracle' into 'master'
January 14 Oracle Changes

See merge request core-developers/forge!2426
2020-01-15 00:47:28 +00:00
Tim Mocny
b0bc918bc1 January 14 Oracle Changes 2020-01-15 00:47:28 +00:00
Michael Kamensky
bc030355fc Merge branch 'master' into 'master'
Fix references in Sunbird's Invocation.

See merge request core-developers/forge!2428
2020-01-14 18:06:15 +00:00
Agetian
873c748e76 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2020-01-14 20:58:45 +03:00
Agetian
9a987ec7a3 - Fix references in Sunbird's Invocation. 2020-01-14 20:55:08 +03:00
Adam Pantel
b7d2790a8b Hostage Taker wording 2020-01-14 12:07:47 -05:00
swordshine
98c7b47681 Merge branch 'patch' into 'master'
Fix Hero of the Games

See merge request core-developers/forge!2425
2020-01-14 15:58:43 +00:00
swordshine
992c81263a Fix Hero of the Games 2020-01-14 23:53:21 +08:00
Hans Mackowiak
d9e9076fb4 Merge branch 'patch-5' into 'master'
Update Throne of Eldraine.txt

See merge request core-developers/forge!2424
2020-01-14 14:21:35 +00:00
Tim Mocny
938d5259a4 Update Throne of Eldraine.txt 2020-01-14 14:21:35 +00:00
CCTV-1
8d64694ac7 update translation 2020-01-14 13:19:20 +08:00
CCTV-1
1a55341dd3 translate some text 2020-01-14 13:18:43 +08:00
swordshine
3f2d70c315 Merge branch 'patch' into 'master'
Add more cards

See merge request core-developers/forge!2421
2020-01-14 01:54:48 +00:00
swordshine
fe005f3232 Add more cards 2020-01-14 09:46:49 +08:00
Hans Mackowiak
38f573bfce Merge branch 'patch' into 'master'
Add more THB cards

See merge request core-developers/forge!2417
2020-01-14 01:15:22 +00:00
swordshine
efc2d3a8e6 Merge branch 'thb13a' into 'master'
THB 1/13

See merge request core-developers/forge!2420
2020-01-14 01:13:09 +00:00
Tim Mocny
b2f0f0ca84 THB 1/13 2020-01-14 01:13:09 +00:00
swordshine
fd347c10d0 Merge branch 'savant' into 'master'
Arcane Savant and friends

See merge request core-developers/forge!2396
2020-01-14 01:12:09 +00:00
swordshine
0aacc3e2da Merge branch 'patch-5' into 'master'
Update rankle_master_of_pranks.txt

See merge request core-developers/forge!2418
2020-01-14 01:03:20 +00:00
Tim Mocny
fea69dfe06 Update rankle_master_of_pranks.txt 2020-01-14 01:03:20 +00:00
swordshine
e8e45cc378 Add Shadowspear 2020-01-13 23:02:49 +08:00
swordshine
5d6047ca7d Merge branch 'patch' into 'master'
Add more THB cards

See merge request core-developers/forge!2416
2020-01-13 14:37:37 +00:00
swordshine
6ad5e6d974 Add more THB cards 2020-01-13 14:37:37 +00:00
swordshine
82ced80a3e Merge branch 'patch' into 'master'
Add more THB cards

See merge request core-developers/forge!2414
2020-01-13 12:47:52 +00:00
swordshine
79347c0f9c Add more THB cards 2020-01-13 12:47:52 +00:00
swordshine
7b060320b5 Merge branch 'patch-4' into 'master'
Update es-ES.properties. Fixed some translations.

See merge request core-developers/forge!2413
2020-01-13 10:38:49 +00:00
klaxnek
38f4d4aa1b Update es-ES.properties. Fixed some translations. 2020-01-13 10:30:30 +00:00
swordshine
3dc80a8342 Merge branch 'master' into 'master'
translate some text

See merge request core-developers/forge!2412
2020-01-13 08:01:55 +00:00
swordshine
8dbfd9050c Merge branch 'thb10b' into 'master'
THB 1/10!

See merge request core-developers/forge!2406
2020-01-13 07:59:46 +00:00
Tim Mocny
c5604bddac THB 1/10! 2020-01-13 07:59:46 +00:00
CCTV-1
789401ed24 fix:some text translate 2020-01-13 13:44:16 +08:00
CCTV-1
c0d967a467 update translation 2020-01-13 13:34:14 +08:00
CCTV-1
75d49554da translate some text 2020-01-13 13:33:55 +08:00
swordshine
d228429b56 Merge branch 'stacktranslation01' into 'master'
StackTranslation01 - Translate PermanentEffect Card Name

See merge request core-developers/forge!2411
2020-01-13 00:44:14 +00:00
swordshine
9630d1a26b Merge branch 'spanishcardsfinal' into 'master'
Spanish Cards Translation (T..Z)

See merge request core-developers/forge!2410
2020-01-13 00:43:35 +00:00
klaxnek
2922f99ae3 Undo changes 2020-01-12 16:41:06 +01:00
klaxnek
cf7a7177c7 Translate PermanentCreatureEffect Card Name 2020-01-12 16:37:06 +01:00
klaxnek
f5dcbf4e6e Wrong commit 2020-01-12 15:02:03 +01:00
klaxnek
60c946a501 Spanish Cards Translation (T..Z). Fixed some untranslated cards. Finished!!! 2020-01-12 14:58:57 +01:00
Peter
28393d4571 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2020-01-12 14:46:55 +01:00
Michael Kamensky
eacfa96df4 Merge branch 'thb' into 'master'
Whirlwind Denial

See merge request core-developers/forge!2409
2020-01-12 04:40:30 +00:00
Michael Kamensky
576f83b5dc Merge branch 'master' into 'master'
Improve CopyPermanentAi for Bramble Sovereign.

Closes #1231

See merge request core-developers/forge!2408
2020-01-12 04:39:47 +00:00
Adam Pantel
b35ea79083 Whirlwind Denial 2020-01-11 18:20:30 -05:00
Agetian
45f2193e2a - NPE guard. 2020-01-11 16:44:44 +03:00
Agetian
b329786659 - Improve CopyPermanentAi for Bramble Sovereign. 2020-01-11 16:43:20 +03:00
Michael Kamensky
adf181aaec Merge branch 'patch-4' into 'master'
Update seven_dwarves.txt

See merge request core-developers/forge!2407
2020-01-11 04:16:10 +00:00
Sol
a95fff5ae3 Update seven_dwarves.txt 2020-01-11 03:25:58 +00:00
Adam Pantel
f401c3900c Arcane Savant and friends 2020-01-10 18:29:44 -05:00
Michael Kamensky
1f01e2ae16 Merge branch '1228-test-failure-testclonetransform' into 'master'
Resolve "Test failure: testCloneTransform"

Closes #1228

See merge request core-developers/forge!2404
2020-01-10 10:24:07 +00:00
Hans Mackowiak
d5cc3289dc Resolve "Test failure: testCloneTransform" 2020-01-10 10:24:07 +00:00
swordshine
9a0ba159b0 Merge branch 'master' into 'master'
Override getParamOrDefault for the sake of WrappedAbility, fixes Verdurous Gearhulk AI

Closes #1227

See merge request core-developers/forge!2403
2020-01-10 07:47:33 +00:00
Michael Kamensky
71dfe3146b Merge branch 'patch' into 'master'
Add Eidolon of Obstruction

See merge request core-developers/forge!2402
2020-01-10 07:31:00 +00:00
Agetian
9ed01ebbb6 - Override getParamOrDefault for the sake of WrappedAbility, fixes Verdurous Gearhulk AI allocation. 2020-01-10 10:27:30 +03:00
swordshine
0e7af09df3 Add Eidolon of Obstruction 2020-01-10 15:13:26 +08:00
swordshine
3c4844e46d Merge branch 'thb' into 'master'
Fix Dig in Thassas Oracle

See merge request core-developers/forge!2401
2020-01-10 01:11:48 +00:00
swordshine
965b67577a Merge branch 'thb9' into 'master'
THB 1/9

See merge request core-developers/forge!2399
2020-01-10 01:11:28 +00:00
Tim Mocny
8bcb38d4fc THB 1/9 2020-01-10 01:11:28 +00:00
Adam Pantel
071873718e Fix Dig in Thassas Oracle, disallow cancel 2020-01-09 14:16:39 -05:00
Michael Kamensky
7583b67bda Merge branch '1222-exception-with-dfcs-and-copy-effects' into 'master'
Resolve "Exception with DFCs and copy effects"

Closes #1222

See merge request core-developers/forge!2400
2020-01-09 15:32:20 +00:00
Hans Mackowiak
96d3ddf9b5 Resolve "Exception with DFCs and copy effects" 2020-01-09 15:32:20 +00:00
swordshine
dc0ddf542b Merge branch 'temp' into 'master'
Clear controller when leaving battlefield/stack

Closes #619

See merge request core-developers/forge!2397
2020-01-09 14:21:36 +00:00
swordshine
724e483ae3 Merge branch 'patch' into 'master'
Fix Nykthos

See merge request core-developers/forge!2398
2020-01-09 13:06:14 +00:00
swordshine
910fef3ecd Fix Nykthos 2020-01-09 20:59:20 +08:00
Adam Pantel
65288905d0 Clear controller when leaving battlefield/stack 2020-01-08 20:12:13 -05:00
swordshine
82d7171a92 Merge branch 'patch-5' into 'master'
THB 1/8

See merge request core-developers/forge!2395
2020-01-09 00:55:41 +00:00
Tim Mocny
20b51f59b0 Storm Herald - I didn't add AtEOT$ Exile to the animate anticipating some corner case Izzet shenanigans where this card gets flashed in on someone else's turns and the auras last until YOUR next end step. Possible it still can be cleaned up in some way. But this seems correct. 2020-01-09 00:55:41 +00:00
swordshine
16c06c7d7d Merge branch 'thb' into 'master'
Taranika, Thassas Oracle

See merge request core-developers/forge!2393
2020-01-09 00:55:03 +00:00
Adam Pantel
0aa20cb3f4 Taranika, Thassas Oracle 2020-01-08 10:08:59 -05:00
swordshine
71787b7059 Merge branch 'patch' into 'master'
Add Altar of the Pantheon

See merge request core-developers/forge!2392
2020-01-08 10:43:50 +00:00
Michael Kamensky
a9407467a5 Merge branch 'patch-escapeMod' into 'master'
CardFactoryUtil: add Escaped Modifier

See merge request core-developers/forge!2394
2020-01-08 10:18:56 +00:00
Hans Mackowiak
896eb79d2c CardFactoryUtil: add Escaped Modifier 2020-01-08 10:18:56 +00:00
swordshine
fb6f34d67e Merge branch 'spanishcards06' into 'master'
Spanish cards translation (N-O-P-Q-R-S)

See merge request core-developers/forge!2391
2020-01-08 07:33:08 +00:00
Blacksmith
9e9570d191 Clear out release files in preparation for next release 2020-01-08 02:25:33 +00:00
Blacksmith
1b130ab157 [maven-release-plugin] prepare for next development iteration 2020-01-08 02:20:36 +00:00
Blacksmith
74005529f5 [maven-release-plugin] prepare release forge-1.6.31 2020-01-08 02:20:31 +00:00
Blacksmith
4186a365cb Update README.txt for release 2020-01-08 02:18:23 +00:00
swordshine
4366db1acc Add Altar of the Pantheon 2020-01-08 08:42:28 +08:00
klaxnek
4679e00a9e Spanish cards translation (N-O-P-Q-R-S) 2020-01-07 17:32:06 +01:00
Michael Kamensky
51960f0e28 Merge branch 'temp' into 'master'
DigUntil should do nothing on 0

See merge request core-developers/forge!2390
2020-01-07 16:29:43 +00:00
Adam Pantel
a27f69b1c5 DigUntil does nothing on 0 2020-01-07 10:06:33 -05:00
Michael Kamensky
8ab01cce3e Merge branch 'patch' into 'master'
Update Pharika's Spawn using ImmediateTrigger

See merge request core-developers/forge!2388
2020-01-07 11:54:20 +00:00
swordshine
e10235aae9 Remove a cleanup for Atris 2020-01-07 16:48:27 +08:00
swordshine
05591c6bd9 Atris should use targeting 2020-01-07 16:46:16 +08:00
swordshine
a25e469291 Simplify the script of Aphemia, the Cacophony 2020-01-07 14:41:50 +08:00
swordshine
ebd14944c6 Update Pharika's Spawn using ImmediateTrigger 2020-01-07 14:35:23 +08:00
swordshine
1b08fc3592 Merge branch 'patch-5' into 'master'
THB 1/6

See merge request core-developers/forge!2384
2020-01-07 06:29:45 +00:00
Tim Mocny
57457946e5 THB 1/6 2020-01-07 06:29:45 +00:00
Michael Kamensky
918a39ab60 Merge branch 'prerelease-standardization' into 'master'
Prerelease standardization

Closes #520

See merge request core-developers/forge!2379
2020-01-07 05:59:26 +00:00
Sol
2cc39c2580 Prerelease standardization 2020-01-07 05:59:26 +00:00
swordshine
3aca94dc9b Merge branch 'temp' into 'master'
Kiora, Uro

See merge request core-developers/forge!2385
2020-01-07 05:52:40 +00:00
apantel
65ad9d61d9 Kiora, Uro 2020-01-06 23:41:40 -05:00
swordshine
138e3a4661 Merge branch 'bug-fixes' into 'master'
Extracting two bugfixes from Lerio's MR

Closes #1211

See merge request core-developers/forge!2387
2020-01-07 04:12:37 +00:00
Sol
41844ee7e3 Extracting two bugfixes from Lerio's MR 2020-01-07 04:12:37 +00:00
Sol
d4f2594e26 Merge branch 'patch-4' into 'master'
ghireds_belligerence fix damage

See merge request core-developers/forge!2386
2020-01-07 02:02:54 +00:00
Hans Mackowiak
babc9de575 ghireds_belligerence fix damage 2020-01-07 02:02:54 +00:00
Michael Kamensky
11a5683025 Merge branch 'patch-3' into 'master'
Update missing translations in es-ES.properties

See merge request core-developers/forge!2383
2020-01-06 14:42:21 +00:00
Michael Kamensky
b6f8f89c7a Merge branch 'spanishcards05' into 'master'
Spanish cards translation (L and M)

See merge request core-developers/forge!2382
2020-01-06 14:42:16 +00:00
klaxnek
0885fe5898 Update es-ES.properties 2020-01-06 14:14:15 +00:00
klaxnek
8aa1f049ab Update missing translations in es-ES.properties 2020-01-06 11:44:58 +00:00
Peter
f7aa7bf580 Spanish cards translation (L and M) 2020-01-06 11:43:01 +01:00
Michael Kamensky
b74033fe17 Merge branch 'temp' into 'master'
Unneeded SubAbility on Primordial Mist

See merge request core-developers/forge!2380
2020-01-06 06:35:34 +00:00
Michael Kamensky
596296cabf Merge branch 'dashAltFix' into 'master'
Dash: fix keyword after AlternativeCost

See merge request core-developers/forge!2381
2020-01-06 06:35:15 +00:00
Hans Mackowiak
adcd86e7d7 Dash: fix keyword after AlternativeCost 2020-01-06 06:35:14 +00:00
Adam Pantel
308768ae50 Unneeded SubAbility on Primordial Mist 2020-01-05 23:42:31 -05:00
swordshine
235636ca4a Merge branch 'patch' into 'master'
Update more scripts

See merge request core-developers/forge!2376
2020-01-05 08:13:41 +00:00
swordshine
359ce5e39d Update more scripts 2020-01-05 15:54:15 +08:00
swordshine
c6e13e98b3 Merge branch 'patch-9' into 'master'
THB 1/4

See merge request core-developers/forge!2375
2020-01-05 07:52:40 +00:00
Tim Mocny
0cc9687e39 THB 1/4 2020-01-05 07:52:39 +00:00
swordshine
3d59f1832c Allure of the Unknown should reveal first 2020-01-05 14:09:33 +08:00
swordshine
58fdd58e9a Update scripts 2020-01-05 13:29:50 +08:00
swordshine
ea661c4fbb Merge branch 'translation' into 'master'
Keep translation files in sync

See merge request core-developers/forge!2374
2020-01-05 03:08:51 +00:00
Dagin
28abe52106 Keep translation files in sync 2020-01-04 20:23:05 +01:00
swordshine
e689fd8721 Merge branch 'master' into 'master'
fix card name translation

See merge request core-developers/forge!2373
2020-01-04 15:51:00 +00:00
CCTV-1
fea6c85e97 Merge remote-tracking branch 'upstream/master' 2020-01-04 22:25:17 +08:00
CCTV-1
4e80a1b818 get correct localization card name 2020-01-04 22:23:20 +08:00
Michael Kamensky
bdde3520f4 Merge branch 'patch' into 'master'
Update Haktos the Unscarred

See merge request core-developers/forge!2371
2020-01-04 10:21:08 +00:00
swordshine
165ae649b1 Merge branch 'temp' into 'master'
Fix more localization mismatches

See merge request core-developers/forge!2372
2020-01-04 05:57:59 +00:00
Adam Pantel
0536ebf1c8 Fix more localization mismatches 2020-01-03 23:21:13 -05:00
swordshine
fb176abe05 Update Haktos the Unscarred 2020-01-04 12:08:52 +08:00
swordshine
28f0232736 Merge branch 'temp' into 'master'
Mismatched localization labels

See merge request core-developers/forge!2370
2020-01-04 01:18:29 +00:00
swordshine
4c29fd8faf Merge branch 'patch-8' into 'master'
Update the_royal_scions.txt

See merge request core-developers/forge!2368
2020-01-04 01:17:32 +00:00
swordshine
df8d289ee0 Merge branch 'patch-7' into 'master'
Update synthetic_destiny.txt

See merge request core-developers/forge!2367
2020-01-04 01:17:03 +00:00
Tim Mocny
203de48dd4 Update synthetic_destiny.txt 2020-01-04 01:17:03 +00:00
swordshine
97f763b1a0 Merge branch 'patch-6' into 'master'
THB 12/31

See merge request core-developers/forge!2360
2020-01-04 01:15:59 +00:00
Tim Mocny
9fd8969ea5 THB 12/31 2020-01-04 01:15:58 +00:00
Adam Pantel
d70e699c81 Mismatched localization labels 2020-01-03 16:06:01 -05:00
Tim Mocny
39bf8f5313 Update the_royal_scions.txt 2020-01-03 14:58:57 +00:00
swordshine
68eb8e2510 Merge branch 'master' into 'master'
use localization card name in translation text

See merge request core-developers/forge!2357
2020-01-03 13:32:01 +00:00
Michael Kamensky
a20800cfb3 Merge branch 'patch-2' into 'master'
Update es-ES.properties

See merge request core-developers/forge!2366
2020-01-03 13:11:02 +00:00
Michael Kamensky
adce811a3d Merge branch 'devotion-choosecolor' into 'master'
Added a simple logic for ChooseColor based on devotion (Nyx Lotus)

See merge request core-developers/forge!2365
2020-01-03 13:09:27 +00:00
Michael Kamensky
084a7ae73e Added a simple logic for ChooseColor based on devotion (Nyx Lotus) 2020-01-03 13:09:27 +00:00
klaxnek
14a697269b Update es-ES.properties 2020-01-03 11:35:56 +00:00
swordshine
7de8cdee90 Merge branch 'german-translation' into 'master'
Update de-DE.properties from forum

See merge request core-developers/forge!2355
2020-01-03 06:50:43 +00:00
swordshine
20333491f7 Merge branch 'patch-2' into 'master'
it-IT.properties from forum

See merge request core-developers/forge!2363
2020-01-03 06:50:34 +00:00
swordshine
d529c55277 Merge branch 'patch-3' into 'master'
cardnames-it-IT.txt from forum

See merge request core-developers/forge!2364
2020-01-03 06:50:26 +00:00
CCTV-1
9e3bb1ca72 use localization card name 2020-01-03 13:43:17 +08:00
CCTV-1
0caf41f1d6 convert indentation to spaces 2020-01-03 13:33:59 +08:00
CCTV-1
817aadb995 Merge remote-tracking branch 'upstream/master' 2020-01-03 13:32:15 +08:00
Michael Kamensky
c6016c2728 Merge branch 'patch-5' into 'master'
Update visage_of_bolas.txt (typo in line 5)

See merge request core-developers/forge!2359
2020-01-03 04:40:50 +00:00
Tim Mocny
492cab9c06 Update visage_of_bolas.txt (typo in line 5) 2020-01-03 04:40:50 +00:00
Michael Kamensky
64dd84b560 Merge branch 'lbl-error' into 'master'
Fix lblPlayerActivatedCardChooseMode reference

See merge request core-developers/forge!2362
2020-01-03 04:40:30 +00:00
Michael Kamensky
496768b566 Merge branch 'escapeRefactorFlashback' into 'master'
Refactor Escape and AlternativeCost

See merge request core-developers/forge!2361
2020-01-03 04:40:10 +00:00
Hans Mackowiak
b2fcc6e743 Refactor Escape and AlternativeCost 2020-01-03 04:40:09 +00:00
Churrufli
1584fcbb82 cardnames-it-IT.txt 2020-01-02 17:30:29 +00:00
Churrufli
2860111154 it-IT.properties 2020-01-02 17:21:24 +00:00
Dagin Svezek
cfdbb98cf9 Merge branch 'master' into 'german-translation'
# Conflicts:
#   forge-gui/res/languages/de-DE.properties
2020-01-02 12:23:37 +00:00
Dagin Svezek
87ec3a528b Update de-DE.properties from forum 2020-01-02 12:15:17 +00:00
CCTV-1
8ebabd978f add cast check 2020-01-02 12:17:38 +08:00
CCTV-1
51fae70e24 Merge remote-tracking branch 'upstream/master' 2020-01-02 11:51:07 +08:00
CCTV-1
2f0024a8dd rollback unsafe changes 2020-01-02 11:45:38 +08:00
Adam Pantel
cd498e408c Fix lblPlayerActivatedCardChooseMode reference 2020-01-01 21:31:06 -05:00
swordshine
6d193c315e Merge branch 'vs-null' into 'master'
Add null check for Volrath's Shapeshifter

See merge request core-developers/forge!2358
2020-01-01 03:22:26 +00:00
Adam Pantel
c81d9f6bc2 Add null check for Volrath's Shapeshifter 2019-12-31 17:05:29 -05:00
CCTV-1
e13e5d0b16 'reduce the number of words' 2019-12-31 21:37:05 +08:00
CCTV-1
ceb892d610 use localization card name in translation text 2019-12-31 21:16:06 +08:00
swordshine
2690a4d548 Merge branch 'master' into 'master'
update translation text

See merge request core-developers/forge!2351
2019-12-31 06:00:21 +00:00
swordshine
59a8e550d6 Merge branch 'my-branch' into 'master'
3rd try is the charm

See merge request core-developers/forge!2350
2019-12-31 05:59:38 +00:00
CCTV-1
4793425c58 translate ZoneType 2019-12-30 19:08:57 +08:00
CCTV-1
e47ee567bf update translation 2019-12-30 10:35:38 +08:00
CCTV-1
c9f33415e1 translate enum ZoneType 2019-12-30 10:35:16 +08:00
Sol
d1a0c9f1ff Merge branch 'updatedeldstandard' into 'master'
Updated pioneer deckgen data with lots more up-to-date meta data

See merge request core-developers/forge!2353
2019-12-30 01:25:02 +00:00
austinio7116
40b43b00c2 Updated pioneer deckgen data with lots more up-to-date meta data
(cherry picked from commit f490497)

(cherry picked from commit 729dfea)
2019-12-30 01:25:02 +00:00
CCTV-1
cea6d3a9df update simplified chinese translation 2019-12-30 08:48:07 +08:00
CCTV-1
ecda5377a3 Merge remote-tracking branch 'upstream/master' 2019-12-30 08:47:37 +08:00
Northmoc
fb9c7290b2 Tymaret Calls the Dead 2019-12-29 14:05:13 -05:00
Northmoc
5b185d2fe3 fixing Gallia 2019-12-29 12:17:23 -05:00
Northmoc
c4712e705c Gallia the satyr bear :) 2019-12-29 08:31:30 -05:00
Northmoc
d4656b619f Merge branch 'master' of https://git.cardforge.org/core-developers/forge into my-branch 2019-12-29 08:06:37 -05:00
Northmoc
e8c5a58d85 Allure of the Unknown 2019-12-29 08:06:17 -05:00
Dagin Svezek
143cfa04de Update de-DE.properties from forum 2019-12-29 09:45:42 +00:00
austinio7116
ef752c5db6 Pioneer bannings up to Dec 2 2019 2019-12-28 19:23:30 +00:00
CCTV-1
f4ba889c84 update translation 2019-12-28 20:07:03 +08:00
CCTV-1
f20e61520b update translation text to use have placeholder string 2019-12-28 20:06:51 +08:00
CCTV-1
88f082e261 Merge remote-tracking branch 'upstream/master' 2019-12-28 11:18:26 +08:00
Northmoc
6304fa4091 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into my-branch 2019-12-27 18:59:39 -05:00
Northmoc
4b01074d0f Edition update 2019-12-27 09:02:38 -05:00
austinio7116
65c8e47e26 Updated standard deckgen data with lots more up-to-date meta data
(cherry picked from commit f490497)
2019-12-27 14:00:57 +00:00
Northmoc
80c6e30691 The Binding of the Titans 2019-12-27 08:59:54 -05:00
CCTV-1
8cfc922d97 update translation 2019-12-27 15:22:52 +08:00
CCTV-1
92e6c303ad update translation text to use have placeholder string 2019-12-27 15:22:01 +08:00
Northmoc
762dc60600 TBD - card typo fix and card list update 2019-12-26 10:07:18 -05:00
Northmoc
373b81072a Merge branch 'my-branch' of https://git.cardforge.org/Northmoc/forge into my-branch 2019-12-26 09:00:39 -05:00
Northmoc
9bf2d57715 Fix for issue #1219 2019-12-26 13:58:18 +00:00
Northmoc
ef71a7befc Contributor :) 2019-12-26 13:58:18 +00:00
Northmoc
dc34c4e985 Last THB leaks/spoilers 2019-12-26 13:58:18 +00:00
Northmoc
9a495e516a Few more THB 2019-12-26 13:58:18 +00:00
Northmoc
6fcd744132 The Akroan War 2019-12-26 13:58:18 +00:00
Northmoc
70bc280cf1 4 more THB cards 12/20 2019-12-26 13:58:18 +00:00
Northmoc
470fe4b877 Chainweb aracnir - escaping with counters 2019-12-26 13:58:18 +00:00
Northmoc
86f472d29f Chainweb aracnir - escaping with counters 2019-12-26 13:58:18 +00:00
Northmoc
b54ce90df1 S THB cards and some edits 2019-12-26 13:58:18 +00:00
Northmoc
db270d0c7c 3 THB Theme Booster rares 2019-12-26 13:58:18 +00:00
Northmoc
9d5837bb87 3 THB Theme Booster rares 2019-12-26 13:58:18 +00:00
Northmoc
12848af745 3 THB Omens 2019-12-26 13:58:18 +00:00
Northmoc
2d28139ca0 7 THB N creatures (mostly vanilla) 2019-12-26 13:58:18 +00:00
Northmoc
272663dc4a Fixing apostrophes in THB list 2019-12-26 13:58:18 +00:00
Northmoc
d4a47260cb Another round of THB 2019-12-26 13:58:18 +00:00
Northmoc
7023521fb2 Another round of THB 2019-12-26 13:58:18 +00:00
Northmoc
97fe8dc35b Fixing "you may search your library and/or your graveyard" cards so your library isn't auto-searched (and shuffled) 2019-12-26 13:58:18 +00:00
CCTV-1
fb0c0bd807 fix typo 2019-12-26 08:54:20 -05:00
CCTV-1
2285541b6d fix missing translate 2019-12-26 08:54:19 -05:00
CCTV-1
e965b899c0 update translation 2019-12-26 08:54:19 -05:00
CCTV-1
011811d183 translate mobile AssignDamage view 2019-12-26 08:54:19 -05:00
CCTV-1
65efbc57f3 translate dev menu 2019-12-26 08:54:19 -05:00
CCTV-1
437587766b translate pay mana message 2019-12-26 08:54:19 -05:00
CCTV-1
a1fe5c5db1 update interactive message translate 2019-12-26 08:54:19 -05:00
CCTV-1
c44d91281e translate ability/effects all interactive message(in Android because Chinese word wrap doesn't work,do not translate StackDescription for now) 2019-12-26 08:54:19 -05:00
CCTV-1
56fdf15b6f update translation 2019-12-26 08:54:19 -05:00
CCTV-1
19be99d106 translate all confirmPayment message argument 2019-12-26 08:54:19 -05:00
CCTV-1
2e25c83775 translate desktop AddBasicLandDialog.java 2019-12-26 08:54:19 -05:00
CCTV-1
dae91de27e translate "Select Order" 2019-12-26 08:54:19 -05:00
CCTV-1
15424d2fea translate "OK","No" 2019-12-26 08:54:18 -05:00
CCTV-1
cd1d744e1f fix typo 2019-12-26 08:25:06 +08:00
CCTV-1
dc77591571 Merge remote-tracking branch 'upstream/master' 2019-12-26 08:16:43 +08:00
Northmoc
074467e65e Fix for issue #1219 2019-12-25 21:04:50 +00:00
Northmoc
c81f93551e Contributor :) 2019-12-25 21:04:50 +00:00
Northmoc
1f6cbd7d19 Last THB leaks/spoilers 2019-12-25 21:04:50 +00:00
Northmoc
bd35e224a4 Few more THB 2019-12-25 21:04:50 +00:00
Northmoc
ae5986f101 The Akroan War 2019-12-25 21:04:50 +00:00
Northmoc
5cbf5649c0 4 more THB cards 12/20 2019-12-25 21:04:50 +00:00
Northmoc
3da4db3edc Chainweb aracnir - escaping with counters 2019-12-25 21:04:50 +00:00
Northmoc
47121019d4 Chainweb aracnir - escaping with counters 2019-12-25 21:04:50 +00:00
Northmoc
c97b390161 S THB cards and some edits 2019-12-25 21:04:50 +00:00
Northmoc
f97312dcf2 3 THB Theme Booster rares 2019-12-25 21:04:50 +00:00
Northmoc
0eed744018 3 THB Theme Booster rares 2019-12-25 21:04:50 +00:00
Northmoc
655737dcb5 3 THB Omens 2019-12-25 21:04:50 +00:00
Northmoc
488fa4a4dd 7 THB N creatures (mostly vanilla) 2019-12-25 21:04:50 +00:00
Northmoc
8344522e12 Fixing apostrophes in THB list 2019-12-25 21:04:50 +00:00
Northmoc
e1e085d610 Another round of THB 2019-12-25 21:04:50 +00:00
Northmoc
e35904e727 Another round of THB 2019-12-25 21:04:50 +00:00
Northmoc
6dc8d7648a Fixing "you may search your library and/or your graveyard" cards so your library isn't auto-searched (and shuffled) 2019-12-25 21:04:49 +00:00
Agetian
c296b32209 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-12-25 19:36:53 +03:00
Agetian
69f2bb70e8 - Added puzzle PS_ELDS (Superfriends Winter Vacation Puzzle) 2019-12-25 19:35:21 +03:00
Hans Mackowiak
a499e0a551 Combat: copyLastState after damage is applied 2019-12-25 17:25:32 +01:00
Michael Kamensky
bc99962621 Fix a hang in Card.java (e.g. Approach of the Second Sun) 2019-12-25 16:01:26 +00:00
Agetian
bf9b7054b3 - Update the fix. 2019-12-25 18:56:14 +03:00
Agetian
50be973e57 - Fix a hang in Card.java (e.g. Approach of the Second Sun) 2019-12-25 15:34:46 +03:00
CCTV-1
108c39ef7c fix missing translate 2019-12-25 18:42:35 +08:00
CCTV-1
ae6ea42aa9 update translation 2019-12-25 14:07:59 +08:00
CCTV-1
6c4ceccc30 translate mobile AssignDamage view 2019-12-25 14:07:28 +08:00
CCTV-1
fde7d6ff09 translate dev menu 2019-12-25 14:06:59 +08:00
CCTV-1
1af3505d0b translate pay mana message 2019-12-25 14:06:35 +08:00
CCTV-1
047f018da4 update interactive message translate 2019-12-24 11:42:46 +08:00
CCTV-1
a90e9f05e2 translate ability/effects all interactive message(in Android because Chinese word wrap doesn't work,do not translate StackDescription for now) 2019-12-23 22:53:38 +08:00
CCTV-1
7db7e10934 Merge remote-tracking branch 'upstream/master' 2019-12-23 22:39:55 +08:00
Hans Mackowiak
397b340701 Escape: fix Crash when outside of Game 2019-12-21 08:25:42 +00:00
CCTV-1
a050b584ac Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-12-21 12:38:06 +08:00
Myrd
d68c740e1d Use FileSection.parseToMap() from TriggerHandler. 2019-12-20 22:18:00 +00:00
Myrd
b807ce30c4 Merge branch 'dump_state_with_owner' into 'master'
Fix dumping state with cards with non-matching owner/controllers.

See merge request core-developers/forge!2342
2019-12-20 17:56:37 +00:00
Myrd
a4bd13d050 Fix dumping state with cards with non-matching owner/controllers. 2019-12-20 17:56:37 +00:00
Myrd
244960d0d7 Merge branch 'avoid_combat_sim' into 'master'
Avoid combat simulation if the current player has no creatures in play.

See merge request core-developers/forge!2341
2019-12-20 16:57:14 +00:00
Myrd
267c8c6b0d Avoid combat simulation if the current player has no creatures in play. 2019-12-20 16:57:14 +00:00
Myrd
06fc409234 Merge branch 'optimize_param_parsing' into 'master'
Optimize FileSection.parse()/parseMap().

See merge request core-developers/forge!2340
2019-12-20 16:37:31 +00:00
Alexei Svitkine
77ed24a203 Revert changes to GameCopier. 2019-12-20 11:28:11 -05:00
Alexei Svitkine
ed3c519404 Remove game copier logging code. 2019-12-20 11:25:43 -05:00
Myrd
9fcf8e82ef Merge branch 'reland_opts' into 'master'
Optimize some code paths in Forge (card type logic and property get with default).

See merge request core-developers/forge!2339
2019-12-20 16:24:11 +00:00
Alexei Svitkine
dd4df9baaa Optimize FileSection.parse()/parseMap().
This was showing up in profiles with simulation AI. The change
makes constants for the patterns used, so they don't have to be
"compiled" each time and also introduces a cache for these.

With this change, a GameCopier operation is sped up by about 30%
from my local measurement (I tried with a modern deck I have).
2019-12-20 11:22:06 -05:00
Alexei Svitkine
4384b1621b Switch card types lists to sets to avoid costly look ups and
optimize getParamOrDefault() to do a single look up, instead of
two. These were showing up in profiles when using simulation AI.
2019-12-20 11:15:38 -05:00
Myrd
0e1c82a31f Merge branch 'revert-b7c47200' into 'master'
Revert "Merge branch 'master' into 'master'"

See merge request core-developers/forge!2338
2019-12-20 15:53:35 +00:00
Hans Mackowiak
b5babd5451 Merge branch 'vanguard-missing-ability-text' into 'master'
Fix Vanguards etc not displaying abilities

See merge request core-developers/forge!2336
2019-12-20 15:52:18 +00:00
Myrd
5cb8502566 Revert "Merge branch 'master' into 'master'"
This reverts merge request !2334
2019-12-20 15:48:04 +00:00
Myrd
b7c4720030 Merge branch 'master' into 'master'
Optimize some code paths in Forge (card type logic and property get with default).

See merge request core-developers/forge!2334
2019-12-20 15:47:44 +00:00
Michael Kamensky
074243891c Merge branch 'sort_flip_results' into 'master'
Sort coing flips for Krark's Thumb

See merge request core-developers/forge!2335
2019-12-20 05:03:43 +00:00
CCTV-1
1117ff1e7c update translation 2019-12-20 12:36:53 +08:00
CCTV-1
5dd24341e1 translate all confirmPayment message argument 2019-12-20 12:36:30 +08:00
CCTV-1
19d4f36faa translate desktop AddBasicLandDialog.java 2019-12-20 12:34:28 +08:00
CCTV-1
ac9f8e3191 translate "Select Order" 2019-12-20 12:31:32 +08:00
CCTV-1
9d193fb3bb translate "OK","No" 2019-12-20 12:30:18 +08:00
friarsol
c20b0c3620 Fix Vanguards etc not displaying abilities 2019-12-19 23:23:39 -05:00
friarsol
8409a7e6d1 Sort coing flips for Krark's Thumb 2019-12-19 22:43:33 -05:00
Alexei Svitkine
3d59118b94 Use Sets instead of Lists for card types to avoid slow lookups. 2019-12-19 20:49:29 -05:00
Alexei Svitkine
e0fb373b3d Use Java 8's getOrDefault() 2019-12-19 20:48:01 -05:00
swordshine
f0c8deb25e Merge branch 'master' into 'master'
some translate fix

See merge request core-developers/forge!2332
2019-12-19 01:16:42 +00:00
Michael Kamensky
b288c9f61a Merge branch 'Hanmac-master-patch-98814' into 'master'
Spell:checkOtherRestrictions check CantBeCast for changed Cardface

Closes #1198

See merge request core-developers/forge!2333
2019-12-18 11:57:26 +00:00
Hans Mackowiak
823c278cd7 Spell:checkOtherRestrictions check CantBeCast for changed Cardface 2019-12-18 11:57:26 +00:00
Michael Kamensky
ba4ba8d051 Merge branch 'keyword-escape' into 'master'
Keyword: add Escape Mechanic

Closes #1199

See merge request core-developers/forge!2331
2019-12-18 10:38:02 +00:00
Hans Mackowiak
467268c451 Keyword: add Escape Mechanic 2019-12-18 10:38:02 +00:00
CCTV-1
3f1f8321d3 do not translate "for {CR}" 2019-12-18 18:04:50 +08:00
CCTV-1
5730a407c3 Merge remote-tracking branch 'upstream/master' 2019-12-18 17:56:47 +08:00
CCTV-1
22974f8bf4 fix typo 2019-12-18 17:52:29 +08:00
CCTV-1
6414347d91 fix:wrong comment 2019-12-18 17:51:59 +08:00
swordshine
113f891348 Merge branch 'master' into 'master'
translate some text

See merge request core-developers/forge!2328
2019-12-18 09:19:40 +00:00
CCTV-1
cbab3e6000 LoadQuestScreen.java "New" should not be use lblNew 2019-12-18 13:21:32 +08:00
CCTV-1
17663bd2c0 translate mobile quest 2019-12-18 12:56:41 +08:00
CCTV-1
c226a4dbd5 Merge remote-tracking branch 'upstream/master' 2019-12-18 12:44:02 +08:00
Michael Kamensky
0c2d0e6cb6 Merge branch 'puzzle-improvements' into 'master'
Puzzle improvements

See merge request core-developers/forge!2330
2019-12-18 04:30:45 +00:00
friarsol
d63106a71a Save completed puzzles, and sort them to the bottom of the screen 2019-12-17 21:16:17 -05:00
Michael Kamensky
2c26e3f509 Merge branch 'master' into 'master'
Added puzzle PS_ELD9 - Possibility Storm - Throne of Eldraine 09

See merge request core-developers/forge!2329
2019-12-17 14:55:42 +00:00
Agetian
50e0387cda - Fix AI persistent mana in PS_ELD9. 2019-12-17 17:52:17 +03:00
Agetian
b05dc40a1c - Added puzzle PS_ELD9. 2019-12-17 17:50:25 +03:00
CCTV-1
3846be2321 translate some text 2019-12-17 19:49:11 +08:00
swordshine
2fa3179a31 Merge branch 'master' into 'master'
translate InputAttack.java and InputBlock.java

See merge request core-developers/forge!2326
2019-12-17 01:30:07 +00:00
CCTV-1
2617ff339d translate InputAttack.java and InputBlock.java 2019-12-16 20:03:28 +08:00
swordshine
e36311db44 Merge branch 'master' into 'master'
More upcoming THB cards

See merge request core-developers/forge!2324
2019-12-16 07:38:06 +00:00
Michael Kamensky
2449166c36 Merge branch 'patch-6' into 'master'
Update enchanted_carriage: fixed trigger

See merge request core-developers/forge!2325
2019-12-15 06:01:35 +00:00
Hans Mackowiak
eb16486ee6 Update enchanted_carriage: fixed trigger 2019-12-15 06:01:35 +00:00
friarsol
e0c858a3d6 Only split the first colon from Puzzle metadata 2019-12-14 22:21:23 -05:00
Northmoc
71749cef3f More upcoming THB 2019-12-14 16:47:25 -05:00
Northmoc
15839e343e More upcoming THB 2019-12-14 12:50:24 -05:00
Northmoc
9a98b39e94 More upcoming THB 2019-12-13 13:58:46 -05:00
Northmoc
9c6c0f1861 More upcoming THB 2019-12-13 12:24:47 -05:00
Northmoc
318d919111 More upcoming THB 2019-12-12 14:03:12 -05:00
Northmoc
c753a1c875 Merge branch 'master' of https://git.cardforge.org/core-developers/forge
 Conflicts:
	forge-gui/res/cardsfolder/upcoming/moss_viper.txt
2019-12-11 10:57:43 -05:00
Northmoc
e304337a62 More upcoming THB 2019-12-11 10:33:10 -05:00
Michael Kamensky
3768ca8f77 Merge branch 'master' into 'master'
Added puzzle PS_ELD8 - Possibility Storm - Throne of Eldraine 08

See merge request core-developers/forge!2322
2019-12-10 17:26:30 +00:00
Agetian
12f76827e9 - Added puzzle PS_ELD8. 2019-12-10 19:51:41 +03:00
Michael Kamensky
3c5f464039 Merge branch 'master' into 'master'
Set ExiledWith for the LKI copies (fixes Colfenor's Plans)

Closes #1215

See merge request core-developers/forge!2321
2019-12-10 16:43:41 +00:00
Agetian
9f2304b1a5 - Set ExiledWith for the LKI copies (fixes Colfenor's Plans) 2019-12-10 19:35:10 +03:00
swordshine
8a0ba4f27a Merge branch 'patch-5' into 'master'
Update iroas_god_of_victory.txt

See merge request core-developers/forge!2320
2019-12-09 03:55:24 +00:00
Sol
43dc6d35c0 Update iroas_god_of_victory.txt 2019-12-09 03:49:50 +00:00
swordshine
d04c593adc Merge branch 'patch' into 'master'
Update scripts

See merge request core-developers/forge!2319
2019-12-07 10:10:53 +00:00
swordshine
4e1b7e886f Update scripts 2019-12-07 17:52:59 +08:00
Michael Kamensky
8544e805bb Merge branch 'master' into 'master'
More THB: Funeral Rites

See merge request core-developers/forge!2318
2019-12-07 04:34:06 +00:00
klaxnek
7e18cbca97 Undo changes 2019-12-06 20:12:05 +01:00
klaxnek
f5734bb626 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-12-06 18:29:31 +01:00
Northmoc
08823bd94c Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-12-06 09:24:35 -05:00
Northmoc
04cfc7a81f Furious Rise, some "heroics" and a token (THB leaks) 2019-12-06 09:20:42 -05:00
Northmoc
91656fd7c0 Furious Rise, some "heroics" and a token (THB leaks) 2019-12-06 09:16:17 -05:00
Northmoc
e984bd5708 Funeral Rites 2019-12-05 20:05:45 -05:00
swordshine
eb0c0f3f84 Merge branch 'master' into 'master'
More THB cards and a relevant token

See merge request core-developers/forge!2316
2019-12-05 01:28:05 +00:00
klaxnek
acac0ee5e2 Add personal changes 2019-12-04 23:09:03 +01:00
Michael Kamensky
19b7daeaee Merge branch 'master' into 'master'
Added puzzle PS_ELD7 - Possibility Storm - Throne of Eldraine 07

See merge request core-developers/forge!2317
2019-12-04 16:55:30 +00:00
Agetian
c933e722f3 - Added puzzle PS_ELD7. 2019-12-04 19:03:54 +03:00
Northmoc
1536377eb2 Alirios, Enraptured -putting his token in the right spot 2019-12-04 10:27:38 -05:00
Northmoc
a11640cbc9 Alirios, Enraptured and his token 2019-12-03 23:47:03 -05:00
Northmoc
d51fe454b5 Eidolon of Philosophy and Flicker of Fate THB leaks 2019-12-03 19:36:27 -05:00
Michael Kamensky
550fd937f1 Merge branch 'master' into 'master'
THB leaked cards (in upcoming folder!)

See merge request core-developers/forge!2315
2019-12-03 18:57:41 +00:00
Northmoc
bd1add4d47 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-12-03 13:34:02 -05:00
Tim Mocny
944eb38002 dreamstalker_manticore.txt THB leak 2019-12-03 12:31:07 -05:00
Tim Mocny
ddf481f4fd THB leak (upcoming) 2019-12-03 11:35:58 -05:00
Tim Mocny
2e7d84b58f Upload New File 2019-12-03 14:13:31 +00:00
Tim Mocny
db853cb5ba Upload New File 2019-12-03 14:12:46 +00:00
Tim Mocny
d0d652b427 Upload New File 2019-12-03 14:12:15 +00:00
Tim Mocny
231e048936 Upload New File 2019-12-03 14:11:47 +00:00
Tim Mocny
e95982a043 Upload New File 2019-12-03 14:10:52 +00:00
Tim Mocny
1a7b2677f3 Upload New File 2019-12-03 14:10:24 +00:00
Tim Mocny
b77bb5768d Upload New File 2019-12-03 14:09:52 +00:00
Tim Mocny
2be9fc65b1 Delete moss_viper.txt 2019-12-03 14:08:41 +00:00
Tim Mocny
c4e04fe003 Delete hydras_growth.txt 2019-12-03 14:07:56 +00:00
Tim Mocny
964e06b8cb Delete dreamshaper_shaman.txt 2019-12-03 14:07:26 +00:00
Tim Mocny
78d6847db5 Delete dreadful_apathy.txt 2019-12-03 14:07:11 +00:00
Tim Mocny
25d6ce6763 Delete aspect_of_lamprey.txt 2019-12-03 14:06:39 +00:00
Tim Mocny
fc26b5d3a9 Delete arena_trickster.txt 2019-12-03 14:06:04 +00:00
Tim Mocny
9e4dc631e8 Delete ashioks_erasure.txt 2019-12-03 14:04:49 +00:00
Tim Mocny
b6bff03ad3 Upload New File 2019-12-03 02:24:52 +00:00
Tim Mocny
394a365497 Upload New File 2019-12-03 02:24:12 +00:00
Tim Mocny
d5de2f387b Upload New File 2019-12-03 02:20:54 +00:00
Tim Mocny
5106de0abe Upload New File 2019-12-03 02:20:23 +00:00
Tim Mocny
510c81d251 Upload New File 2019-12-03 02:19:28 +00:00
Tim Mocny
b4437636a8 Upload New File 2019-12-03 02:18:38 +00:00
Tim Mocny
cc64997832 Upload New File 2019-12-03 02:17:39 +00:00
swordshine
c35afecce7 Merge branch 'patch' into 'master'
Update scripts by judotrente

See merge request core-developers/forge!2313
2019-12-02 04:26:41 +00:00
swordshine
2d9e8cc2af Update scripts by judotrente 2019-12-02 09:36:50 +08:00
swordshine
a9c4842b96 Merge branch 'spanishcards04' into 'master'
Translated to spanish previously untranslated first 2.000 cards of about 5.000

See merge request core-developers/forge!2312
2019-12-02 01:35:48 +00:00
Peter
c8b21a12ed Translated to spanish previously untranslated first 2.000 cards of about 5.000. Fixed some accutes in previous translation. 2019-12-01 20:08:12 +01:00
swordshine
d0a75c0943 Merge branch 'spanishcards03' into 'master'
Translated to spanish previously untranslated first 1.000 cards of about 5.000.

See merge request core-developers/forge!2310
2019-12-01 04:38:30 +00:00
swordshine
c75d3b2d04 Merge branch 'updatedspanish01' into 'master'
Updated spanish translations

See merge request core-developers/forge!2311
2019-12-01 04:38:19 +00:00
Peter
50d8c03f8b Commited wrong file 2019-11-30 14:45:08 +01:00
Peter
dde3e08e6a Updated spanish translations 2019-11-30 14:39:46 +01:00
Peter
2dd3385849 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into spanishcards03 2019-11-30 14:23:51 +01:00
Peter
bd6cc759c7 Translated to spanish previously untranslated first 1.000 cards. Improved some translations and some of them translated thanks to DeepL.com. Translations based and fixed from www.rebellion.es 2019-11-30 14:23:22 +01:00
Michael Kamensky
39f695f120 Merge branch 'master' into 'master'
Added puzzle PS_ELD6 - Possibility Storm - Throne of Eldraine 06

See merge request core-developers/forge!2309
2019-11-29 19:44:20 +00:00
Agetian
61839df123 - Added puzzle PS_ELD6. 2019-11-29 21:22:08 +03:00
Michael Kamensky
e6b3ec048a Merge branch 'newBranch' into 'master'
Add Unstable Set to ExtendedArt

See merge request core-developers/forge!2308
2019-11-29 13:40:51 +00:00
Anthony Calosa
4fb5e7d305 Add Unstable Set to ExtendedArt 2019-11-29 13:40:25 +08:00
swordshine
8d4a80089e Merge branch 'patch' into 'master'
Game Night 2019 edition file

See merge request core-developers/forge!2307
2019-11-28 09:50:34 +00:00
swordshine
539e321c53 Removed an unused token 2019-11-28 16:53:40 +08:00
swordshine
737700719a Add Game Night 2019 edition file 2019-11-28 16:50:52 +08:00
swordshine
b2bc26142a Update Thoughtbound Phantasm's description 2019-11-28 16:50:52 +08:00
swordshine
9a125bf4f5 Merge branch 'master' into 'master'
Game Night 2019 Mythics

See merge request core-developers/forge!2306
2019-11-28 08:33:01 +00:00
Tim Mocny
b53135d83a Game Night 2019 Mythics 2019-11-28 08:33:00 +00:00
Tim Mocny
86262f3810 Upload New File 2019-11-28 04:51:27 +00:00
Tim Mocny
9237de38df Upload New File 2019-11-28 04:50:48 +00:00
Tim Mocny
18d5d7da27 Delete fiendish_duo.txt 2019-11-28 04:50:14 +00:00
Tim Mocny
cba653d891 Upload New File 2019-11-28 04:47:34 +00:00
Tim Mocny
9ea265625e Update highcliff_felidar.txt 2019-11-28 04:46:58 +00:00
Tim Mocny
d4aa0ecae4 Upload New File 2019-11-28 04:46:02 +00:00
Tim Mocny
bb5ee52133 Upload New File 2019-11-28 04:44:54 +00:00
Tim Mocny
33d5d45d3c Upload New File 2019-11-28 04:42:51 +00:00
swordshine
87bad70939 Merge branch 'master' into 'master'
translate some controller button

See merge request core-developers/forge!2305
2019-11-27 14:25:51 +00:00
CCTV-1
047bc9c5cd remove duplicate keys 2019-11-27 13:36:07 +08:00
CCTV-1
f098e333d2 translate some controller button 2019-11-27 13:32:05 +08:00
swordshine
785835632d Merge branch 'byebyeoko' into 'master'
Updated standard deckgen data - no more ELKs

See merge request core-developers/forge!2304
2019-11-27 01:43:56 +00:00
austinio7116
360b72fd91 Updated standard deckgen data - no more ELKs
(cherry picked from commit 42eafee)
2019-11-26 20:36:59 +00:00
Michael Kamensky
19082049e7 Merge branch 'master' into 'master'
Better AI logic spec for Heraldic Banner

Closes #1207

See merge request core-developers/forge!2302
2019-11-25 16:26:57 +00:00
Agetian
eacc29672f - Better AI logic spec for Heraldic Banner 2019-11-25 19:19:15 +03:00
Agetian
c7b6ac1670 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-11-25 12:40:04 +03:00
swordshine
0aa54cea23 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2300
2019-11-25 05:57:04 +00:00
Michael Kamensky
9fe50f6c66 Merge branch 'newBranch' into 'master'
Fix path seperator, Fix newdeck editor

See merge request core-developers/forge!2301
2019-11-25 05:27:44 +00:00
Anthony Calosa
2bb84cf79f Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-25 13:04:29 +08:00
Anthony Calosa
8d0ade1eab Fix path seperator
(android now works for filtering download if you have existing fullborder cards)

Fix newdeck editor not loading if a user deleted unwanted edition file
(TODO: Don't include setless cards on deck editor...)
2019-11-25 13:01:19 +08:00
CCTV-1
242c7c3b21 update simplified chinese translation 2019-11-25 12:36:07 +08:00
CCTV-1
ff272b89fd added missing translation label 2019-11-25 12:35:13 +08:00
Michael Kamensky
4e83e73dca Merge branch 'master' into 'master'
Update CHANGES.txt

See merge request core-developers/forge!2299
2019-11-24 05:01:49 +00:00
Michael Kamensky
7d1ffa4e90 Update CHANGES.txt 2019-11-24 05:01:49 +00:00
Agetian
aab83d882a - Updating CHANGES.txt, part 2. 2019-11-24 07:56:59 +03:00
Agetian
4f69b673bf Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-11-24 07:54:14 +03:00
Michael Kamensky
7d17e58e1f Merge branch 'newBranch' into 'master'
Update additional check

See merge request core-developers/forge!2298
2019-11-24 04:53:54 +00:00
Agetian
3d6677bbd5 - Update CHANGES.txt. 2019-11-24 07:52:42 +03:00
Anthony Calosa
30d57a5745 Update 2019-11-24 12:35:12 +08:00
Michael Kamensky
2fb2b64d33 Merge branch 'newBranch' into 'master'
Update LQ Downloader

See merge request core-developers/forge!2297
2019-11-24 04:35:01 +00:00
Anthony Calosa
1dc8fed6e8 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-24 12:11:12 +08:00
Anthony Calosa
44c6605804 Update LQ downloader
(dont download full image equivalent to an existing fullborder images)
2019-11-24 12:05:45 +08:00
Michael Kamensky
560f8ac14a Merge branch 'master' into 'master'
Stack Addition Modal Panel

See merge request core-developers/forge!2294
2019-11-23 12:35:48 +00:00
Alessandro Coli
b99dea604d Labels for changes to stack effect notification panel 2019-11-23 12:07:36 +01:00
Alessandro Coli
f3ff419462 Changes for the stack effect notifications - request by Michael Kamensky
@Agetian in merge  request
https://git.cardforge.org/core-developers/forge/merge_requests/2294
2019-11-23 12:05:08 +01:00
Alessandro Coli
d79c2469ec Merge remote-tracking branch 'upstream/master' 2019-11-23 09:44:59 +01:00
swordshine
94de9e7cf2 Merge branch 'fix-broken-start' into 'master'
Fix start crash

See merge request core-developers/forge!2296
2019-11-23 02:40:36 +00:00
Chris H
a9d9c800b8 Fix start crash 2019-11-22 21:02:02 -05:00
swordshine
678d09558c Merge branch 'patch-5' into 'master'
Syr Konrad, the Grim: The Leave the Graveyard Trigger is only for your Graveyard

See merge request core-developers/forge!2295
2019-11-23 01:25:30 +00:00
Hans Mackowiak
831edab34b Syr Konrad, the Grim: The Leave the Graveyard Trigger is only for your Graveyard 2019-11-23 01:25:30 +00:00
Alessandro Coli
5b64b41f21 Merge remote-tracking branch 'upstream/master' 2019-11-22 13:40:18 +01:00
Alessandro Coli
78a5827976 Fixed some code indentations 2019-11-22 08:17:45 +01:00
Michael Kamensky
a9b6faeb7c Merge branch 'remove_some_build_warnings' into 'master'
Remove some build warnings

See merge request core-developers/forge!2219
2019-11-22 04:56:48 +00:00
Ryan1729
bebc58d91d Merge branch 'master' of git.cardforge.org:core-developers/forge into remove_some_build_warnings
# Conflicts:
#	forge-gui-mobile/src/forge/assets/FSkin.java
2019-11-21 10:24:52 -07:00
Alessandro Coli
2c70b8b7e0 End of the stack modal panel implementation, rollback about the Wild
Quests implementation
2019-11-21 16:49:50 +01:00
Alessandro Coli
07d7b7cb58 Merge remote-tracking branch 'upstream/master' 2019-11-21 16:35:45 +01:00
Anthony Calosa
4c80dd3c42 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-20 21:13:35 +08:00
swordshine
0b436479be Merge branch 'spanishcards02' into 'master'
Spanish Cards Translations. Fixed some translations. Translated to Ardent Soldier

See merge request core-developers/forge!2293
2019-11-20 05:11:08 +00:00
swordshine
036cd90516 Merge branch 'master' into 'master'
Update the B&R list (Nov 18, 2019)

See merge request core-developers/forge!2292
2019-11-20 05:10:55 +00:00
Ryan1729
f0076117df respond to code review 2019-11-19 19:38:51 -07:00
klaxnek
f8b4a843c5 Spanish CardS Translations. Fixed some translations. Translated to Ardent Soldier 2019-11-19 22:39:00 +01:00
Agetian
5a24092dc0 - Update the B&R list (Nov 18, 2019) 2019-11-19 16:18:56 +03:00
Michael Kamensky
bf1c32f12a Merge branch 'master' into 'master'
Added puzzle PS_ELD5 - Possibility Storm - Throne of Eldraine 05.

See merge request core-developers/forge!2291
2019-11-19 10:55:15 +00:00
Agetian
f0fb6539ef - Added puzzle PS_ELD5. 2019-11-19 11:59:59 +03:00
swordshine
a85a761bee Merge branch 'spanishcards01' into 'master'
Spanish cards translation: from Abandon Hope to Altar of Bone.

See merge request core-developers/forge!2290
2019-11-19 01:11:05 +00:00
swordshine
2c61dc9a75 Merge branch 'patch-4' into 'master'
Update Deckmasters Garfield vs. Finkel.txt

See merge request core-developers/forge!2289
2019-11-19 01:10:55 +00:00
klaxnek
9516929495 Restore newline at end of file 2019-11-19 01:57:08 +01:00
klaxnek
5350a4c476 Spanish cards translation: from Abandon Hope to Altar of Bone.
Updated spanish card translations from Scryfall.
2019-11-19 01:54:10 +01:00
Alessandro Coli
26dc246c52 Merge remote-tracking branch 'upstream/master' 2019-11-18 13:44:34 +01:00
Anthony Calosa
ad6716f00e Update Deckmasters Garfield vs. Finkel.txt 2019-11-18 07:17:34 +00:00
Hans Mackowiak
dffb63d95f Merge branch 'newBranch' into 'master'
Fix declare attackers

Closes #1205

See merge request core-developers/forge!2288
2019-11-18 04:19:10 +00:00
Anthony Calosa
5069c71dd8 Fix declare attackers 2019-11-18 04:19:10 +00:00
Anthony Calosa
287abb9f37 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-18 12:09:22 +08:00
Anthony Calosa
7f8325fb6c Fix declare attackers 2019-11-18 12:06:59 +08:00
swordshine
6c38674716 Merge branch 'german-translation' into 'master'
german translation update

See merge request core-developers/forge!2287
2019-11-18 00:51:47 +00:00
swordshine
54fdb69e88 Merge branch 'patch-2' into 'master'
Update proteus_staff.txt Remember Target Controller not Owner.

See merge request core-developers/forge!2283
2019-11-18 00:51:30 +00:00
Computica
068cee2326 Update proteus_staff.txt Remember Target Controller not Owner. 2019-11-18 00:51:29 +00:00
Alessandro Coli
e9c2e1034c Merge remote-tracking branch 'upstream/master' 2019-11-17 17:48:03 +01:00
Alessandro Coli
f453c2af78 Labels for the preferences of the new stack addition modal popup 2019-11-17 17:42:51 +01:00
Alessandro Coli
cc3c631cad Introduction of modal popup to notify when something is added to the
stack, including images for cards, complete with sources and targets.
2019-11-17 17:26:31 +01:00
Dagin Svezek
7cfd060ed8 Update de-DE.properties from forum 2019-11-17 09:18:03 +00:00
swordshine
c77f5e9b61 Merge branch 'newBranch' into 'master'
Fix images not loading when missing suffix

See merge request core-developers/forge!2285
2019-11-17 06:46:03 +00:00
swordshine
f18bd75257 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2286
2019-11-17 06:45:58 +00:00
CCTV-1
555a1f8411 update simplified chinese translation 2019-11-17 11:11:41 +08:00
Anthony Calosa
c600dc3b4f Update 2019-11-17 08:10:29 +08:00
Anthony Calosa
0f138a1bf5 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-17 08:06:43 +08:00
Anthony Calosa
1c19f36637 Fix cards like planes/phenomenon not loading an existing images that have .full/.fullborder 2019-11-17 08:02:11 +08:00
Michael Kamensky
d19973208c Merge branch 'newBranch' into 'master'
Add support for "fullborder" cards

See merge request core-developers/forge!2284
2019-11-16 15:20:12 +00:00
Anthony Calosa
0a9078a2ec Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-16 17:51:04 +08:00
Anthony Calosa
bf2368ee44 Update 2019-11-16 17:44:56 +08:00
Anthony Calosa
d0a23fbf14 Add support for ".fullborder" cards
(to differentiate full image cards and full image cards with full borders,
so it will only crop full image cards with full borders)
2019-11-16 17:36:30 +08:00
Michael Kamensky
015f561740 Merge branch 'translation11' into 'master'
Translation: All Abilities Triggers in Stack & Initial GameLogFormatter.

See merge request core-developers/forge!2252
2019-11-16 09:06:27 +00:00
klaxnek
cff4a29f1c Merge branch 'master' of https://git.cardforge.org/core-developers/forge into translation11
 Conflicts:
	forge-gui/res/languages/de-DE.properties
	forge-gui/res/languages/en-US.properties
	forge-gui/res/languages/es-ES.properties
	forge-gui/res/languages/zh-CN.properties
2019-11-16 09:59:06 +01:00
Michael Kamensky
f50ee0ba36 Merge branch 'newBranch' into 'master'
Fix permanents not updating/moving to its row when animated to creature.

See merge request core-developers/forge!2282
2019-11-15 06:04:31 +00:00
Anthony Calosa
fe5d8e537c Fix game pause 2019-11-15 11:14:54 +08:00
Anthony Calosa
d943891e4f additional check (prevent npe on mojhosto) 2019-11-15 10:11:57 +08:00
Anthony Calosa
da3d1d7099 Update 2019-11-15 08:56:35 +08:00
Anthony Calosa
86dd21ae7b Fix permanents not updating when animated to creature. 2019-11-15 06:57:43 +08:00
Hans Mackowiak
2d30184f76 Merge branch 'combatPhaseHandlerFix' into 'master'
Combat: initConstraints before Declare Attackers

See merge request core-developers/forge!2281
2019-11-14 11:12:31 +00:00
Hans Mackowiak
271063934a Combat: initConstraints before Declare Attackers 2019-11-14 11:12:31 +00:00
Alessandro Coli
3fb601adfb Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-11-13 19:23:30 +01:00
swordshine
757e11af42 Merge branch 'patch-8' into 'master'
November 11, 2019 Pioneer Banned Announcement

See merge request core-developers/forge!2280
2019-11-13 00:54:19 +00:00
Hans Mackowiak
7ec12fb58d November 11, 2019 Pioneer Banned Announcement 2019-11-13 00:54:18 +00:00
Hans Mackowiak
6c9cf02884 Merge branch 'newBranch' into 'master'
Fix Amass ability (Woodland Champion and Dreadhorde Invasion)

See merge request core-developers/forge!2279
2019-11-12 12:13:36 +00:00
Anthony Calosa
0c904e208a Add AmassTrigger Test
(If Woodland Champion will trigger from Eternal Skylord Amass Ability)
2019-11-12 19:49:01 +08:00
swordshine
d12a898333 Merge branch 'seven-dwarves' into 'master'
Add 7 Dwarves

See merge request core-developers/forge!2278
2019-11-12 07:52:57 +00:00
Anthony Calosa
0e665dc673 Fix Amass ability (Woodland Champion and Dreadhorde Invasion) 2019-11-12 13:31:16 +08:00
tehdiplomat
02299a0400 Add 7 Dwarves 2019-11-11 14:12:49 -05:00
Michael Kamensky
86d7069626 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.30.001 [incremental].

See merge request core-developers/forge!2277
2019-11-11 05:17:32 +00:00
Agetian
776b865761 - Preparing Forge for Android publish 1.6.30.001 [incremental]. 2019-11-11 08:10:57 +03:00
Blacksmith
a3a4ef22df Clear out release files in preparation for next release 2019-11-11 02:50:48 +00:00
Blacksmith
c2db78baf7 [maven-release-plugin] prepare for next development iteration 2019-11-11 02:45:55 +00:00
Blacksmith
9a30d78f54 [maven-release-plugin] prepare release forge-1.6.30 2019-11-11 02:45:50 +00:00
Blacksmith
db98ce160b Update README.txt for release 2019-11-11 02:43:16 +00:00
Sol
ce8b5b53e0 Merge branch 'update-release-files' into 'master'
Update Release files

See merge request core-developers/forge!2276
2019-11-11 02:32:02 +00:00
Sol
0c4055726c Update ANNOUNCEMENTS.txt 2019-11-11 02:26:43 +00:00
Michael Kamensky
64ae4bae0c Merge branch 'newBranch' into 'master'
Update some GUI elements on Mobile Networkplay

See merge request core-developers/forge!2274
2019-11-10 06:21:46 +00:00
Anthony Calosa
044cc793e8 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-09 21:04:48 +08:00
Alessandro Coli
ca81b2b55c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-11-09 12:59:40 +01:00
Michael Kamensky
e310dc30d7 Merge branch 'pioneerdeckgen' into 'master'
Updated standard deckgen data

See merge request core-developers/forge!2275
2019-11-09 11:41:28 +00:00
Anthony Calosa
f239755249 Fix "controls" when alternating human vs ai, then ai vs ai play on mobile forge,
update refreshfield, update targeting arrows on 3 to 4 players
(shows attacked player on 3/4 player match...)
2019-11-09 19:28:21 +08:00
austinio7116
57686c0554 Updated standard deckgen data
(cherry picked from commit 75f1a60)
2019-11-09 09:04:06 +00:00
Anthony Calosa
5ecde572c3 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-09 06:27:14 +08:00
Anthony Calosa
23e9974950 Update some GUI elements on networkplay -> client 2019-11-09 06:20:13 +08:00
Anthony Calosa
ec98d128f1 prevent npe mojhosto 2019-11-09 06:16:58 +08:00
swordshine
5c07951604 Merge branch 'german-translation' into 'master'
fix typos

See merge request core-developers/forge!2273
2019-11-08 00:43:36 +00:00
Dagin Svezek
7be34625f6 fix typos 2019-11-07 14:03:24 +00:00
Alessandro Coli
f15762b746 Introduction of "wild duels" in quest 2019-11-07 13:26:22 +01:00
Alessandro Coli
e365e78756 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-11-07 13:23:11 +01:00
swordshine
5f6cb893ef Merge branch 'master' into 'master'
Added puzzle PS_ELD4. Added the relevant functionality to GateState and fixed a NPE.

See merge request core-developers/forge!2271
2019-11-07 06:17:25 +00:00
Agetian
3b636be2fe Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-11-07 08:10:19 +03:00
Agetian
1af940b034 - Simpler adventure card detection. 2019-11-07 08:08:03 +03:00
Agetian
8cb1789e60 - Added puzzle PS_ELD4.
- Added OnAdventure functionality to game states.
- Fixed a NPE when dev-adding a card to exile.
2019-11-07 08:06:31 +03:00
Michael Kamensky
01782de3a6 Merge branch 'patch-7' into 'master'
Update de-DE.properties from forum (twosat user)

See merge request core-developers/forge!2270
2019-11-07 04:02:59 +00:00
Michael Kamensky
3a7e35c51d Merge branch 'cardtranslationforgecore' into 'master'
Moved CardTranslation to forge-core.

See merge request core-developers/forge!2253
2019-11-07 04:02:57 +00:00
swordshine
bff24a1d3d Merge branch 'patch-6' into 'master'
Replace sprite_icons.png in darkred skin

See merge request core-developers/forge!2269
2019-11-07 00:52:17 +00:00
swordshine
8a075000a2 Merge branch 'patch-5' into 'master'
Replace bg_splash.png in Darkred skin

See merge request core-developers/forge!2268
2019-11-07 00:52:05 +00:00
Churrufli
5e0761d085 Update de-DE.properties from forum (twosat user) 2019-11-06 23:33:57 +00:00
Churrufli
2184ddf1bb Replace sprite_icons.png in darkred skin 2019-11-06 17:54:06 +00:00
Churrufli
fd032f6ccd Replace bg_splash.png in Darkred skin 2019-11-06 17:52:30 +00:00
Hans Mackowiak
164c819523 Merge branch 'patch-5' into 'master'
Update dread_warlock: added Warlock type

See merge request core-developers/forge!2267
2019-11-06 15:06:41 +00:00
Hans Mackowiak
987043ead2 Update dread_warlock: added Warlock type 2019-11-06 15:06:41 +00:00
swordshine
4aa9c224d0 Merge branch 'pioneerrandomquestworld' into 'master'
Pioneer random quest mode

See merge request core-developers/forge!2266
2019-11-06 08:32:13 +00:00
swordshine
2ac6fa4542 Merge branch 'elddeckgendata' into 'master'
Updated Modern and Standard Deckgen Data

See merge request core-developers/forge!2265
2019-11-06 08:31:48 +00:00
swordshine
2797f95cd3 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2264
2019-11-06 08:31:33 +00:00
austinio7116
5eb9be6248 Pioneer random quest mode 2019-11-06 08:07:21 +00:00
austinio7116
23eebf9037 Updated Modern and Standard Deckgen Data 2019-11-06 06:17:41 +00:00
CCTV-1
b59adab68d added missing translation label 2019-11-06 10:45:44 +08:00
CCTV-1
b2d44105be update simplified chinese translation 2019-11-06 10:44:19 +08:00
swordshine
2235546f2a Merge branch 'translation10' into 'master'
More translations: New menu settings, Search, Priority, PayMana, Discard, Order, Exile, Delve, ...

See merge request core-developers/forge!2251
2019-11-06 01:04:53 +00:00
swordshine
59d104f68b Merge branch 'pioneerdeckgen' into 'master'
Pioneer deckgen

See merge request core-developers/forge!2263
2019-11-06 01:04:07 +00:00
swordshine
6abdfd391d Merge branch '1191-format-pioneer' into 'master'
Resolve "Format: pioneer"

Closes #1191

See merge request core-developers/forge!2250
2019-11-06 01:04:02 +00:00
Hans Mackowiak
a6ff0b5b10 Resolve "Format: pioneer" 2019-11-06 01:04:02 +00:00
austinio7116
02969cfe5b Pioneer archetype deck generation added to UI 2019-11-05 23:02:58 +00:00
austinio7116
c6a2c35850 Pioneer initial meta
(cherry picked from commit af89555)
2019-11-05 22:37:00 +00:00
maustin
4c0a71f37d Merge branch '1191-format-pioneer' of https://git.cardforge.org/core-developers/forge into pioneerdeckgen 2019-11-05 22:36:19 +00:00
Hans Mackowiak
74e3bd1895 Pionier: November 2019 Banned cards 2019-11-05 12:05:34 +00:00
Hans Mackowiak
121c9f5012 add PioneerPredicate to magicDb 2019-11-05 08:36:19 +00:00
Hans Mackowiak
7b1cd816b7 Update formats 2019-11-05 08:25:43 +00:00
Alessandro Coli
02ae8f8108 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-11-05 08:31:54 +01:00
Michael Kamensky
6a76cc8bc6 Merge branch 'newBranch' into 'master'
Update Network and Dependency files

See merge request core-developers/forge!2259
2019-11-04 16:44:48 +00:00
swordshine
9b9c38126e Merge branch '1200-memory-theft-allows-discarding-of-a-land' into 'master'
Resolve "Memory Theft allows discarding of a land"

Closes #1200

See merge request core-developers/forge!2261
2019-11-04 14:26:01 +00:00
Michael Kamensky
e4ee0c768f Merge branch 'ManaPoolHiddenCleanup' into 'master'
ManaPool: no hidden keyword there, so no need for extra cleanup

See merge request core-developers/forge!2262
2019-11-04 13:46:08 +00:00
Hans Mackowiak
340de153c8 ManaPool: no hidden keyword there, so no need for extra cleanup 2019-11-04 13:46:08 +00:00
Hans Mackowiak
2bf477102d Update memory_theft: add nonLand part 2019-11-04 09:42:30 +00:00
Anthony Calosa
42a15b40b3 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-11-04 07:47:27 +08:00
Michael Kamensky
a2589cd433 Merge branch 'patch-5' into 'master'
Update net-decks.txt adding Current Pioneer Decks

See merge request core-developers/forge!2260
2019-11-03 13:49:24 +00:00
Churrufli
7ec7025ed4 Update net-decks.txt adding Current Pioneer Decks 2019-11-03 07:40:41 +00:00
Anthony Calosa
5edeb6df94 removed config (log4j2 uses alternate config via xml) 2019-11-02 10:12:59 +08:00
Anthony Calosa
001a1981cf update log4j 1.2.17 -> log4j 2.11.2
(log4j 2.12.x latest needs higher Android API)
2019-11-02 10:07:13 +08:00
Anthony Calosa
446fb59473 some device are looking for this file so include it on storage
java.io.FileNotFoundException:
/storage/emulated/0/Forge/src/main/resources/log4jConfig.config
(No such file or directory)
2019-11-01 21:42:24 +08:00
Anthony Calosa
3b58d6df42 refactor rename 2019-11-01 17:46:14 +08:00
Anthony Calosa
a80c683901 support android 6 (slow networkplay) tested with two Android 6 device 2019-11-01 17:34:42 +08:00
Anthony Calosa
a5b65eaaed add old de/serialization for android 7.1 and below 2019-11-01 15:03:30 +08:00
Anthony Calosa
31182289b7 Update dependency and use custom de/encoder for netty 2019-11-01 12:41:30 +08:00
Anthony Calosa
85eb740264 aifixes NPE 2019-11-01 12:40:40 +08:00
Anthony Calosa
4318e23a40 support UST extended art 2019-11-01 12:39:57 +08:00
Alessandro Coli
b1b01f2426 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-31 14:10:41 +01:00
Hans Mackowiak
4ca7352d5c Merge branch 'fix-staticabilitycanttarget' into 'master'
Fix StaticAbilityCantTarget check not calling the common routine.

See merge request core-developers/forge!2258
2019-10-29 19:46:37 +00:00
Michael Kamensky
84905bd726 Fix StaticAbilityCantTarget check not calling the common routine. 2019-10-29 19:46:37 +00:00
swordshine
18e16368be Merge branch 'master' into 'master'
Added puzzle PS_ELD3 - Possibility Storm - Throne of Eldraine 03

See merge request core-developers/forge!2257
2019-10-29 07:51:49 +00:00
Agetian
7ed84c4c3f - Added puzzle PS_ELD3. 2019-10-29 09:34:39 +03:00
Michael Kamensky
f334211395 Merge branch 'newBranch' into 'master'
Mobile Forge: Card Sleeves & Round Border Refactor

See merge request core-developers/forge!2255
2019-10-26 14:46:09 +00:00
Alessandro Coli
164ca8541e Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-25 13:41:26 +02:00
Anthony Calosa
42f4126aff Prepare Sleeve for Desktop... 2019-10-25 15:37:13 +08:00
Anthony Calosa
5790e29daa Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-25 14:22:07 +08:00
Anthony Calosa
88a4a2c6cf Update 2019-10-25 14:21:25 +08:00
swordshine
90b72fc11e Merge branch '1194-resolute-rider-has-incorrect-activated-ability-cost' into 'master'
Resolve "Resolute Rider has incorrect activated ability cost"

Closes #1194

See merge request core-developers/forge!2256
2019-10-24 08:46:54 +00:00
Hans Mackowiak
00391df1f0 Fix Resolute Rider 2019-10-24 07:46:00 +00:00
swordshine
15de0c0bba Merge branch 'master' into 'master'
Added puzzle PS_ELD2 - Possibility Storm - Throne of Eldraine 02

See merge request core-developers/forge!2254
2019-10-24 01:00:06 +00:00
Agetian
a2fdce9be9 - Added puzzle PS_ELD2. 2019-10-23 22:42:52 +03:00
klaxnek
fa6fce9589 Moved CardTranslation to forge-core. We need it to translate card info in forge-game. 2019-10-23 11:47:21 +02:00
Anthony Calosa
cc1f03fc94 Update 2019-10-23 12:57:36 +08:00
Anthony Calosa
8b25f6f129 Fix Foil Overlay when Round Border is enabled 2019-10-23 11:57:56 +08:00
Anthony Calosa
b37937421c Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-23 11:52:52 +08:00
klaxnek
df7be19487 Translate Permanent Creature 2019-10-23 00:56:36 +02:00
klaxnek
f17d2bf7fc Translate Trigger Abilities. Finished. 2019-10-23 00:24:15 +02:00
klaxnek
3369db8150 Translated Trigger Abilities (1) 2019-10-22 22:45:03 +02:00
klaxnek
408c9df2df Mobile: Merged duplicated switch 2019-10-22 21:24:13 +02:00
klaxnek
63b6d665a1 Mobile: Merge duplicated case in switch (QuestDraft with Draft) 2019-10-22 21:22:40 +02:00
klaxnek
cfc8b7fb28 Mobile: Translate Minor things 2019-10-22 21:18:30 +02:00
klaxnek
1497345a79 Translate GameLogFormatter. Mulligan and didn't attack 2019-10-22 20:29:50 +02:00
klaxnek
bbd2940b63 Translated scry log 2019-10-22 14:40:03 +02:00
klaxnek
b9c65fb8ee Translated Empty (Stack) 2019-10-22 14:22:03 +02:00
klaxnek
0b37b4e543 Translate Stack text 2019-10-22 14:20:46 +02:00
klaxnek
4c3e4f2170 Translate PlayerControllerHuman.java. Discard, order of cards, delve, exile. 2019-10-22 13:23:57 +02:00
klaxnek
dc12c50c1a Forgot lblCleanupPhase 2019-10-22 12:56:53 +02:00
klaxnek
2b986f5bac Translate PlayerControllerHuman.java. Discard cards 2019-10-22 12:50:15 +02:00
klaxnek
2accf7543e Translated Input Pay Mana. Expanded sentences in order to translate them. 2019-10-22 12:08:28 +02:00
klaxnek
ba37189410 Translate InputPassPriority.java 2019-10-22 11:36:36 +02:00
Hans Mackowiak
d578eee402 Add Pioneer Format 2019-10-22 08:47:00 +00:00
Hans Mackowiak
5107d89ef5 GameFormat: add Píoneer 2019-10-22 08:45:07 +00:00
Hans Mackowiak
72b8b5c98e Update StaticData: are the Predicates even used? 2019-10-22 08:42:12 +00:00
Anthony Calosa
402885391f Card Sleeves 2019-10-22 16:12:03 +08:00
klaxnek
b4d153ab3b Translate Search word in search filters 2019-10-22 09:51:03 +02:00
klaxnek
1a0cb62ac8 Translate Preload Extended Art 2019-10-22 09:42:16 +02:00
klaxnek
c0baf70c59 Translate new Settings menú 2019-10-22 09:37:05 +02:00
swordshine
166cf2623c Merge branch 'master' into 'master'
update Simplified Chinese translation

See merge request core-developers/forge!2249
2019-10-22 06:02:17 +00:00
CCTV-1
8567b69073 update 'Draft, Gauntlet and Puzzle Screens' Simplified Chinese translation 2019-10-22 13:01:37 +08:00
swordshine
3a4271e66d Merge branch 'updatetranslation' into 'master'
update new settings translation

See merge request core-developers/forge!2246
2019-10-22 03:05:25 +00:00
swordshine
8b723aebd9 Merge branch 'master' into 'master'
update BitmapFontWriter.java to latest version

See merge request core-developers/forge!2243
2019-10-22 03:05:18 +00:00
swordshine
eb59d6c86b Merge branch 'translation09' into 'master'
Mobile: Translate Draft, Gauntlet and Puzzle Screens.

See merge request core-developers/forge!2228
2019-10-22 03:05:04 +00:00
Sol
a291b75dd9 Merge branch 'patch-4' into 'master'
Questing Beast: fix Damage Trigger

See merge request core-developers/forge!2247
2019-10-22 00:41:25 +00:00
Hans Mackowiak
f1a76e1e76 Questing Beast: fix Damage Trigger 2019-10-22 00:41:25 +00:00
Sol
a391f7414f Merge branch 'updateBanList' into 'master'
BanList 2019-10-21

See merge request core-developers/forge!2248
2019-10-22 00:40:49 +00:00
Hans Mackowiak
299de54ba5 BanList 2019-10-21 2019-10-22 00:40:49 +00:00
CCTV-1
37bae14dfd update Simplified Chinese characters list 2019-10-19 10:26:43 +08:00
CCTV-1
d780aa43d4 update new settings translation 2019-10-18 18:30:59 +08:00
CCTV-1
91534776d1 convert \t to four spaces,makes the diff able to read 2019-10-17 11:07:00 +08:00
Alessandro Coli
ef82e11c53 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-16 14:10:58 +02:00
swordshine
bec4db6c6d Merge branch '1187-reducecost-with-minmana-does-reduce-to-0-but-shouldn-t' into 'master'
Resolve "ReduceCost with MinMana does reduce to 0, but shouldn't"

Closes #1187

See merge request core-developers/forge!2244
2019-10-16 01:25:33 +00:00
Hans Mackowiak
40b1f89c8f Resolve "ReduceCost with MinMana does reduce to 0, but shouldn't" 2019-10-16 01:25:33 +00:00
swordshine
544301e5ff Merge branch 'elddeckgen' into 'master'
ELD Deckgen Data

See merge request core-developers/forge!2245
2019-10-16 01:24:03 +00:00
austinio7116
ed48bc2e0e ELD Deckgen Data 2019-10-15 19:06:47 +01:00
Hans Mackowiak
b7b9013685 Merge branch 'playerKeywordRework' into 'master'
Player keyword rework

Closes #1179

See merge request core-developers/forge!2233
2019-10-15 11:12:20 +00:00
Hans Mackowiak
06b9dffa55 Player keyword rework 2019-10-15 11:12:20 +00:00
CCTV-1
31bb611ecf update BitmapFontWriter.java to latest version(https://github.com/libgdx/libgdx/blob/master/extensions/gdx-tools/src/com/badlogic/gdx/tools/bmfont/BitmapFontWriter.java) 2019-10-15 18:35:16 +08:00
Michael Kamensky
173c9ac5f6 Merge branch 'master' into 'master'
Added puzzle PS_ELD1 - Possibility Storm - Throne of Eldraine #01

See merge request core-developers/forge!2242
2019-10-15 09:49:05 +00:00
Agetian
ad63987d01 - Added puzzle PS_ELD1. 2019-10-15 07:37:23 +03:00
Michael Kamensky
2c15810833 Merge branch 'isInZoneCleanup' into 'master'
replace .getZone().is with .isInZone, no null check needed

See merge request core-developers/forge!2241
2019-10-14 18:46:43 +00:00
Hans Mackowiak
773df25b53 replace .getZone().is with .isInZone, no null check needed 2019-10-14 18:46:43 +00:00
Michael Kamensky
6e2ac756c9 Merge branch 'newBranch' into 'master'
Rounded Border Highlight

See merge request core-developers/forge!2240
2019-10-14 04:55:11 +00:00
Anthony Calosa
f06994e71e Update 2019-10-14 10:53:48 +08:00
Anthony Calosa
9213b2d987 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-14 10:39:02 +08:00
Anthony Calosa
efa3501172 Rounded Highlight if Round Corners are enabled (and some cleanup)
put on EDT thread pixmap texture conversion
generate zh-CN fonts only when locale is zh-CN
2019-10-14 10:36:53 +08:00
swordshine
c52960eab1 Merge branch 'master' into 'master'
Android:prevent generate excessive font cache for zh_CN

See merge request core-developers/forge!2237
2019-10-14 00:55:25 +00:00
Michael Kamensky
4a6725d228 Merge branch 'AdventureFeatherFix' into 'master'
Adventure as ReplacementEffect

Closes #1144

See merge request core-developers/forge!2239
2019-10-13 18:49:48 +00:00
Hans Mackowiak
20069f95ac Adventure as ReplacementEffect 2019-10-13 18:49:48 +00:00
Michael Kamensky
7562ae9960 Merge branch 'newBranch' into 'master'
Add Border Tint, Update libgdx to Nightly

See merge request core-developers/forge!2235
2019-10-13 18:36:13 +00:00
Alessandro Coli
762481e28a Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-13 17:58:46 +02:00
Anthony Calosa
32621257df update 2019-10-13 17:09:56 +08:00
Anthony Calosa
ff7a8f994c prevent waiting for opponent during assert,
send the exception via sentry
2019-10-13 14:48:49 +08:00
Anthony Calosa
ecbc2f9590 Merge remote-tracking branch 'remotes/core/master' into newBranch
# Conflicts:
#	forge-ai/src/main/java/forge/ai/AiController.java
2019-10-13 14:40:11 +08:00
Michael Kamensky
4a7bb4e08e Merge branch 'verifyTransitivity2' into 'master'
AiController: only do verifyTransitivity when sort failed

See merge request core-developers/forge!2238
2019-10-13 06:36:55 +00:00
Hans Mackowiak
44bcc72662 AiController: only do verifyTransitivity when sort failed 2019-10-13 06:36:55 +00:00
CCTV-1
9115148eab prevent generate excessive font cache for zh_CN 2019-10-13 13:14:05 +08:00
Michael Kamensky
a07158181e Merge branch 'master' into 'master'
Comment out the transitivity test due to lag reasons.

See merge request core-developers/forge!2236
2019-10-13 04:42:16 +00:00
Agetian
7fa461e839 - Comment out the transitivity test due to lag reasons. 2019-10-13 07:36:40 +03:00
Anthony Calosa
fee8a9186a Update Libgdx to 1.9.11 Nightly (build Oct 11, 2019) 2019-10-13 12:17:45 +08:00
Anthony Calosa
d3bad23c99 additional Check 2019-10-13 12:14:42 +08:00
Anthony Calosa
7f0b7780da Modify verifyTransitivity 2019-10-13 11:45:42 +08:00
Anthony Calosa
617403aef6 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-13 08:19:14 +08:00
Alessandro Coli
25194c7abe Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-12 11:07:46 +02:00
Anthony Calosa
81c38449d9 NPE from rarity (dev mode: Put two Nicol Bolas in graveyard, cast animate dead to return 1st Nicol Bolas to play, then cast Rise from the grave to return the 2nd Nicol Bolas to play, then choose the 2nd Nicol Bolas to stay on the battlefield) 2019-10-12 06:09:56 +08:00
Anthony Calosa
fd92993274 adjust thickness 2019-10-12 05:55:14 +08:00
Anthony Calosa
f4d55161b4 Add basic border tint for cards that change color
(Multicolor Cards will have gold tint if they change color..
Wild Mongrel, Prismatic Lace, etc)
2019-10-12 05:53:57 +08:00
Michael Kamensky
fdad359318 Merge branch 'patch-comparator' into 'master'
verifyTransitivity on saComparator

See merge request core-developers/forge!2234
2019-10-11 19:03:15 +00:00
Hans Mackowiak
fb159a6261 verifyTransitivity on saComparator 2019-10-11 19:03:15 +00:00
Alessandro Coli
967af29c47 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-11 18:34:39 +02:00
Michael Kamensky
3ea93ac9b4 Merge branch 'newBranch' into 'master'
Add Support Extended Art

See merge request core-developers/forge!2231
2019-10-11 04:44:21 +00:00
Alessandro Coli
ae9ee57d79 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-10 19:50:02 +02:00
Anthony Calosa
393b419252 Max Font Size for zh-CN 2019-10-10 19:57:58 +08:00
Anthony Calosa
8a18e5ed26 Add Option for Preload 2019-10-10 17:02:05 +08:00
Anthony Calosa
281ee767e0 Preload existing images only 2019-10-10 16:48:18 +08:00
swordshine
0f742201c6 Merge branch 'patch' into 'master'
Fix Seedguide Ash

See merge request core-developers/forge!2232
2019-10-10 07:54:00 +00:00
swordshine
08a3a0baa0 Fix Seedguide Ash 2019-10-10 15:22:40 +08:00
Anthony Calosa
8dc0ea70b5 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-10 15:09:59 +08:00
Anthony Calosa
d071c291ad Added Sprite Border 2019-10-10 15:02:37 +08:00
Anthony Calosa
98e86f17bd Add FPS Display, Add Preload Extended Art, Add Border Images 2019-10-10 14:31:22 +08:00
Anthony Calosa
147b20e5f4 Add FPS Display 2019-10-10 09:41:12 +08:00
Alessandro Coli
17706bd5e4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-09 22:20:15 +02:00
Anthony Calosa
5560a8ab67 Add support for extended art images 2019-10-09 22:10:23 +08:00
Michael Kamensky
7bcba5df37 Merge branch 'newBranch' into 'master'
Add faux smooth round corners (via drawRoundRect with GL_LINE_SMOOTH)

See merge request core-developers/forge!2230
2019-10-09 13:31:01 +00:00
Anthony Calosa
c50fda20d7 Adjust Y to accomodate "Legendary" card design 2019-10-09 16:36:39 +08:00
Anthony Calosa
3842920061 Add faux smooth round corners (via drawRoundRect with GL_LINE_SMOOTH) 2019-10-09 15:42:13 +08:00
Michael Kamensky
5b8e8521d7 Merge branch 'newBranch' into 'master'
Alternative/Faster Round Border

See merge request core-developers/forge!2229
2019-10-09 05:09:25 +00:00
Anthony Calosa
598ea819f1 minor adjustments 2019-10-09 11:47:51 +08:00
Anthony Calosa
289f6e4821 removed unused import 2019-10-09 11:36:26 +08:00
Anthony Calosa
e1daff65ed Refactor Mask/Border on zoomed images 2019-10-09 11:18:19 +08:00
Anthony Calosa
4609b0bb05 Alternative/Faster Round Border 2019-10-09 06:36:34 +08:00
Alessandro Coli
9ed54f726c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-08 14:11:00 +02:00
Michael Kamensky
5ec9413f43 Merge branch 'newBranch' into 'master'
New Faster Cache for Mobile, Add Border Masking Option

See merge request core-developers/forge!2226
2019-10-08 04:49:41 +00:00
Anthony Calosa
ba444373c5 Update code 2019-10-08 10:56:45 +08:00
Anthony Calosa
a8da2882b4 Update description 2019-10-08 08:44:26 +08:00
Anthony Calosa
3928226343 Fix land stacking (should affect creatures and animated lands) 2019-10-08 08:08:37 +08:00
Peter
53c88f0302 Added to contributors XD 2019-10-07 22:40:45 +02:00
Peter
ad1cc78578 Mobile: Translate Draft, Gauntlet and Puzzle Screens.
Fixed crash in LoadGameMenu (wrong translated enum...)
2019-10-07 22:39:00 +02:00
Alessandro Coli
f94a613eef Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-07 13:56:51 +02:00
Anthony Calosa
925b196171 set cache to eternal and disable overhead stats 2019-10-07 19:17:27 +08:00
Anthony Calosa
91a390358e Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-07 19:11:17 +08:00
swordshine
cd239a3286 Merge branch 'patch-4' into 'master'
BlockEffect.java : fix no method String.join, use Lang.joinHomogenous

See merge request core-developers/forge!2227
2019-10-07 10:30:16 +00:00
Hans Mackowiak
0422ec65be BlockEffect.java : fix no method String.join, use Lang.joinHomogenous 2019-10-07 10:30:16 +00:00
Anthony Calosa
daa8b53833 Revert BlockEffect 2019-10-07 16:55:03 +08:00
Anthony Calosa
9b0f9d7a8d Fix blurred Font on non Chinese Language 2019-10-07 15:15:20 +08:00
Anthony Calosa
c012a2f6da Fix blurred Font on non Chinese Language 2019-10-07 14:17:45 +08:00
Anthony Calosa
fbe1e63b1a Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-07 13:19:02 +08:00
Anthony Calosa
87e9c93264 New Faster Cache for Mobile - Cache2k, Add Border Masking Option 2019-10-07 12:59:52 +08:00
Hans Mackowiak
9e959089ac Merge branch 'tweak-disintegrate' into 'master'
Remove a duplicate DB definition in Disintegrate.

See merge request core-developers/forge!2225
2019-10-07 04:56:51 +00:00
Michael Kamensky
e71ef7d629 Merge branch 'replacementEffectHasRun' into 'master'
better Replacement Effect hasRun with ETB and LKI

Closes #1172

See merge request core-developers/forge!2222
2019-10-07 04:50:22 +00:00
Hans Mackowiak
eba9f0d72a better Replacement Effect hasRun with ETB and LKI 2019-10-07 04:50:22 +00:00
Agetian
48c90e3908 - Remove a duplicate DB definition in Disintegrate. 2019-10-07 07:38:38 +03:00
swordshine
d4b2897b49 Merge branch 'patch' into 'master'
Fix three cards

See merge request core-developers/forge!2224
2019-10-07 03:49:11 +00:00
swordshine
79b99afbef Merge branch 'contributors' into 'master'
Contributors

See merge request core-developers/forge!2215
2019-10-07 03:45:30 +00:00
swordshine
c7a1aae06b Merge branch 'deck-editor-unique-filter' into 'master'
Deck editor filters bug

See merge request core-developers/forge!2214
2019-10-07 03:45:17 +00:00
swordshine
131aa8b5a2 Fix Disintegrate 2019-10-07 11:43:38 +08:00
swordshine
748e91d8ac Fix Dance of the Manse and Blow Your House Down 2019-10-07 11:18:32 +08:00
Hans Mackowiak
0bf17333ad Merge branch 'correct_testKalitasNumberOfTokens' into 'master'
Correct kalitas number of tokens test

See merge request core-developers/forge!2223
2019-10-07 02:20:19 +00:00
Ryan Wiedemann
7fcac4944a change assertTrue to assertEquals as suggested by Intellij, so we get better test failure messages 2019-10-07 02:20:19 +00:00
Hans Mackowiak
f2200f23cf Merge branch 'kalitasTokenEffectFix' into 'master'
TokenEffect: fix Cause Key it should be null in some cases

See merge request core-developers/forge!2221
2019-10-06 13:21:38 +00:00
Hans Mackowiak
6ef38fdcfd TokenEffect: fix Cause Key it should be null in some cases 2019-10-06 13:21:38 +00:00
swordshine
67ebfa4ddd Merge branch 'master' into 'master'
supplement ELD card translation and update forge-android support simplified chinese characters

See merge request core-developers/forge!2220
2019-10-06 12:40:46 +00:00
CCTV-1
f43774ead7 update forge-android support simplified chinese characters 2019-10-06 19:42:30 +08:00
CCTV-1
e7588c6ea0 supplement ELD card translation 2019-10-06 19:23:16 +08:00
Alessandro Coli
e6fa89206a Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-06 11:40:00 +02:00
Ryan1729
b010da744c progagate type information through to get rid of warning 2019-10-06 02:13:37 -06:00
Ryan1729
d53eb3a3fe pull all URLDecoder.decode calls into one method and suppress the warning since changing it appears to have broken things before. 2019-10-06 02:00:12 -06:00
Ryan1729
ea25ad2c3b use setVisible(true) instead of show to get rid of the warning 2019-10-06 01:49:06 -06:00
Ryan1729
ac7f34d3f5 Cast to Object as recommended by warning 2019-10-06 01:40:15 -06:00
Ryan1729
4969547938 inline capitalize 2019-10-06 01:36:37 -06:00
Ryan1729
6808be7a42 route all capitalize calls through a new method 2019-10-06 01:33:52 -06:00
Ryan1729
70986149ef do less stuff since we know what the arguments will be. 2019-10-06 01:05:42 -06:00
Ryan1729
bc859b3e52 inline wrap 2019-10-06 00:56:12 -06:00
Ryan1729
eb376b8eb3 pull all still needed WordUtils.wrap calls into one method 2019-10-06 00:55:29 -06:00
swordshine
eb82d454b8 Merge branch 'start_replacement_run_keys_refactor' into 'master'
Start replacement run keys refactor

See merge request core-developers/forge!2175
2019-10-06 06:22:54 +00:00
Ryan1729
33ccc5c21f remove import
...
2019-10-05 23:52:14 -06:00
Ryan1729
5f3a0b3f0b change replacingObjects type 2019-10-05 23:44:22 -06:00
Ryan1729
f6134e3ccf update canReplace method 2019-10-05 22:24:05 -06:00
Michael Kamensky
d294e02b44 Merge branch 'cardTraitsReworkAnimate' into 'master'
Card: CardTraits are now not added to Card/State anymore but uses timestamp

Closes #1165, #1120, #955, and #573

See merge request core-developers/forge!2216
2019-10-05 19:59:28 +00:00
Hans Mackowiak
f32a8d7bb8 Card: CardTraits are now not added to Card/State anymore but uses timestamp 2019-10-05 19:59:28 +00:00
Michael Kamensky
5a13903b34 Merge branch 'master' into 'master'
Added puzzle PS_ELD0 - Possibility Storm - Throne of Eldraine 00 (Pre-release Puzzle)

See merge request core-developers/forge!2217
2019-10-05 11:37:49 +00:00
Michael Kamensky
3af071a531 Merge branch 'adventureZoneCheck' into 'master'
GameAction: better ZoneCheck for Adventure

See merge request core-developers/forge!2218
2019-10-05 11:37:30 +00:00
Hans Mackowiak
937521632d GameAction: better ZoneCheck for Adventure 2019-10-05 11:37:29 +00:00
Agetian
f95cdd6ab4 - Added puzzle PS_ELD0. 2019-10-05 10:51:34 +03:00
Alessandro Coli
9fce28bed7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-04 23:13:19 +02:00
swordshine
dc000318bd Merge branch 'patch-3' into 'master'
Refactor String.join -> StringUtils.join

See merge request core-developers/forge!2213
2019-10-04 03:35:29 +00:00
swordshine
0dbc90817a Merge branch 'patch-2' into 'master'
Prevent NPE casting adventure card as spell

See merge request core-developers/forge!2211
2019-10-04 03:35:07 +00:00
Alessandro Coli
0bcc0e9248 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-03 20:44:18 +02:00
leriomaggio
780343a746 Added myself to the list of contributors 2019-10-03 19:37:29 +01:00
Valerio Maggio
c07230c447 workaround to fix Deck Editor extra space for label 2019-10-03 18:50:37 +01:00
Valerio Maggio
27565d4cc0 fixed bug that was keep on creating filters in deck editor every tab switch (issue 1174) 2019-10-03 18:33:12 +01:00
Valerio Maggio
c6bd5aaaf1 Merge remote-tracking branch 'upstream/master' into ref-base-fork 2019-10-03 18:10:26 +01:00
Anthony Calosa
90e2c08e75 Refactor String.join -> StringUtils.join 2019-10-03 13:54:34 +00:00
swordshine
3c2eac78d6 Merge branch 'patch' into 'master'
Fix Tome of Legends

See merge request core-developers/forge!2212
2019-10-03 12:58:19 +00:00
swordshine
92077f1647 Fix Tome of Legends 2019-10-03 20:47:13 +08:00
Michael Kamensky
3b47b51bb7 Merge branch 'newBranch' into 'master'
Manaicons update

See merge request core-developers/forge!2210
2019-10-03 07:18:21 +00:00
Anthony Calosa
c9c27faf8f Prevent NPE casting adventure card as spell 2019-10-03 05:45:44 +00:00
Anthony Calosa
ed5d654ac3 Rounded edges a little 2019-10-03 13:06:16 +08:00
Anthony Calosa
353263f936 Add slight drop shadow 2019-10-03 13:00:34 +08:00
swordshine
cecf532da8 Merge branch 'german-translation' into 'master'
german translation update

See merge request core-developers/forge!2209
2019-10-03 03:15:09 +00:00
Anthony Calosa
5c9edece87 Reduce edge aliasing 2019-10-02 23:38:29 +08:00
Alessandro Coli
aecee3cea2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-02 13:30:06 +02:00
Dagin Svezek
677c19ca80 german translation update 2019-10-02 05:53:04 +00:00
Michael Kamensky
7b6543e7fa Merge branch 'staticEffectCleanup' into 'master'
StaticEffect: cleanup old methods

See merge request core-developers/forge!2208
2019-10-02 05:06:15 +00:00
Hans Mackowiak
9fefaa58fc StaticEffect: cleanup old methods 2019-10-02 05:06:15 +00:00
swordshine
297b7e9728 Merge branch 'patch' into 'master'
Fix Rowan, Fearless Sparkmage

See merge request core-developers/forge!2207
2019-10-02 02:50:55 +00:00
swordshine
873d4dfc0a Fix Rowan, Fearless Sparkmage 2019-10-02 10:45:58 +08:00
Michael Kamensky
e2f7358970 Merge branch 'newBranch' into 'master'
Upscale some sprites

See merge request core-developers/forge!2201
2019-10-01 17:34:05 +00:00
Michael Kamensky
d2666caf73 Merge branch 'master' into 'master'
No need to separately add the Food card by name to AI sac preferences.

See merge request core-developers/forge!2206
2019-10-01 17:30:39 +00:00
Agetian
6e906888cb - No need to separately add the Food card by name to AI sac preferences. 2019-10-01 20:22:21 +03:00
Alessandro Coli
3432b9fdcd Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-01 18:56:14 +02:00
Anthony Calosa
72ab3cc690 adjust spacing - rendered icons 2019-10-01 21:47:53 +08:00
Anthony Calosa
7a614352bd Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-01 20:13:51 +08:00
swordshine
5ccc6ca10f Merge branch 'patch' into 'master'
Update some cards

See merge request core-developers/forge!2204
2019-10-01 09:04:03 +00:00
swordshine
5f9f22ddab Update 5 scripts 2019-10-01 16:56:46 +08:00
swordshine
aa75871aae Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2205
2019-10-01 08:47:42 +00:00
CCTV-1
d405fd7ae6 update simplified chinese translation 2019-10-01 16:31:43 +08:00
CCTV-1
eb05ce8da7 Merge remote-tracking branch 'upstream/master' 2019-10-01 16:11:06 +08:00
swordshine
af2ac7e611 Fix Rohgahh of Kher Keep 2019-10-01 16:02:54 +08:00
Anthony Calosa
bf5f581cf6 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-01 14:28:38 +08:00
Anthony Calosa
1345bbe671 Revert to allow merge 2019-10-01 14:18:04 +08:00
swordshine
e998eb379e Merge branch 'eld-ai-hints' into 'master'
Fix a couple AI hints for Throne of Eldraine, add some more hints

See merge request core-developers/forge!2202
2019-10-01 06:16:21 +00:00
Michael Kamensky
b01c4220d2 Fix a couple AI hints for Throne of Eldraine, add some more hints 2019-10-01 06:16:21 +00:00
swordshine
474e7f42d9 Merge branch 'translation08' into 'master'
Translated strings related to Win/Lose/Concede

See merge request core-developers/forge!2197
2019-10-01 06:16:08 +00:00
swordshine
11c3e17c98 Merge branch 'patch' into 'master'
Fix two cards

See merge request core-developers/forge!2203
2019-10-01 06:12:20 +00:00
swordshine
f3206bfe27 Fix two cards 2019-10-01 14:02:44 +08:00
Anthony Calosa
91674ef0b2 Seperate some Sprite Icons, Upscaled sprite_planar_conquest,
added some ability icons, Enabled texture filter on some textures
2019-10-01 13:41:52 +08:00
Anthony Calosa
a939a8a042 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-10-01 11:27:54 +08:00
Anthony Calosa
c988ecfefa fix guttergrime 2019-10-01 09:46:05 +08:00
Michael Kamensky
059264c2f9 Merge branch 'eld-ai-hints' into 'master'
Throne of Eldraine AI hints

See merge request core-developers/forge!2198
2019-09-30 18:50:12 +00:00
Michael Kamensky
4e48ffbd20 Throne of Eldraine AI hints 2019-09-30 18:50:12 +00:00
Anthony Calosa
11c8dd0f44 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-30 19:48:36 +08:00
Peter
e869c6ac6b Remove unused imports 2019-09-30 11:35:18 +02:00
Peter
17fabb0bec Translated strings related to Win/Loose/Concede 2019-09-30 11:25:27 +02:00
CCTV-1
88448366d5 Merge remote-tracking branch 'upstream/master' 2019-09-30 16:21:22 +08:00
swordshine
116ab5da29 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2188
2019-09-30 07:26:25 +00:00
swordshine
37d0d52d51 Merge branch 'eldtranslation' into 'master'
Updated Throne of Eldraine card translations

See merge request core-developers/forge!2194
2019-09-30 07:25:35 +00:00
Michael Kamensky
264a7e7b23 Merge branch '1169-sedge-sliver-isn-t-working-correct-with-pt-boost' into 'master'
Resolve "Sedge Sliver isn't working correct with PT boost"

Closes #1169

See merge request core-developers/forge!2196
2019-09-30 04:55:08 +00:00
CCTV-1
37f33f1c07 Merge remote-tracking branch 'upstream/master' 2019-09-30 08:09:02 +08:00
Hanmac
3c3a7f3f62 GameAction: ignore isTemporary StaticAbilities 2019-09-29 22:03:23 +02:00
Michael Kamensky
cf2811132a Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.29.001

See merge request core-developers/forge!2195
2019-09-29 15:54:18 +00:00
Jamin W. Collins
59b01aba8f - Preparing Forge for Android publish 1.6.29.001
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2019-09-29 08:54:32 -06:00
Peter
608d84dc4d Updated Throne of Eldraine card translations 2019-09-29 14:00:35 +02:00
Alessandro Coli
8bde4d5f92 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-29 09:29:19 +02:00
Blacksmith
821f95f483 Clear out release files in preparation for next release 2019-09-29 00:29:38 +00:00
Blacksmith
d028cd2918 [maven-release-plugin] prepare for next development iteration 2019-09-29 00:23:27 +00:00
Blacksmith
4803d74c33 [maven-release-plugin] prepare release forge-1.6.29 2019-09-29 00:23:21 +00:00
Blacksmith
403d3a6aec Update README.txt for release 2019-09-29 00:20:17 +00:00
Sol
521a3c3b7b Merge branch '1157-questing-beast-and-damage-prevention' into 'master'
Resolve "Questing Beast and Damage Prevention"

Closes #1157

See merge request core-developers/forge!2183
2019-09-29 00:03:10 +00:00
Hans Mackowiak
398796999f Resolve "Questing Beast and Damage Prevention" 2019-09-29 00:03:10 +00:00
Hans Mackowiak
f347786f3d Merge branch 'enchanged-carriage-stats' into 'master'
Power/toughness for Enchanted Carriage

See merge request core-developers/forge!2191
2019-09-28 17:03:11 +00:00
Hans Mackowiak
52843a3ba6 Merge branch 'resolute-rider-text-fix' into 'master'
Text fix for Resolute Rider

See merge request core-developers/forge!2192
2019-09-28 17:02:58 +00:00
Hans Mackowiak
ce3546393a Merge branch 'irencrag-pyromancer-trigger-fix' into 'master'
Fix for Irencrag Pyromancer trigger

See merge request core-developers/forge!2193
2019-09-28 17:02:00 +00:00
Brock Fanning
5b8ab80cb0 Fix for Irencrag Pyromancer trigger 2019-09-28 11:57:47 -04:00
Brock Fanning
9ee5989553 Text fix for Resolute Rider 2019-09-28 11:43:55 -04:00
Brock Fanning
2a55122e21 Power/toughness for Enchanted Carriage 2019-09-28 11:41:13 -04:00
Sol
fc4828a2b3 Merge branch 'eldOracle' into 'master'
Eld Oracle

See merge request core-developers/forge!2190
2019-09-28 11:44:50 +00:00
CCTV-1
152693655f update ELD cards translation 2019-09-28 18:50:15 +08:00
Hanmac
00aea6e647 cards: update Noble creature Type 2019-09-28 12:46:32 +02:00
Hanmac
74558a88cd some cards got their effect reverted 2019-09-28 12:36:05 +02:00
Hanmac
bde30f4eb7 cards: update Xantcha and other enter under opponents control 2019-09-28 12:35:05 +02:00
Valerio Maggio
1f23097910 Merge remote-tracking branch 'upstream/master' 2019-09-28 11:09:57 +01:00
Michael Kamensky
2d86d240a7 Merge branch 'master' into 'master'
Add ELD achievements by Marek14.

See merge request core-developers/forge!2189
2019-09-28 08:26:11 +00:00
Agetian
a59b911c56 - Add ELD achievements by Marek14. 2019-09-28 10:14:41 +03:00
CCTV-1
1d44d02ac1 update simplified chinese translation 2019-09-28 12:07:41 +08:00
Sol
406c82c5a2 Merge branch 'throne-edition-updates' into 'master'
ELD updates

See merge request core-developers/forge!2187
2019-09-28 02:32:00 +00:00
Sol
9512728374 Merge branch 'migrate-upcoming-throne' into 'master'
Migrate throne

See merge request core-developers/forge!2186
2019-09-28 02:23:58 +00:00
Chris H
fc676f25d7 ELD updates 2019-09-27 22:23:35 -04:00
Chris H
fc8d235529 Migrate throne 2019-09-27 21:54:10 -04:00
swordshine
7e7951d567 Merge branch 'abilitytranslation' into 'master'
Translated new settings option 'Ability Icons'

See merge request core-developers/forge!2184
2019-09-28 00:45:06 +00:00
swordshine
ffc7567081 Merge branch 'patch-1' into 'master'
Update volatile_claws.txt - All Creature Types didn't happen...

See merge request core-developers/forge!2185
2019-09-28 00:43:36 +00:00
Computica
b2f5b55c0e Update volatile_claws.txt - All Creature Types didn't happen... 2019-09-27 23:39:07 +00:00
Ryan1729
a3355ba05a remove imports 2019-09-27 17:27:36 -06:00
Ryan1729
4728b5ad76 Merge branch 'master' of git.cardforge.org:core-developers/forge into start_replacement_run_keys_refactor 2019-09-27 17:17:26 -06:00
Ryan1729
df4b0b03b9 remove runOld and getReplacementListOld 2019-09-27 17:13:44 -06:00
Peter
7bb4e8f6d2 Translated new settings option 'Ability Icons' 2019-09-27 19:46:38 +02:00
Anthony Calosa
beec859cec Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-27 21:04:13 +08:00
Hans Mackowiak
939a902f43 Merge branch 'newBranch' into 'master'
Add feature request

See merge request core-developers/forge!2179
2019-09-27 12:16:07 +00:00
Anthony Calosa
6551ebcce5 Add feature request
Can duplicate tokens with summoning sickness not be in same pile as
tokens without it OR the ones without it be on the top? It's really
annoying on Android to equip/enchant a token that can attack this turn
(need to zoom in, then out).
(https://www.slightlymagic.net/forum/viewtopic.php?f=26&t=1516&start=2190#p230560)
2019-09-27 12:16:07 +00:00
Anthony Calosa
77d6bde4e5 Moved fireevent on changekeywords 2019-09-27 20:00:24 +08:00
Anthony Calosa
3ae7887cb8 Update 3 2019-09-27 19:28:17 +08:00
Anthony Calosa
98ce8e6a1e Update 2019-09-27 19:14:38 +08:00
Anthony Calosa
454e0e2c48 Update code 2019-09-27 18:56:52 +08:00
Ryan1729
a3b0d8ac3c do the remaining easy repRunParams changeovers 2019-09-27 01:25:04 -06:00
Anthony Calosa
8ee9d3ff13 Update stacking, works with blessed breath on bunch of tokens 2019-09-27 14:52:34 +08:00
Anthony Calosa
2f6b204005 Update token stacking on phases 2019-09-27 09:29:55 +08:00
Anthony Calosa
b1678390cd Removed tapped stacking, it doesn't work all the time 2019-09-27 08:56:26 +08:00
Anthony Calosa
fa8abb6d7c We need to pass it as a list to update correctly 2019-09-27 08:37:43 +08:00
Anthony Calosa
4fe152efb4 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-27 07:02:41 +08:00
Anthony Calosa
5e90679d76 Refactor Event 2019-09-27 06:46:40 +08:00
swordshine
2d32369082 Merge branch 'patch' into 'master'
Fix Garenbrig Carver

See merge request core-developers/forge!2182
2019-09-26 16:02:06 +00:00
swordshine
ec96e1f0c1 Fix Garenbrig Carver 2019-09-26 23:57:20 +08:00
swordshine
c55c083ca2 Merge branch 'patch' into 'master'
Fix Fae of Wishes

See merge request core-developers/forge!2181
2019-09-26 15:23:09 +00:00
swordshine
cba9366b14 Fix Fae of Wishes 2019-09-26 23:10:23 +08:00
swordshine
c16014bb93 Merge branch 'patch' into 'master'
Fix Midnight Clock

See merge request core-developers/forge!2180
2019-09-26 14:43:39 +00:00
swordshine
c83f81be4a Fix Midnight Clock 2019-09-26 22:39:06 +08:00
Anthony Calosa
f6df44510b Fix event finally 2019-09-26 21:28:32 +08:00
Anthony Calosa
10e59c0ad7 revert previous implementation (doesn't work correctly on Android) 2019-09-26 20:58:16 +08:00
Hans Mackowiak
a9e97d6508 Update Player: use some mapFromAffected 2019-09-26 12:29:52 +00:00
Anthony Calosa
117f3b1273 removed unused import 2019-09-26 20:06:05 +08:00
Anthony Calosa
a30a1e49bc Much better implementation 2019-09-26 20:04:01 +08:00
Anthony Calosa
01dd12ec7e Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-26 12:09:16 +08:00
Anthony Calosa
36b8e652a5 Add feature request
Can duplicate tokens with summoning sickness not be in same pile as
tokens without it OR the ones without it be on the top? It's really
annoying on Android to equip/enchant a token that can attack this turn
(need to zoom in, then out).
(https://www.slightlymagic.net/forum/viewtopic.php?f=26&t=1516&start=2190#p230560)
2019-09-26 12:02:48 +08:00
Ryan1729
786448e14e Merge branch 'start_replacement_run_keys_refactor' of git.cardforge.org:Ryan1729/forge into start_replacement_run_keys_refactor 2019-09-25 19:50:47 -06:00
Ryan1729
c9b66d9743 add mapFromAffected convenience function 2019-09-25 19:50:00 -06:00
Michael Kamensky
00c51488da Merge branch 'newBranch' into 'master'
"Hexproof from" Ability Icons

See merge request core-developers/forge!2172
2019-09-25 19:00:35 +00:00
Anthony Calosa
c38cb5c3d4 Cleanup 2019-09-25 21:57:19 +08:00
Anthony Calosa
f1c3e93548 Update HexproofKey 2019-09-25 21:11:01 +08:00
swordshine
ab6d4575af Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2178
2019-09-25 09:46:04 +00:00
CCTV-1
b37f21f751 update simplified chinese translation 2019-09-25 17:11:22 +08:00
swordshine
28d8888b1e Merge branch 'german-translation' into 'master'
german translation update

See merge request core-developers/forge!2176
2019-09-25 08:30:37 +00:00
Hans Mackowiak
15e5d68520 Update ManifestAi: unused import 2019-09-25 08:03:32 +00:00
Dagin Svezek
7d61198d81 german translation update 2019-09-25 07:14:41 +00:00
Anthony Calosa
b6ed045c21 Add Show Ability Icons Preference
(Overlay Menu on PC, Settings Page on Mobile)
2019-09-25 14:49:41 +08:00
Ryan1729
9d39ce5dda remove unused import 2019-09-25 00:31:35 -06:00
Ryan1729
94b39d7261 do the first couple runOld to `run refactors 2019-09-25 00:17:14 -06:00
Ryan1729
5298b8666d refactor getReplacementList to use AbiltyKey as much as currently possible 2019-09-25 00:04:28 -06:00
Ryan1729
6da178c8ae use the same methodNameOld trick as before with runTrigger 2019-09-24 23:33:14 -06:00
Anthony Calosa
c24f4b59ec Update Icons 2019-09-25 12:28:40 +08:00
Anthony Calosa
9888faa271 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-25 12:26:10 +08:00
Ryan1729
60fb7d8809 add myself to CONTRIBUTORS.txt 2019-09-24 22:03:09 -06:00
swordshine
bd41937c49 Merge branch 'indexofoutboundsfix' into 'master'
Mobile: Fix IndexOutOfBoundsException bug trying to get a card that doesn't exist.

See merge request core-developers/forge!2174
2019-09-25 03:55:06 +00:00
Anthony Calosa
8df2022a87 Add Hexproof From Icons (TODO: better Hexproof from Icons) 2019-09-25 09:31:08 +08:00
klaxnek
34c3c3b71c Mobile: Fix IndexOutOfBoundsException bug trying to get a card that doesn't exist.
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
 at java.util.ArrayList.get(ArrayList.java:437)
 at forge.screens.match.views.VCardDisplayArea.setSelectedIndex(VCardDisplayArea.java:193)
 at forge.screens.match.views.VZoneDisplay.setSelectedIndex(VZoneDisplay.java:100)
 at forge.card.CardZoom.setVisible(CardZoom.java:89)
 at forge.toolbox.FOverlay.hide(FOverlay.java:85)
 at forge.toolbox.FOverlay$1.run(FOverlay.java:75)
 at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:487)
 at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1571)
 at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1270)
2019-09-25 00:52:15 +02:00
Michael Kamensky
448b4ef959 Merge branch 'master' into 'master'
Added MTGO Grixis Cube submitted by dolphi5.

See merge request core-developers/forge!2173
2019-09-24 17:49:21 +00:00
Agetian
1ff41ec7c3 - Update the cube name 2019-09-24 20:13:33 +03:00
Agetian
4d1572a76a - Added MTGO Grixis Cube submitted by dolphi5. 2019-09-24 20:03:42 +03:00
Anthony Calosa
6556f78c28 Add Hexproof From Icons (TODO: PC code, better Hexproof from Icons) 2019-09-24 22:49:52 +08:00
swordshine
30702a22e0 Merge branch 'german-translation' into 'master'
german translation update

See merge request core-developers/forge!2171
2019-09-24 14:45:08 +00:00
Dagin Svezek
dbb34e06e6 german translation update 2019-09-24 14:11:06 +00:00
Hans Mackowiak
8820097b9d Merge branch 'patch-4' into 'master'
Update belle_of_the_brawl.txt

See merge request core-developers/forge!2170
2019-09-24 13:45:36 +00:00
Hans Mackowiak
0c88765fce Update belle_of_the_brawl.txt 2019-09-24 13:45:36 +00:00
swordshine
ddc9f05059 Merge branch 'translation07' into 'master'
Translate InputBase and PlayerControllerHuman.

See merge request core-developers/forge!2168
2019-09-24 13:22:13 +00:00
Hans Mackowiak
d71d63ade8 Merge branch 'newBranch' into 'master'
Fix NPE

Closes #1164

See merge request core-developers/forge!2169
2019-09-24 12:11:17 +00:00
Anthony Calosa
bc5e5a731d Fix NPE 2019-09-24 12:11:16 +00:00
Anthony Calosa
6ad34fed2c Better Fix NPE 2019-09-24 20:07:22 +08:00
Anthony Calosa
028880e026 Fix NPE 2019-09-24 19:47:17 +08:00
Peter
ee2aa50e07 Translate InputBase and PlayerControllerHuman.
PlayerControllerHuman translation pending (only translated safe ones by now)
2019-09-24 13:45:12 +02:00
swordshine
829eae7c97 Merge branch 'darkredfontfix' into 'master'
Updated Darkred font skin.

See merge request core-developers/forge!2167
2019-09-24 09:32:12 +00:00
Peter
e763a1d662 Updated Darkred font skin.
Used Darkforge font. Now supports ¿ and ¡ characters. Agreed with Churrufli, darkred skin author.
2019-09-24 11:27:58 +02:00
swordshine
d7d706d862 Merge branch 'newBranch' into 'master'
Display Ability Icons

See merge request core-developers/forge!2163
2019-09-24 06:42:20 +00:00
swordshine
a1059f7304 Merge branch 'master' into 'master'
Added puzzle PS_MGOB - Possibility Storm - Special Guest Puzzle - Modern Goblins

See merge request core-developers/forge!2165
2019-09-24 06:40:54 +00:00
swordshine
1434bc1499 Merge branch 'malakir' into 'master'
Fixed Malakir Familiar Oracle text

See merge request core-developers/forge!2166
2019-09-24 06:40:47 +00:00
austinio7116
8997b71c33 Fixed Malakir Familiar Oracle text 2019-09-24 06:44:11 +01:00
swordshine
15a31d0788 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2164
2019-09-24 05:11:16 +00:00
Agetian
41d5af8369 - Added puzzle PS_MGOB. 2019-09-24 08:09:00 +03:00
CCTV-1
516510c98f update simplified chinese translation 2019-09-24 13:05:35 +08:00
Anthony Calosa
b2f80b47a9 Display Ability Icons (Mobile & PC) 2019-09-24 12:30:51 +08:00
Anthony Calosa
44eee1c5c4 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-24 12:05:57 +08:00
swordshine
1cf37aa460 Merge branch 'patch' into 'master'
Fix Escape to the Wilds

See merge request core-developers/forge!2162
2019-09-24 03:23:09 +00:00
swordshine
6571a56a3c Fix Escape to the Wilds 2019-09-24 11:03:01 +08:00
swordshine
c2be7cc7e6 Merge branch 'run-away-together-ai-remove' into 'master'
Set 'Run Away Together' to AI:RemoveDeck:All

See merge request core-developers/forge!2161
2019-09-24 02:13:51 +00:00
swordshine
425ecb9a6b Merge branch 'fabled-passage-typo' into 'master'
Fix typo on Fabled Passage

See merge request core-developers/forge!2160
2019-09-24 02:03:23 +00:00
Brock Fanning
daa89338aa Set 'Run Away Together' to AI:RemoveDeck:All 2019-09-23 22:01:00 -04:00
swordshine
be3286cd8b Merge branch 'unique-cards-only-option-deck-editor' into 'master'
Unique cards only option deck editor

See merge request core-developers/forge!2063
2019-09-24 01:56:49 +00:00
Brock Fanning
bf5ab53678 Fix typo on Fabled Passage 2019-09-23 21:55:05 -04:00
swordshine
c7d6234f5e Merge branch 'mobiletranslation06fix' into 'master'
Mobile: Fix new bug Add Basic Lands Dialog (sorry)

See merge request core-developers/forge!2159
2019-09-24 00:39:16 +00:00
Peter
68a8a08709 Mobile: Fix new bug Add Basic Lands Dialog (sorry) 2019-09-23 20:22:08 +02:00
swordshine
41d9cece8a Merge branch 'patch' into 'master'
Update the edition file because Adventure cards are not split cards.

See merge request core-developers/forge!2158
2019-09-23 15:23:48 +00:00
Valerio Maggio
e246751cab Added missing Localizer Import 2019-09-23 16:16:21 +01:00
swordshine
80defc5516 Merge branch 'push_down_toStringMap_part_3' into 'master'
Push down to string map part 3

See merge request core-developers/forge!2139
2019-09-23 15:16:05 +00:00
Valerio Maggio
550323976c Merge Upstream and conflict resolved on ImageView with missing localiser 2019-09-23 16:15:34 +01:00
Valerio Maggio
e9de55ebc8 Merge Upstream and conflict resolved on ImageView with missing localiser 2019-09-23 16:06:40 +01:00
swordshine
7f8b55fe0f Update the edition file because Adventure cards are not split cards. 2019-09-23 22:36:18 +08:00
Ryan1729
16074a65b0 fix incorrect runParams keys 2019-09-23 08:24:31 -06:00
Ryan Wiedemann
308c75e60e Merge branch 'master' into 'push_down_toStringMap_part_3'
# Conflicts:
#   forge-ai/src/main/java/forge/ai/AiController.java
#   forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
#   forge-game/src/main/java/forge/game/card/CardFactory.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java
#   forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java
2019-09-23 14:18:52 +00:00
swordshine
e55e160cdb Merge branch 'patch-5' into 'master'
Add Path to Exile, Act of Treason test

See merge request core-developers/forge!2146
2019-09-23 11:55:46 +00:00
swordshine
1c89cb6fca Merge branch 'replaceMode' into 'master'
ReplacementEffect: add Mode for ReplacementType

See merge request core-developers/forge!2150
2019-09-23 11:53:48 +00:00
Hans Mackowiak
14c9a8ccc3 ReplacementEffect: add Mode for ReplacementType 2019-09-23 11:53:48 +00:00
swordshine
d0fe0640f9 Merge branch 'mobiletranslation06' into 'master'
Mobile: Translations n.6

See merge request core-developers/forge!2157
2019-09-23 11:52:30 +00:00
Peter
a4ed3a3f36 Merge remote-tracking branch 'origin/mobiletranslation06' into mobiletranslation06
# Conflicts:
#	forge-gui/res/languages/zh-CN.properties
2019-09-23 12:47:57 +02:00
Peter
f4bf120125 Updated chinese (another try...) 2019-09-23 12:46:34 +02:00
Peter
f15e051cc4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into mobiletranslation06
 Conflicts:
	forge-gui/res/languages/zh-CN.properties
2019-09-23 12:45:49 +02:00
klaxnek
9b483eb881 Merge branch 'master' into 'mobiletranslation06'
# Conflicts:
#   forge-gui/res/languages/zh-CN.properties
2019-09-23 10:41:02 +00:00
Peter
0a57342524 Updated chinese translation 2019-09-23 12:39:13 +02:00
swordshine
76a0fc6fa2 Merge branch 'ELD_Draft' into 'master'
Preparation for ELD draft format

See merge request core-developers/forge!2155
2019-09-23 10:17:18 +00:00
swordshine
ed42c4a675 Merge branch 'master' into 'master'
update simplified chinese translation

See merge request core-developers/forge!2156
2019-09-23 10:14:42 +00:00
Peter
8d3b00c3f2 Mobile: More Translations
Added ¡ and ¿ needed to Spanish
2019-09-23 11:53:03 +02:00
CCTV-1
9e778d9a69 update simplified chinese translation 2019-09-23 17:21:47 +08:00
Anthony Calosa
1f58279525 Merge remote-tracking branch 'remotes/core/master' into newBranch 2019-09-23 14:49:29 +08:00
austinio7116
08129db336 Preparation for ELD draft format 2019-09-23 06:18:32 +01:00
Hans Mackowiak
2aec48a64b Merge branch 'patch-4' into 'master'
Fix getController()

See merge request core-developers/forge!2142
2019-09-23 04:53:14 +00:00
Anthony Calosa
7d5b8d2d5e Fix getController()
(Donate -> Illusions of Grandeur -> bounce Illusions of Grandeur, or Path to Exile taken by any player via Act of Treason etc... the effect should be on the controller)
2019-09-23 04:53:14 +00:00
swordshine
b12db3b9a8 Merge branch 'mobiletranslation05' into 'master'
Mobile: Translated more strings and Views

See merge request core-developers/forge!2154
2019-09-23 01:10:57 +00:00
swordshine
00c3010319 Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2153
2019-09-23 00:51:43 +00:00
Peter
4bf837701f Mobile: Translated more strings and Views
Fixed duplicated Catalog label
Fixed Stack label not found
2019-09-22 20:49:55 +02:00
Ryan1729
80506954f1 more replacing getMapParams().containsKey with hasParam 2019-09-22 12:13:40 -06:00
Ryan1729
329d6145be manually reduce usage of getMapParams 2019-09-22 12:06:51 -06:00
Ryan1729
d8c27ccb14 find and replace .getMapParams().get(...) to getParam(...)
Using Intellij's structural search.
2019-09-22 11:50:19 -06:00
Ryan1729
52b697e47e find and replace this.mapParams.get to getParam
Using Intellij's structural search.
2019-09-22 11:43:18 -06:00
Ryan1729
eaed235b1b find and replace this.mapParams.containsKey to hasParam
Using Intellij's structural search.
2019-09-22 11:30:20 -06:00
Ryan1729
1e1ce95714 replace a containsKey and a simple get with getParamOrDefault 2019-09-22 11:29:20 -06:00
swordshine
9a32e2885a Add Fires of Invention 2019-09-22 22:59:10 +08:00
swordshine
3ca2b8c4be Add Happily Ever After 2019-09-22 22:17:21 +08:00
Alessandro Coli
67c596726f Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-22 16:15:23 +02:00
swordshine
9f3316502a Fix The Cauldron of Eternity 2019-09-22 20:32:43 +08:00
swordshine
79d03abe8c Add Drown in the Loch 2019-09-22 20:26:08 +08:00
swordshine
d850a6685a Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2152
2019-09-22 11:41:33 +00:00
swordshine
8fdf76a4e5 Add three cards 2019-09-22 13:13:33 +08:00
swordshine
4988a80cdd Add Giant Opportunity 2019-09-22 12:45:34 +08:00
swordshine
bc6ab4d0b9 Merge branch 'patch' into 'master'
Fix Kaalia of the Vast

See merge request core-developers/forge!2151
2019-09-21 14:44:51 +00:00
swordshine
0f4c1960d9 More fixes 2019-09-21 22:27:21 +08:00
swordshine
bcccf726b5 Fix Kaalia of the Vast 2019-09-21 22:10:57 +08:00
swordshine
455c83a963 Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2149
2019-09-21 14:10:23 +00:00
swordshine
facb93945e Add Deathless Knight 2019-09-21 19:17:28 +08:00
Alessandro Coli
60fb1c0d02 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-21 12:28:37 +02:00
swordshine
70398d8d15 Add two cards 2019-09-21 18:12:11 +08:00
swordshine
23d72cb59a More ELD cards 2019-09-21 16:24:34 +08:00
swordshine
695d2324ac Fix Lovestruck Beast 2019-09-21 16:12:32 +08:00
swordshine
661c3d96aa More ELD cards 2019-09-21 16:07:28 +08:00
swordshine
18cd8d68e1 More ELD cards 2019-09-21 12:47:36 +08:00
swordshine
3887dc1440 Add Beanstalk Giant 2019-09-21 11:53:29 +08:00
Ryan1729
1c11465041 Merge branch 'master' of git.cardforge.org:core-developers/forge into push_down_toStringMap_part_3 2019-09-20 21:06:00 -06:00
swordshine
f938366d40 Update ELD edition file 2019-09-21 10:38:57 +08:00
swordshine
fc1d5543d8 More ELD cards 2019-09-21 10:21:52 +08:00
swordshine
94e81531db Merge branch 'master' into 'master'
More ELD cards

See merge request core-developers/forge!2148
2019-09-21 01:33:27 +00:00
swordshine
dd7b419806 Merge branch 'push_down_toStringMap_part_2' into 'master'
Push down to string map part 2

See merge request core-developers/forge!2134
2019-09-21 01:33:20 +00:00
swordshine
2e04ae0549 Merge branch '1144-eld-adventure-spells' into 'master'
Resolve "ELD: Adventure Spells"

Closes #1144

See merge request core-developers/forge!2102
2019-09-21 01:17:08 +00:00
Hanmac
9b3fa50dee Adventure: If an object becomes a copy of an object that has an Adventure, the copy also has an Adventure. 2019-09-20 18:03:06 +02:00
Hanmac
b7b1c3a437 As Foretold: fix the cmc check 2019-09-20 16:20:35 +02:00
Hanmac
1e7ed84522 CardProperty: add AdventureCard for Creature with adventure 2019-09-20 15:54:47 +02:00
Hans Mackowiak
feaa01f70c ELD: Merchant of the Vale 2019-09-20 15:54:47 +02:00
Hans Mackowiak
7a504bf3c8 Update CardFactoryUtil.java 2019-09-20 15:54:47 +02:00
Hans Mackowiak
d9dd31b263 ELD: Animating Faerie 2019-09-20 15:54:47 +02:00
Hans Mackowiak
94805103da Spell: add extra check for Adventure cards 2019-09-20 15:54:47 +02:00
Hanmac
378d0e26ab Adventure: add - separator 2019-09-20 15:54:47 +02:00
Hanmac
0c354e8a70 Adventure: add Logic to cast as Spell 2019-09-20 15:54:47 +02:00
swordshine
cb18c22649 Add Hushbringer 2019-09-20 21:29:36 +08:00
swordshine
96c840eebe More ELD cards 2019-09-20 20:54:16 +08:00
swordshine
e07504a55e Update 3 scripts 2019-09-20 20:37:06 +08:00
swordshine
dfeeff6e3b More ELD cards 2019-09-20 20:29:41 +08:00
swordshine
bc882e6593 Merge branch 'german-translation' into 'master'
german translation update & fix some typos

See merge request core-developers/forge!2147
2019-09-20 08:16:12 +00:00
Dagin Svezek
904822eb78 german translation update & fix some typos 2019-09-20 05:37:35 +00:00
Ryan1729
4c43f70ea6 Merge branch 'push_down_toStringMap_part_2' into push_down_toStringMap_part_3 2019-09-19 21:13:03 -06:00
Ryan1729
626df0df1c Merge branch 'master' of git.cardforge.org:core-developers/forge into push_down_toStringMap_part_2 2019-09-19 20:49:44 -06:00
Anthony Calosa
6f5b9ddfff Add card highlighting 2019-09-19 23:23:56 +08:00
Anthony Calosa
73f3a5ff85 Prevent NPE 2019-09-19 23:22:59 +08:00
Anthony Calosa
913d108f69 Merge remote-tracking branch 'remotes/core/master' into HEAD 2019-09-19 23:11:56 +08:00
Anthony Calosa
77ab276d83 Add Path to Exile, Act of Treason test (The player whose controller of the creature taken by Act of Treason in this test after casting Path to Exile to the creature is the one who will get the benefit of getting the land) 2019-09-19 14:11:12 +00:00
swordshine
df4d6568d9 Merge branch 'patch' into 'master'
Update ability text in card detail panel if it's not translated

See merge request core-developers/forge!2145
2019-09-19 13:34:44 +00:00
swordshine
80c6c23289 Update ability text if it's not translated 2019-09-19 20:57:49 +08:00
swordshine
1cad0ecbc2 Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2143
2019-09-19 11:15:52 +00:00
swordshine
42aa6f0eb3 More forgescribed cards 2019-09-19 19:08:09 +08:00
swordshine
99c8899186 Merge branch 'hotfixDieharmoniconTrigger' into 'master'
TriggerHandler: fix Dieharmonicon with new TriggerKeys

See merge request core-developers/forge!2144
2019-09-19 10:54:34 +00:00
Hans Mackowiak
a90b6033b0 TriggerHandler: fix Dieharmonicon with new TriggerKeys 2019-09-19 10:54:34 +00:00
swordshine
191ffa67be More ELD cards 2019-09-19 16:47:56 +08:00
swordshine
efc849740b Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2137
2019-09-19 08:30:25 +00:00
swordshine
ee53353501 More forgescribed cards 2019-09-19 16:20:11 +08:00
swordshine
6d73201393 Merge branch 'master' into 'master'
translation Forge.java and update forge-android supported simplified chinese character

See merge request core-developers/forge!2141
2019-09-19 06:58:08 +00:00
swordshine
6f333589b8 Merge branch 'patch-4' into 'master'
Fix setloadingaMatch prematurely

See merge request core-developers/forge!2140
2019-09-19 06:56:57 +00:00
CCTV-1
1b9bce5165 translation Forge.java 2019-09-19 13:53:55 +08:00
CCTV-1
dd55b73199 Merge remote-tracking branch 'upstream/master' 2019-09-19 13:16:53 +08:00
Anthony Calosa
91abbcd3c5 Fix setloadingaMatch prematurely, if the startgame is null there must be an error/showdialog happened. 2019-09-19 04:31:42 +00:00
swordshine
3573a27bdb Add some forgescribed cards 2019-09-19 12:16:41 +08:00
swordshine
78cee77b87 Merge branch 'fix_deckgen_restriction_bug' into 'master'
fix restricted cards not being restricted to one.

See merge request core-developers/forge!2138
2019-09-19 04:15:27 +00:00
Ryan1729
7ca72974b6 push toStringMap into performTest, eliminating the need for the toStringMap call. 2019-09-18 22:00:28 -06:00
Ryan1729
9ab35769d5 fix restricted cards not being restricted to one. 2019-09-18 21:34:19 -06:00
Ryan1729
bafbe73bd6 convert missed keys to enum 2019-09-18 21:12:13 -06:00
Alessandro Coli
3261e1a260 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-18 19:51:31 +02:00
CCTV-1
e46fbb4d01 Merge remote-tracking branch 'upstream/master' 2019-09-18 21:14:59 +08:00
swordshine
0fe6b3b52b Add Once and Future 2019-09-18 20:03:56 +08:00
swordshine
c6a3122110 Update a reference 2019-09-18 18:54:08 +08:00
swordshine
a2da91eb3a Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2135
2019-09-18 10:51:40 +00:00
swordshine
4fe155959e Merge branch 'push_down_toStringMap_part_1' into 'master'
Push down toStringMap part 1

See merge request core-developers/forge!2127
2019-09-18 10:48:34 +00:00
swordshine
f89cc76a76 Update Once Upon a Time 2019-09-18 17:45:30 +08:00
swordshine
158b1d0f59 Merge branch 'deutschupdate01' into 'master'
Updated german translation

See merge request core-developers/forge!2136
2019-09-18 09:39:48 +00:00
Peter
9d6aa6b755 Updated german translation
Contributed by twosat at https://www.slightlymagic.net/forum/viewtopic.php?f=26&t=23215#p230047
2019-09-18 10:58:06 +02:00
swordshine
97ebdff835 Add Clackbridge Troll 2019-09-18 12:46:52 +08:00
swordshine
87fffa0ddd Add Dance of the Manse 2019-09-18 12:29:05 +08:00
swordshine
cf9a72fc42 Add Once Upon a Time 2019-09-18 10:24:04 +08:00
Ryan1729
30d37c11b0 remove import 2019-09-17 19:40:45 -06:00
swordshine
2d9d53a19d Update Hollow One 2019-09-17 21:08:28 +08:00
swordshine
9921f21471 Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2131
2019-09-17 12:52:46 +00:00
swordshine
d56568b499 Add Cauldron's Gift 2019-09-17 15:22:19 +08:00
swordshine
5d1618104e Add three cards 2019-09-17 15:22:06 +08:00
Ryan1729
350756435f add incorrectly not staged changes 2019-09-16 23:16:24 -06:00
Ryan1729
ad067b7444 push toStringMap down into Trigger eliminating the need for the conversion.
Also add helper method `setTriggeringObjectsFrom` and change `getRunParams` into similar but not identical `getFromRunParams`
2019-09-16 23:07:53 -06:00
swordshine
b462f0dba1 Update trigger description 2019-09-17 10:52:25 +08:00
CCTV-1
3768074fc2 Merge remote-tracking branch 'upstream/master' 2019-09-17 09:48:20 +08:00
Anthony Calosa
4cb8bca258 Merge remote-tracking branch 'remotes/core/master' 2019-09-17 02:37:29 +08:00
Michael Kamensky
147cf60076 Merge branch 'master' into 'master'
Fix FLAG_KEEP_SCREEN_ON

See merge request core-developers/forge!2132
2019-09-16 17:57:22 +00:00
Anthony Calosa
72079ad609 Fix Cinder Cloud and Noxious Gearhulk Interaction with Cards with CDA
(Noxious Gearhulk -> Malignus, as reported on forums)
2019-09-16 17:57:22 +00:00
Anthony Calosa
ed12d90d56 Merge remote-tracking branch 'remotes/core/master' 2019-09-17 00:57:30 +08:00
Anthony Calosa
d65d6d39c8 Return FLAG_KEEP_SCREEN_ON functionality 2019-09-17 00:53:47 +08:00
CCTV-1
48ee2057ac Merge remote-tracking branch 'upstream/master' 2019-09-16 22:38:05 +08:00
swordshine
e98cb0043d Add Robber of the Rich 2019-09-16 22:08:07 +08:00
swordshine
e529765c44 Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2129
2019-09-16 13:36:11 +00:00
swordshine
5ded6fcfe0 Merge branch 'master' into 'master'
Fix two cards

See merge request core-developers/forge!2130
2019-09-16 13:31:54 +00:00
Anthony Calosa
4b031c6928 Fix Cinder Cloud and Noxious Gearhulk Interaction with Cards with CDA
(Noxious Gearhulk -> Malignus, as reported on forums)
2019-09-16 13:31:54 +00:00
Anthony Calosa
a9ac51bd9b Merge remote-tracking branch 'remotes/core/master' 2019-09-16 20:54:41 +08:00
Anthony Calosa
24452d509c Fix Cinder Cloud and Noxious Gearhulk Interaction with Cards with CDA
(Noxious Gearhulk -> Malignus, as reported on forums)
2019-09-16 20:53:53 +08:00
swordshine
c8cb56c416 Update a script 2019-09-16 20:20:07 +08:00
swordshine
70f640b414 Add two cards 2019-09-16 20:10:08 +08:00
swordshine
e0f2802eda Add Sundering Stroke 2019-09-16 18:49:46 +08:00
swordshine
716faf4706 Add Clockwork Servant 2019-09-16 18:35:31 +08:00
swordshine
12b05147e7 Update two Adamant cards 2019-09-16 18:27:10 +08:00
CCTV-1
cf3f467100 Merge remote-tracking branch 'upstream/master' 2019-09-16 17:36:47 +08:00
swordshine
0e5884d757 Add Henge Walker 2019-09-16 16:35:06 +08:00
swordshine
c42f003755 Add Folio of Fancies 2019-09-16 16:12:32 +08:00
swordshine
3d2d192286 Merge branch 'update_run_trigger_callers_part_4' into 'master'
Update run trigger callers part 4

See merge request core-developers/forge!2126
2019-09-16 08:10:43 +00:00
CCTV-1
2d26718587 Merge remote-tracking branch 'upstream/master' 2019-09-16 12:28:59 +08:00
swordshine
1312fee64a Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2128
2019-09-16 00:39:58 +00:00
swordshine
f1cbaa9d95 Fix SVar name 2019-09-16 08:29:00 +08:00
swordshine
243726d307 Refactor "For each color among permanents you control, add one mana of that color" 2019-09-15 21:37:24 +08:00
swordshine
bfaf054e88 Add Wildborn Preserver 2019-09-15 20:10:27 +08:00
Alessandro Coli
2e1fa8fa40 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-15 14:10:20 +02:00
swordshine
83c6473a7c Add Vantress Gargoyle 2019-09-15 19:23:55 +08:00
swordshine
86f344450d Fix Midnight Clock 2019-09-15 19:04:18 +08:00
swordshine
c079467b9a Add two cards 2019-09-15 13:36:43 +08:00
swordshine
9446af4808 Add two cards 2019-09-15 13:19:55 +08:00
Ryan1729
8a160c88d0 No unused imports. Even in the tests. 2019-09-14 21:16:55 -06:00
Ryan1729
b69682064d fix empty EnumMap IllegalArgumentException bug and add a test for it 2019-09-14 21:11:25 -06:00
swordshine
0637c69bfe Add Irencrag Feat 2019-09-15 10:59:42 +08:00
CCTV-1
aee2ac9ab7 Merge remote-tracking branch 'upstream/master' 2019-09-15 10:27:07 +08:00
swordshine
ce4fe0239f Merge branch 'patch' into 'master'
More ELD cards

See merge request core-developers/forge!2124
2019-09-15 02:24:46 +00:00
swordshine
5b176b93d0 Merge branch 'master' into 'master'
Various Improvement (Android)

See merge request core-developers/forge!2110
2019-09-15 02:24:26 +00:00
Ryan1729
dae5a51acc add fromString test and make it pass. 2019-09-14 20:12:52 -06:00
swordshine
ad428e2285 Fix a subability SVar 2019-09-15 10:07:46 +08:00
Ryan1729
42d0695804 push down toStringMap further, which required using AbilityKey inside TriggerWaiting and several other places. 2019-09-14 19:44:27 -06:00
CCTV-1
acfcabe2b7 Merge remote-tracking branch 'upstream/master' 2019-09-15 08:24:46 +08:00
Ryan1729
2d548b93ec push toStingMap down a layer 2019-09-14 16:51:55 -06:00
Ryan1729
65ab715b91 eliminate all but the last call to runTriggerOld 2019-09-14 15:52:02 -06:00
Ryan1729
eabcf47b27 more mechanical, samey transformations 2019-09-14 15:14:40 -06:00
Michael Kamensky
334a0ea0b4 Merge branch '1153-multiple-staticability-pump-on-same-creature-does-conflict' into 'master'
Resolve "multiple StaticAbility Pump on same creature does conflict"

Closes #1153 and #1156

See merge request core-developers/forge!2119
2019-09-14 16:33:56 +00:00
Hans Mackowiak
47d3a74387 Resolve "multiple StaticAbility Pump on same creature does conflict" 2019-09-14 16:33:56 +00:00
swordshine
efac184ffb add more forgescribed cards 2019-09-14 23:29:40 +08:00
swordshine
44ae0c5039 Add forgescribed cards 2019-09-14 22:53:31 +08:00
swordshine
2d5ab947ab Merge branch 'update_run_trigger_callers_part_3' into 'master'
Update run trigger callers part 3

See merge request core-developers/forge!2123
2019-09-14 09:11:26 +00:00
Ryan1729
827e035286 delete unused imports 2019-09-14 01:10:38 -06:00
Ryan1729
aaf1919905 more mechanical transformations 2019-09-14 01:05:16 -06:00
Anthony Calosa
ccfbe4d956 countHuman instead of noAIPlayer 2019-09-14 15:05:01 +08:00
Ryan1729
d8ffcbb132 simplify Integer to int 2019-09-14 01:04:58 -06:00
Ryan1729
b532d1a0ca more mechanical transformations 2019-09-14 00:03:12 -06:00
Ryan1729
a9c020d2ac remove code that has been commented out since 2019-05-04 (commit 38178cfb) 2019-09-13 22:52:43 -06:00
CCTV-1
df98af5294 Merge remote-tracking branch 'upstream/master' 2019-09-14 12:19:46 +08:00
swordshine
042da7e95f Merge branch 'master' into 'master'
Added puzzle PS_M209 - Possibility Storm - Magic Core Set 2020 09

See merge request core-developers/forge!2122
2019-09-14 04:07:42 +00:00
Agetian
ff5dbf2c96 - Added puzzle PS_M209. 2019-09-14 06:50:47 +03:00
Anthony Calosa
ace050a8c0 Merge remote-tracking branch 'remotes/core/master' 2019-09-13 21:12:30 +08:00
CCTV-1
ff89114315 Merge remote-tracking branch 'upstream/master' 2019-09-13 19:21:53 +08:00
CCTV-1
7725d2ed42 Merge remote-tracking branch 'upstream/master' 2019-09-13 19:19:20 +08:00
swordshine
808d1fbd47 Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2116
2019-09-13 11:18:46 +00:00
CCTV-1
372d9cce94 update forge-android support simplified chinese characters 2019-09-13 19:18:05 +08:00
swordshine
1ac14eb466 Merge branch 'master' into 'master'
update translation

See merge request core-developers/forge!2121
2019-09-13 11:13:38 +00:00
CCTV-1
229688f26f update translation 2019-09-13 18:37:58 +08:00
Anthony Calosa
a107d41fed Merge branch 'master' into 'master'
# Conflicts:
#   forge-gui-mobile/src/forge/screens/match/MatchScreen.java
2019-09-13 10:35:22 +00:00
swordshine
9f626c73ea Merge branch 'localizerfix' into 'master'
Guess String Encoding. Fixes Issue #1155

See merge request core-developers/forge!2118
2019-09-13 10:20:45 +00:00
swordshine
520ab3959f Merge branch 'mobiletranslations03' into 'master'
Mobile - Translation: Deck Chooser, Deck Editor and Match Screen

See merge request core-developers/forge!2120
2019-09-13 10:20:15 +00:00
Peter
16da63aa9c Mobile - Translation: Deck Chooser, Deck Editor and Match Screen.
Fix compare String with equals()
2019-09-13 11:19:35 +02:00
swordshine
b56e2ec3c3 Fix the name of Syr Elenora, the Discerning 2019-09-13 11:18:15 +08:00
Peter
4b6f642c12 Guess String Encoding. Fixes Issue #1155 2019-09-12 21:20:10 +02:00
swordshine
c3a5491a6b Update Garenbrig Paladin 2019-09-12 22:35:04 +08:00
Anthony Calosa
eda7d435e4 Merge remote-tracking branch 'remotes/core/master' 2019-09-12 20:38:53 +08:00
Anthony Calosa
8e282b16c5 Update Player Name 2019-09-12 20:30:42 +08:00
Anthony Calosa
73b71b18ab Transluscent Overlay for Loader 2019-09-12 20:29:40 +08:00
Anthony Calosa
61f400feac Prevent NPE 2019-09-12 20:28:48 +08:00
swordshine
46dc8b73ea Add two Adamant cards 2019-09-12 16:50:03 +08:00
swordshine
6d7d3d0306 more fixes 2019-09-12 16:08:28 +08:00
swordshine
9c21f195f9 Fix Sorcerous Spyglass 2019-09-12 16:04:55 +08:00
swordshine
207eaf482d Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2113
2019-09-12 06:52:22 +00:00
swordshine
b8b3f7ab82 Add two cards 2019-09-12 13:57:14 +08:00
swordshine
9cffaa19b5 Merge branch 'update_run_trigger_callers_part_2' into 'master'
Update run trigger callers part 2

See merge request core-developers/forge!2115
2019-09-12 05:47:00 +00:00
swordshine
9baf47330d Add Doom Foretold 2019-09-12 12:43:33 +08:00
Ryan1729
520c5290ac remove unneeded imports 2019-09-11 22:22:55 -06:00
Ryan1729
d4ad098293 add helper method for the common case of passing down the card 2019-09-11 22:13:02 -06:00
swordshine
876d69fb71 Merge branch 'master' into 'master'
add Basic Land translation,update forge-android simplified chinese characters

See merge request core-developers/forge!2114
2019-09-12 04:02:11 +00:00
Ryan1729
bbcb59f64f more mechanical transformations 2019-09-11 22:00:38 -06:00
Ryan1729
1dc5dc1ff6 automatically inline redundant variable 2019-09-11 21:24:11 -06:00
Ryan1729
b76a3c3efa several mechanical refactorings 2019-09-11 21:23:27 -06:00
CCTV-1
89fca048ad fix:missing Swamp translation 2019-09-12 11:08:47 +08:00
CCTV-1
ac2efd0977 update simplified chinese card translation 2019-09-12 10:59:18 +08:00
CCTV-1
602327366b add basic land translation path 2019-09-12 10:58:23 +08:00
swordshine
3f9001267e Add Outlaws' Merriment 2019-09-12 10:39:08 +08:00
CCTV-1
544b653a90 Merge remote-tracking branch 'upstream/master' 2019-09-12 10:31:47 +08:00
swordshine
fdd0814786 Merge branch 'master' into 'master'
add Simplified Chinese cards translation support

See merge request core-developers/forge!2112
2019-09-12 02:30:26 +00:00
CCTV-1
acd8e76037 update forge-android support simplified chinese characters 2019-09-12 10:30:25 +08:00
CCTV-1
b4f54dd150 update translation 2019-09-12 10:29:10 +08:00
swordshine
a9728725a3 Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2111
2019-09-12 02:28:59 +00:00
swordshine
d7e0dd3e54 Add forgescribed cards 2019-09-12 10:01:52 +08:00
swordshine
35b887de14 Update Lochmere Serpent 2019-09-12 09:17:49 +08:00
CCTV-1
b5f95ccf77 update de-De es-ES card name translation 2019-09-12 09:10:38 +08:00
CCTV-1
5bf55abd49 add Simplified Chinese cards translation support 2019-09-12 09:08:43 +08:00
CCTV-1
9b26f145f7 Merge remote-tracking branch 'upstream/master' 2019-09-11 21:44:26 +08:00
Anthony Calosa
7a28295585 Draw Priority for Multiplayer game (Human 2 players) 2019-09-11 21:30:22 +08:00
swordshine
434027c14f Merge branch 'ui-card-translation' into 'master'
UI Card Translation (desktop and mobile)

See merge request core-developers/forge!1987
2019-09-11 13:27:55 +00:00
CCTV-1
eb9e1fb2d9 update Simplified Chinese character set 2019-09-11 19:08:37 +08:00
swordshine
764f2d903b Merge branch 'master' into 'master'
update Simplified Chinese translation

See merge request core-developers/forge!2109
2019-09-11 09:22:53 +00:00
CCTV-1
85da019bf8 update translation 2019-09-11 16:43:55 +08:00
swordshine
629fa3344b Merge branch 'mobile-translations02' into 'master'
Mobile: Translate Settings Page

See merge request core-developers/forge!2058
2019-09-11 07:06:58 +00:00
swordshine
3c97a43898 Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2107
2019-09-11 06:11:37 +00:00
swordshine
867222ffc2 Merge branch 'master' into 'master'
Forge-Desktop LanguageComboBox content automatic generated

See merge request core-developers/forge!2108
2019-09-11 06:11:32 +00:00
swordshine
7b7616834f Merge branch 'master' into 'master'
Prevent MultiTap on Start Button (Android)

See merge request core-developers/forge!2106
2019-09-11 06:11:24 +00:00
swordshine
51117558ac Merge branch 'update_run_trigger_callers_part_1' into 'master'
Update run trigger callers part 1

See merge request core-developers/forge!2103
2019-09-11 06:11:18 +00:00
swordshine
80f15cadfb Add more forgescribed cards 2019-09-11 13:13:03 +08:00
swordshine
89daf161a5 Add more forgescribed cards 2019-09-11 12:10:51 +08:00
swordshine
b10f0b9366 Add Enchanted Carriage 2019-09-11 09:51:41 +08:00
CCTV-1
0b244b0b40 language list is generated from an res/languages existing file(consistent with Andorid behavior) 2019-09-11 09:37:00 +08:00
CCTV-1
04f6302e18 adjust indentation 2019-09-11 09:15:07 +08:00
swordshine
e509f82599 Add forgescribed ELD cards 2019-09-11 09:09:26 +08:00
CCTV-1
a4bed16d2d update translation 2019-09-11 09:07:04 +08:00
CCTV-1
65ea561462 add zh-CN language option 2019-09-11 09:05:12 +08:00
Anthony Calosa
bfc106b0da Much better implementation to make 1 tap on start button (Constructed)
on Android (Should prevent issue loading a double match on single view)
2019-09-10 21:56:20 +08:00
Michael Kamensky
3e5e6a5981 Merge branch 'master' into 'master'
Fix Textbounds getBounds, getMultilineBounds, getWrappedBounds

See merge request core-developers/forge!2105
2019-09-09 17:11:31 +00:00
Anthony Calosa
a8d46b1ff0 Try to prevent rapid tap on Start Button causing issues on Android 2019-09-10 00:36:16 +08:00
Anthony Calosa
17b578ae9c Fix Textbounds getBounds, getMultilineBounds, getWrappedBounds 2019-09-09 16:10:51 +08:00
swordshine
af6c826cc4 Merge branch 'master' into 'master'
Some codes needed to revert

See merge request core-developers/forge!2104
2019-09-09 06:25:53 +00:00
Anthony Calosa
5f78608321 Some codes needed to revert 2019-09-09 13:30:53 +08:00
Ryan1729
29aef01a99 update several callers of runTriggerOld to runTrigger 2019-09-08 23:17:58 -06:00
Ryan1729
f311c3b53c mark runTriggerOld as @Deprecated 2019-09-08 22:34:52 -06:00
Ryan1729
311bbea70f remove more null literals where overloads that pass null exist 2019-09-08 21:34:46 -06:00
Ryan1729
2f45d0050b Find that many methods are always passed null for their params and so start removeing those params since they are getting in the way of my intended refactor. 2019-09-08 21:34:41 -06:00
Ryan1729
25031e5d4e Add helper method and chip away at refactor 2019-09-08 21:34:14 -06:00
Sol
32f9ad9157 Merge branch 'start_trigger_run_params_refactor' into 'master'
Setup to begin refactoring Trigger runParams to use Enum keys

See merge request core-developers/forge!2085
2019-09-09 02:27:27 +00:00
Hans Mackowiak
82dd917899 Merge branch 'master' into 'master'
Fix KeywordsChange

See merge request core-developers/forge!2101
2019-09-08 07:33:19 +00:00
Anthony Calosa
302ddb11e3 Fix KeywordsChange 2019-09-08 07:33:19 +00:00
Alessandro Coli
cadb2ae791 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-08 09:19:21 +02:00
swordshine
8520fcf471 Merge branch 'master' into 'master'
Revert URL Decode to support older phone

See merge request core-developers/forge!2099
2019-09-08 03:23:12 +00:00
Anthony Calosa
1321bcd125 Revert URL Decode to support older phone 2019-09-08 10:45:13 +08:00
swordshine
e9794036ad Merge branch 'master' into 'master'
Added puzzle PS_M208 - Possibility Storm - Magic Core Set 2020 08

See merge request core-developers/forge!2098
2019-09-08 00:47:16 +00:00
Ryan Wiedemann
3d51a6e962 Merge branch 'master' into 'start_trigger_run_params_refactor'
# Conflicts:
#   forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java
2019-09-07 23:36:05 +00:00
Agetian
d2e7fa62d1 - Added puzzle PS_M208. 2019-09-07 22:39:02 +03:00
Michael Kamensky
847195c9f5 Merge branch '1138-refactor-canblock-numbers' into 'master'
Resolve "Refactor "canBlock" Numbers"

Closes #1138

See merge request core-developers/forge!2078
2019-09-07 19:36:40 +00:00
Hanmac
51e231a08e CanBlockAdditional: moved to CardView for better display 2019-09-07 20:50:28 +02:00
Agetian
d11fc1b6fe - Rewire AI logic for AiAttackController. 2019-09-07 20:50:28 +02:00
Agetian
ad2565305f - Rewire the AI support for AttachAi and PumpAi 2019-09-07 20:50:28 +02:00
Hanmac
e21f23f9ab Card: fix code 2019-09-07 20:50:27 +02:00
Hanmac
4663c5b06f cards: update card scripts for can block additional 2019-09-07 20:50:27 +02:00
Hanmac
357f146742 CanBlockAny: rewrite for 'can block an additional' and 'can block any number' 2019-09-07 20:50:27 +02:00
Michael Kamensky
d3faa740f1 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.28.002.

See merge request core-developers/forge!2097
2019-09-07 17:58:28 +00:00
Agetian
f64b59a140 - Preparing Forge for Android publish 1.6.28.002. 2019-09-07 20:51:14 +03:00
Michael Kamensky
f53346eaf7 Merge branch 'master' into 'master'
Big Refactoring + Android Fix for older phones

See merge request core-developers/forge!2092
2019-09-07 17:50:01 +00:00
Anthony Calosa
a0b71d60a1 Revert Android 8 codes to support older Android phones.
Hope I didn't miss any. :)
(tested with Android Marshmallow phone with 2gb RAM and mediatek cpu)
2019-09-07 22:54:53 +08:00
Peter
59f0034be9 Add new English settings translation to chinese (needs translation) 2019-09-07 09:11:43 +02:00
Peter
c690d20604 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into mobile-translations02 2019-09-07 08:56:03 +02:00
Peter
3d53c41208 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-09-07 08:46:19 +02:00
swordshine
b802b0555f Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2096
2019-09-07 02:04:53 +00:00
swordshine
a9f367d9de Add Run Away Together 2019-09-07 09:53:21 +08:00
swordshine
2619f87520 Fix two cards 2019-09-07 09:18:43 +08:00
Michael Kamensky
193dfae43b Merge branch 'overlap_same_clip' into 'master'
Support overlapped reproducing of same AudioClip

See merge request core-developers/forge!2081
2019-09-06 19:22:48 +00:00
Anthony Calosa
c1d5cfa27e Fix highlight of Planar Conquest start button instead of OldQuest header 2019-09-06 22:13:59 +08:00
swordshine
2ce27128eb Merge branch 'patch' into 'master'
Fix Garruk's name

See merge request core-developers/forge!2095
2019-09-06 14:04:45 +00:00
swordshine
11d3433b5f Fix Garruk's name 2019-09-06 21:59:12 +08:00
Anthony Calosa
3269d3fd9d Fix gameview when there is no human player 2019-09-06 21:41:05 +08:00
swordshine
14ab1714bd Merge branch 'master' into 'master'
update translation and try to reduce android chinese characters image cache size

See merge request core-developers/forge!2094
2019-09-06 12:58:05 +00:00
swordshine
e010babee7 Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2091
2019-09-06 12:57:58 +00:00
swordshine
e8e115ae1a Use a simple template for Silverflame Ritual 2019-09-06 20:51:55 +08:00
Anthony Calosa
b3ad92530c Fix scaling of background when zoomed in multiplayer mode 2019-09-06 20:51:33 +08:00
Anthony Calosa
00f263b2be Merge remote-tracking branch 'remotes/core/master' 2019-09-06 20:22:07 +08:00
swordshine
b4a7a9a3ca Changed the template of Embereth Paladin 2019-09-06 20:04:07 +08:00
CCTV-1
ca4926f9b4 fix miss ';' 2019-09-06 09:18:23 +00:00
CCTV-1
b487cdc1e3 rename to ISO 639 name 2019-09-06 07:36:45 +00:00
CCTV-1
87b2311fd6 if generate common chinese characters,many mobile phones stuck in generate image(if font file exists chinese characters).
try only generate what is currently used.
2019-09-06 07:32:04 +00:00
CCTV-1
42bfb40eae change half-width to full-width symbol 2019-09-06 06:43:19 +00:00
CCTV-1
3747a05927 change Half-width to full-width symbol 2019-09-06 06:24:46 +00:00
swordshine
56d0982fb1 Add Slaying Fire 2019-09-06 13:36:18 +08:00
swordshine
0f9ed8638b Add Silverflame Ritual 2019-09-06 13:24:14 +08:00
Michael Kamensky
2049da3fc1 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.28.001.

See merge request core-developers/forge!2093
2019-09-06 05:13:14 +00:00
Agetian
21af87b906 - Preparing Forge for Android publish 1.6.28.001. 2019-09-06 08:08:02 +03:00
Anthony Calosa
e977420ffa Finalization for Refactoring 2019-09-06 12:55:40 +08:00
Agetian
03be13bacf Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-09-06 07:45:57 +03:00
Anthony Calosa
f5eb14afaa Merge remote-tracking branch 'remotes/core/master' 2019-09-06 12:39:55 +08:00
swordshine
d3d41d7c1f Add Adamant cards 2019-09-06 12:34:53 +08:00
swordshine
632c4c2503 Merge branch 'patch' into 'master'
Update Forgescribed cards

See merge request core-developers/forge!2090
2019-09-06 02:01:23 +00:00
swordshine
f06304ac1c Update Forgescribed cards 2019-09-06 09:52:39 +08:00
swordshine
19585aa007 Merge branch 'master' into 'master'
Refactor/Code Cleanup

See merge request core-developers/forge!2080
2019-09-06 00:41:16 +00:00
swordshine
5d23941dab Merge branch 'patch' into 'master'
ELD cards

See merge request core-developers/forge!2088
2019-09-06 00:40:57 +00:00
Anthony Calosa
59bf5830fe Big Cleanup 2019-09-06 00:03:04 +08:00
CCTV-1
dc6361d5b9 Update some 'format' translations 2019-09-05 14:34:32 +00:00
Anthony Calosa
efbd2a08eb Updated codes 2019-09-05 20:56:17 +08:00
swordshine
28d2f3cef6 Update forgescribed cards 2019-09-05 20:52:17 +08:00
Anthony Calosa
0f62a297c7 Updated some codes 2019-09-05 18:20:36 +08:00
swordshine
bfe5a5a6a3 Add forgescribed cards 2019-09-05 18:10:53 +08:00
Anthony Calosa
ca28b4d696 Merge remote-tracking branch 'remotes/core/master' 2019-09-05 18:01:47 +08:00
swordshine
3f2c9e0909 Merge branch '1145-inspiring-captain-pump-lasts-beyond-turn' into 'master'
Resolve "Inspiring Captain pump lasts beyond turn"

Closes #1145

See merge request core-developers/forge!2089
2019-09-05 08:04:27 +00:00
Hans Mackowiak
79f768e88a Update PumpAllEffect: update view on Until Command 2019-09-05 07:28:48 +00:00
swordshine
f5e55ae2ae Add two cards 2019-09-05 14:31:55 +08:00
Ryan1729
3c47659c20 fix comment 2019-09-04 23:18:47 -06:00
Ryan1729
9d2e92157c move and rename TriggerKey to AbilityKey 2019-09-04 22:53:32 -06:00
swordshine
b07262320e Update Typelists 2019-09-05 09:31:58 +08:00
swordshine
10446c58f8 Merge branch 'patch' into 'master'
ELD cards

Closes #1143

See merge request core-developers/forge!2086
2019-09-05 01:24:49 +00:00
Anthony Calosa
2b0e47dd14 Initial migration 2019-09-05 08:24:58 +08:00
swordshine
0acabf679f Merge branch 'master' into 'master'
chinese translation

See merge request core-developers/forge!2087
2019-09-04 13:19:26 +00:00
CCTV-1
b7b697b4f2 fix typo 2019-09-04 13:11:14 +00:00
CCTV-1
6070d3f1e3 fix:miss '=' 2019-09-04 10:11:28 +00:00
CCTV-1
d11febd7e4 Update 'Oathbreaker' and 'signature spell' translation 2019-09-04 09:29:09 +00:00
CCTV-1
3cbb603c24 add generate common chinese characters images 2019-09-04 06:57:34 +00:00
CCTV-1
605426cd7a initial commit chinese translation 2019-09-04 06:45:57 +00:00
swordshine
71fca651fc Add three cards 2019-09-04 14:44:31 +08:00
swordshine
157b2c85fe Update Food token and subtype 2019-09-04 13:48:24 +08:00
swordshine
1e33c9ac40 Merge branch 'patch' into 'master'
Cleanup the upcoming folder for the ELD spoiler

See merge request core-developers/forge!2084
2019-09-04 05:47:23 +00:00
swordshine
1bb12a2ce6 CLeanup the upcoming folder for the ELD spoiler 2019-09-04 13:43:50 +08:00
swordshine
01094fb4e5 Add a "References$ X" param 2019-09-04 13:27:31 +08:00
swordshine
4931857b8c Update Transmute Artifact 2019-09-04 13:27:31 +08:00
swordshine
26241e3ef8 Add a ForceRevealToController param for Narset, Parter of Veils if no card is valid 2019-09-04 13:27:31 +08:00
Ryan1729
ef5b7e902b rename runTrigger to runTriggerOld and add new runTrigger method 2019-09-03 22:52:38 -06:00
Anthony Calosa
5876ee8220 Removed redundant code 2019-09-04 12:23:36 +08:00
Blacksmith
c78bfbe631 Clear out release files in preparation for next release 2019-09-04 01:55:50 +00:00
Blacksmith
10877ca143 [maven-release-plugin] prepare for next development iteration 2019-09-04 01:51:10 +00:00
Blacksmith
367dab571d [maven-release-plugin] prepare release forge-1.6.28 2019-09-04 01:51:04 +00:00
Blacksmith
c05558c4ae Update README.txt for release 2019-09-04 01:48:35 +00:00
Anthony Calosa
51ea20b1df Refactor Dynamic Planechase BG 2019-09-04 02:15:13 +08:00
Anthony Calosa
efa606783c Cleanup 2019-09-03 22:13:35 +08:00
Anthony Calosa
38b07d6185 Merge remote-tracking branch 'origin/master' 2019-09-03 21:12:16 +08:00
Michael Kamensky
053203fd9a Merge branch 'patch-4' into 'master'
Fix Pump with negative values

See merge request core-developers/forge!2083
2019-09-03 09:34:32 +00:00
Hans Mackowiak
6247cffcfe Fix Pump with negative values 2019-09-03 09:34:31 +00:00
Anthony Calosa
a4d34bb858 Retained some schemas 2019-09-03 11:20:10 +08:00
Anthony Calosa
c38bae910a Refactor/Code Cleanup 2019-09-02 18:08:56 +08:00
Agetian
93bf9fb419 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-09-02 10:32:02 +03:00
Agetian
a7ee697d0f - Move a test outside the loop where it makes more sense 2019-09-02 10:28:50 +03:00
Michael Kamensky
83b6b9faeb Merge branch 'redrawPTfix' into 'master'
PumpEffect: fix PT update for view

See merge request core-developers/forge!2079
2019-09-02 04:49:08 +00:00
Hans Mackowiak
c55ec06688 PumpEffect: fix PT update for view 2019-09-02 04:49:08 +00:00
NikolayHD
7a760bb37f Support overlapped reproducing of same AudioClip
when playing same sound in a batch, like auto-tapping N lands
or drawing 7 cards in mulligane
2019-09-01 21:23:31 +03:00
Agetian
bbdc3c182f Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-09-01 08:39:41 +03:00
Michael Kamensky
19e67673c7 Merge branch 'boostPT' into 'master'
Card: combine PT boost into one Map using timestamp

See merge request core-developers/forge!2075
2019-09-01 05:39:09 +00:00
Hans Mackowiak
c04ccdaf7c Card: combine PT boost into one Map using timestamp 2019-09-01 05:39:09 +00:00
Agetian
23be71db1b Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-09-01 06:58:41 +03:00
Michael Kamensky
5381d6c1dc Merge branch 'master' into 'master'
Add Overlay to Planechase BG

See merge request core-developers/forge!2077
2019-09-01 03:58:07 +00:00
Agetian
473fb80fe6 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-09-01 06:48:59 +03:00
Anthony Calosa
21076e2c01 Adjust card scrollIntoView for widescreen display 2019-09-01 11:48:43 +08:00
Anthony Calosa
c698c034ca Adjust column count 2019-09-01 10:13:06 +08:00
Anthony Calosa
a1adbedad1 Adjust column count 2019-09-01 08:54:15 +08:00
Anthony Calosa
631e4aff55 Merge remote-tracking branch 'remotes/core/master' 2019-09-01 08:44:01 +08:00
Anthony Calosa
c30f8847e8 Add translucent dark overlay for Planchase BG 2019-09-01 08:43:07 +08:00
Anthony Calosa
dfd8c619cb Adjust conguest rewards column count for widescreen display 2019-09-01 08:41:36 +08:00
Alessandro Coli
2d3990df81 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-31 18:28:27 +02:00
Michael Kamensky
e052c34a05 Merge branch 'master' into 'master'
Adjust Planar Conquest layout for widescreen/tall display on Android.

See merge request core-developers/forge!2076
2019-08-31 11:40:18 +00:00
Anthony Calosa
2aa8daceed Update default bg image to 16:9 2019-08-31 13:37:14 +08:00
Anthony Calosa
91d5fd29dc Removed unused import 2019-08-31 13:04:15 +08:00
Anthony Calosa
b9e12c8708 Background scale (width) 2019-08-31 12:58:14 +08:00
Anthony Calosa
d527c17362 add todo 2019-08-30 20:32:25 +08:00
Anthony Calosa
1950d989e8 Merge remote-tracking branch 'remotes/core/master' 2019-08-30 20:30:10 +08:00
Anthony Calosa
3298f60a7d Last Minute Changes 2019-08-30 19:53:31 +08:00
Anthony Calosa
2fa6781565 Minor Adjustment 2019-08-30 19:18:04 +08:00
Agetian
881f8e61ce Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-08-30 12:36:43 +03:00
Anthony Calosa
5b53da08c0 Adjust Planar Conquest layout for widescreen/tall display on Android. 2019-08-30 17:10:38 +08:00
Michael Kamensky
af00536bd0 Merge branch 'fix_hang' into 'master'
Followup on fixed AudioClip deadlock

See merge request core-developers/forge!2074
2019-08-30 07:59:43 +00:00
NikolayHD
f62f2832dd followup on fixed AudioClip deadlock 2019-08-30 00:52:47 +03:00
Agetian
fd9c208ebf Merge remote-tracking branch 'origin/master' into agetian-master 2019-08-29 21:24:46 +03:00
Michael Kamensky
154a91a418 Merge branch 'fix_hang' into 'master'
Fix deadlock in AudioClip reproducing

See merge request core-developers/forge!2073
2019-08-29 04:47:59 +00:00
Michael Kamensky
e2dbabeb5e Merge branch 'august-26-2019-bannings-update' into 'master'
Update Standard, Modern and Vintage format

See merge request core-developers/forge!2072
2019-08-29 04:25:24 +00:00
NikolayHD
64c624509c fix deadlock in AudioClip reproducing
in JRE 1.8.0_221 a call to clip.setMicrosecondPosition(0)
can produce a deadlock if the clip is already beginning
to reproduce, that is clip.start() was recently called

The workaround is to wait until the clip actually begins to
reproduce before letting another clip.setMicrosecondPosition(0)
call happen
2019-08-29 02:27:23 +03:00
pfirpfel
f52aa11ca3 Update Standard, Modern and Vintage format according to August 26, 2019 Banned and Restricted Announcement 2019-08-28 16:33:26 +02:00
Michael Kamensky
6344c8fc3c Merge branch 'master' into 'master'
Added puzzle PS_M207 - Possibility Storm - Magic Core Set 2020 07

See merge request core-developers/forge!2071
2019-08-28 13:27:20 +00:00
Michael Kamensky
c755a4c4a5 Added puzzle PS_M207 - Possibility Storm - Magic Core Set 2020 07 2019-08-28 13:27:19 +00:00
Agetian
ff041d9c4d - Added puzzle PS_M207. 2019-08-28 16:22:49 +03:00
Michael Kamensky
326f34adf0 Merge branch 'master' into 'master'
Allow importing non Core and non Exp Cards only

See merge request core-developers/forge!2068
2019-08-28 13:08:52 +00:00
Michael Kamensky
fa23e51c86 Merge branch 'patch-4' into 'master'
Update vraskas_stoneglare: fix missing X

See merge request core-developers/forge!2070
2019-08-28 13:08:22 +00:00
Hans Mackowiak
77e80f1e04 Update vraskas_stoneglare: fix missing X 2019-08-28 13:08:22 +00:00
Michael Kamensky
9effa5390e Merge branch 'add-grixis-cube' into 'master'
Add Ryan Overturf's Grixis Cube (MTGO)

See merge request core-developers/forge!2069
2019-08-28 13:08:11 +00:00
Anthony Calosa
a15a5ad5c3 Fix Portrait mode Exit/Back key 2019-08-28 20:42:06 +08:00
pfirpfel
5c32b465d0 Add Ryan Overturf's Grixis Cube (MTGO) 2019-08-28 13:16:58 +02:00
Alessandro Coli
23d4904ee7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-28 11:34:45 +02:00
Anthony Calosa
8cef63968c Allow Importing non Core and non Expansion Cards Only 2019-08-28 11:35:16 +08:00
Anthony Calosa
d6f42edfa5 Merge remote-tracking branch 'remotes/core/master' 2019-08-28 10:30:08 +08:00
Anthony Calosa
4af721ac6f Shorter Log 2019-08-28 09:37:40 +08:00
swordshine
8e6655e3ee Merge branch 'oathbreakerdeckgen' into 'master'
Updated deckgen data including oathbreaker

See merge request core-developers/forge!2067
2019-08-28 00:34:43 +00:00
austinio7116
fdd6d789be Updated M20 standard deckgen data
Updated Commander deckgen data
Initial Oathbreaker deckgen data

(cherry picked from commit 254dfd8)
2019-08-27 20:14:11 +01:00
Peter
d859368d7c Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-27 19:06:25 +02:00
Michael Kamensky
4752e13d91 Merge branch 'master' into 'master'
Prevent render issues when you exit prematurely

See merge request core-developers/forge!2066
2019-08-27 04:57:53 +00:00
Michael Kamensky
30b5388734 Merge branch 'PowerExchangeEffectChange' into 'master'
PowerExchangeEffect: use NewPT to set base power

See merge request core-developers/forge!2065
2019-08-27 04:53:52 +00:00
kevlahnota
ae8c6c2917 Prevent rendering issue on loading screen when you exit prematurely
and try to restart the app again (Android)
2019-08-27 09:25:38 +08:00
Hanmac
ea14729609 PowerExchangeEffect: use NewPT to set base power 2019-08-26 21:35:37 +02:00
Peter
d83c60eb91 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-26 20:47:13 +02:00
Anthony Calosa
cffda2c1a7 Pull from core-developers/forge:master 2019-08-26 13:24:20 +08:00
Michael Kamensky
e3423c03e1 Merge branch 'gnu-v3-license' into 'master'
GNU General Public License V3 Added to Code Repo

See merge request core-developers/forge!2064
2019-08-26 03:28:47 +00:00
kevlahnota
fbdeb3953b TODO: adjust settings page description bounds 2019-08-26 10:39:29 +08:00
Michael Kamensky
8e93de9a8c Merge branch 'libgdxarm64' into 'master'
Android: Add libgdx arm64 libraries

See merge request core-developers/forge!2060
2019-08-25 18:01:12 +00:00
Valerio Maggio
988edc90cb Added GNU v3 License 2019-08-25 19:16:17 +02:00
Valerio
4f6682fa9d Add GNU General Public License v3 2019-08-25 16:05:00 +00:00
Peter
0cc1b32f90 Mobile: Add libgdx arm64 libraries 2019-08-25 15:26:08 +02:00
Valerio Maggio
27a65c551b Removed unused imports to avoid checkstyle failures 2019-08-25 14:46:39 +02:00
Valerio Maggio
4fc08e9d7a Merge remote-tracking branch 'upstream/master' 2019-08-25 14:30:30 +02:00
Michael Kamensky
e54393e8eb Merge branch 'darkredskin' into 'master'
Add DarkRed skin by Churrufli

See merge request core-developers/forge!2056
2019-08-25 11:00:24 +00:00
Michael Kamensky
c1eb0d84a1 Merge branch 'master' into 'master'
Prevent rendering issues again.

See merge request core-developers/forge!2057
2019-08-25 10:59:24 +00:00
Peter
bdbf03e0dd Mobile: Finalize Settings tab translations 2019-08-25 12:42:24 +02:00
Valerio Maggio
fe95de30cf Merge remote-tracking branch 'upstream/master' 2019-08-25 12:37:35 +02:00
Valerio Maggio
f8c98dca5d Add new shared options to show Unique Cards Only in ItemList and Image views 2019-08-25 12:24:01 +02:00
kevlahnota
70bd959ca9 Added darkforge skin 2019-08-25 17:40:18 +08:00
kevlahnota
347cb6520c Prevent rendering issues again. 2019-08-25 17:28:51 +08:00
Peter
dbbf7310b7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into mobile-translations02 2019-08-25 11:23:33 +02:00
Peter
b2fe710fc2 As requested, add DarkRed skin by Churrufli 2019-08-25 11:02:23 +02:00
Peter
434718fc91 Add deleted libs by error (2nd try).. 2019-08-25 10:55:40 +02:00
Peter
f22b8332fc Add deleted libs by error... 2019-08-25 10:49:08 +02:00
Peter
06161663b4 Add deleted libs by error... 2019-08-25 10:44:42 +02:00
Peter
4913633a25 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation
 Conflicts:
	forge-gui-mobile/src/forge/assets/FSkinFont.java
	forge-gui-mobile/src/forge/card/CardImageRenderer.java
	forge-gui-mobile/src/forge/card/CardRenderer.java
2019-08-25 10:36:12 +02:00
Michael Kamensky
45fd90f678 Merge branch 'master' into 'master'
Prevent rendering issue and adjust screen timeout when downloading resource

See merge request core-developers/forge!2055
2019-08-25 04:25:05 +00:00
kevlahnota
035bf81150 Prevent rendering issues 2019-08-25 11:24:54 +08:00
Valerio Maggio
14ce377ca6 disabled Unique cards only by default in Deck Editor 2019-08-24 20:02:11 +02:00
Michael Kamensky
c7bc5d1768 Merge branch 'imageFetcherFix' into 'master'
ImageFetcher: Better handling if Image can't be saved as jpg

See merge request core-developers/forge!2006
2019-08-24 17:51:39 +00:00
Hans Mackowiak
5cf1f47047 ImageFetcher: Better handling if Image can't be saved as jpg 2019-08-24 17:51:39 +00:00
kevlahnota
9d63eac89a WIP: Partial fix on preventsleep when downloading resource. 2019-08-24 18:14:35 +08:00
Michael Kamensky
c31198eaea Merge branch 'master' into 'master'
Updated Android to use Adaptive Icons

See merge request core-developers/forge!2054
2019-08-24 08:50:43 +00:00
kevlahnota
f077e59745 Fix Talon Gates BG not loading 2019-08-24 15:45:39 +08:00
kevlahnota
a6c67d2967 Updated Android to use Adaptive Icons 2019-08-24 14:30:18 +08:00
swordshine
191941bb9f Merge branch 'patch' into 'master'
Fix Doomsday

See merge request core-developers/forge!2053
2019-08-24 06:26:21 +00:00
swordshine
66cc926348 Fix Doomsday 2019-08-24 14:17:50 +08:00
Michael Kamensky
e03b8b2d40 Merge branch 'fix-ai-paidhash-reset' into 'master'
Fix AI inverse logic when resetting the paid hash before playing a SA

Closes #1133

See merge request core-developers/forge!2052
2019-08-24 05:51:32 +00:00
Michael Kamensky
b28cd601fd Fix AI inverse logic when resetting the paid hash before playing a SA 2019-08-24 05:51:32 +00:00
swordshine
bb0f9b260f Merge branch 'patch-4' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!2051
2019-08-24 00:36:04 +00:00
Anthony Calosa
b28f83aa92 Update ANNOUNCEMENTS.txt 2019-08-23 20:28:25 +00:00
Michael Kamensky
84d3dfcc47 Merge branch 'master' into 'master'
Improve Dynamic Planechase Background

See merge request core-developers/forge!2050
2019-08-23 17:45:51 +00:00
kevlahnota
43722d1c1f Improve Dynamic Planechase Background 2019-08-24 01:23:39 +08:00
Alessandro Coli
f66f51b25e Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-23 14:33:15 +02:00
Michael Kamensky
098cd5b445 Merge branch 'fix-removelandtypes' into 'master'
Fix RemoveLandTypes in AnimateBaseEffect

Closes #1132

See merge request core-developers/forge!2049
2019-08-23 04:52:20 +00:00
Michael Kamensky
6c64ae97fb - Update the state for view when unanimating the card, helps address misrepresented visual state for relevant cards. 2019-08-23 04:52:20 +00:00
swordshine
ffbf21c233 Merge branch 'grip-of-chaos' into 'master'
Try to fix Grip of Chaos

See merge request core-developers/forge!1535
2019-08-23 02:56:00 +00:00
swordshine
bc2233cf24 Merge branch 'master' into 'master'
Update Libgdx to 1.9.10

See merge request core-developers/forge!2047
2019-08-23 02:45:04 +00:00
swordshine
3d8f944526 Merge branch 'patch' into 'master'
Fix Reality Scramble

See merge request core-developers/forge!2048
2019-08-23 00:43:10 +00:00
kevlahnota
5e88cc67e4 Update Libgdx to 1.9.10 2019-08-23 00:59:18 +08:00
swordshine
5e260fc9fb Fix Reality Scramble 2019-08-22 23:35:12 +08:00
Peter
21868668ae Mobile: Translate Settings Tab (unfinished) 2019-08-21 20:38:54 +02:00
Alessandro Coli
826ff27bd1 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-21 17:17:24 +02:00
swordshine
47a1b6ea98 Merge branch 'patch' into 'master'
C19 cards

See merge request core-developers/forge!2042
2019-08-20 12:20:57 +00:00
swordshine
a8c1377e10 Update Wall of Stolen Identity 2019-08-20 20:02:59 +08:00
Michael Kamensky
a4fea0b5e7 Merge branch 'master' into 'master'
Added puzzle PS_M206 - Possibility Storm - Magic Core Set 2020 06

See merge request core-developers/forge!2046
2019-08-20 06:48:38 +00:00
Agetian
258946ac32 - Added puzzle PS_M206. 2019-08-20 09:47:42 +03:00
Michael Kamensky
fbf94af590 Merge branch 'master' into 'master'
Add Oathbreaker variant

See merge request core-developers/forge!2043
2019-08-20 04:34:14 +00:00
Dan Demp
f1e0158102 Add menu item for setting Oathbreaker
Allow double-tapping to set Commander or Oathbreaker if one hasn't yet been set
2019-08-20 04:34:14 +00:00
Michael Kamensky
ce96e64edb Merge branch 'fix-mobile-home' into 'master'
Restore mobile home screen buttons

See merge request core-developers/forge!2045
2019-08-20 04:32:31 +00:00
drdev
8e812c7f2a Remove unused imports 2019-08-19 22:50:28 -05:00
drdev
6486ebd1ad Remove Exit button from mobile home screen
Revert text of other buttons on mobile home screen
Fix text with spaces removed, like "Planar Conquest"
2019-08-19 22:01:50 -05:00
Alessandro Coli
132aa8d49a Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-19 12:49:07 +02:00
Michael Kamensky
4e79ea827d Merge branch 'ai-krrik' into 'master'
Basic AI for payments via K'rrik's static ability.

See merge request core-developers/forge!2044
2019-08-19 09:49:09 +00:00
Agetian
c823a493bb - Basic AI for payments via K'rrik's static ability. 2019-08-19 09:25:50 +03:00
swordshine
cf9256ddf8 Add Wall of Stolen Identity 2019-08-18 15:16:22 +08:00
swordshine
e929523aea Fix Mass Diminish 2019-08-18 13:20:38 +08:00
swordshine
676e92fee2 Add Ghired's Belligerence 2019-08-18 11:52:21 +08:00
swordshine
955d18caa3 Add Thieving Amalgam 2019-08-18 11:10:43 +08:00
swordshine
bfd42a8c60 Merge branch 'patch' into 'master'
Add Tahngarth, First Mate

See merge request core-developers/forge!2041
2019-08-17 11:52:08 +00:00
swordshine
c47b0acccb Add "until end of combat" 2019-08-17 19:03:57 +08:00
swordshine
97a13768a4 Add Tahngarth, First Mate 2019-08-17 18:59:56 +08:00
swordshine
ad9f08e85e Merge branch 'krrik' into 'master'
K'rrik and his phyrexian like ability

See merge request core-developers/forge!2040
2019-08-17 10:43:53 +00:00
Hans Mackowiak
b554198a96 K'rrik and his phyrexian like ability 2019-08-17 10:43:53 +00:00
swordshine
ea552253ef Merge branch 'fix-npe-getcontroller' into 'master'
NPE guard for no owner in getController

Closes #1125

See merge request core-developers/forge!2039
2019-08-17 06:24:58 +00:00
Michael Kamensky
e03f555add NPE guard for no owner in getController 2019-08-17 06:24:58 +00:00
swordshine
db00eb640d Merge branch 'mobile-hometranslations-exit' into 'master'
Mobile only: Translate home menus and add an exit button

See merge request core-developers/forge!2038
2019-08-16 00:43:39 +00:00
swordshine
22a3060444 Merge branch 'npe-fix' into 'master'
NPE prevention in AttackConstraints.

Closes #1118

See merge request core-developers/forge!2032
2019-08-16 00:42:37 +00:00
Peter
e3bc9bf5dc Mobile only: Translate home menus and add an exit button 2019-08-15 21:05:00 +02:00
Alessandro Coli
67148cd84c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-15 09:51:35 +02:00
swordshine
b32017aab2 Merge branch 'patch' into 'master'
Fix the color of Arcum's Astrolabe

See merge request core-developers/forge!2037
2019-08-15 07:15:34 +00:00
swordshine
e29663916c Fix the color of Arcum's Astrolabe 2019-08-15 15:06:57 +08:00
Michael Kamensky
b40300d072 Merge branch 'fixCombatTest' into 'master'
PickerTest: fix combat

Closes #1121

See merge request core-developers/forge!2036
2019-08-15 06:57:31 +00:00
Hans Mackowiak
59e7ca4a9f PickerTest: fix combat 2019-08-15 06:57:30 +00:00
Peter
dc676cda3d Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-15 08:06:37 +02:00
Peter
3f76085a5d Removed regex formatting (problems with UTF-8...) 2019-08-15 08:05:20 +02:00
Michael Kamensky
dde0cf1fa5 Merge branch 'sacrificeXCost' into 'master'
CostSacrifice: allow X as amount

See merge request core-developers/forge!2023
2019-08-14 17:33:06 +00:00
Hans Mackowiak
1303991ee7 CostSacrifice: allow X as amount 2019-08-14 17:33:06 +00:00
Peter
368ffbf41d Don't translate cloned cards. 2019-08-14 15:14:06 +02:00
Peter
d8e073f561 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-14 14:22:16 +02:00
Peter
3f058ff6d9 Merge branch 'ui-card-translation' of https://git.cardforge.org/klaxnek/forge into ui-card-translation 2019-08-14 10:50:11 +02:00
swordshine
424ed9bad1 Merge branch 'patch' into 'master'
Fix Atla Palani, Nest Tender

See merge request core-developers/forge!2035
2019-08-14 07:22:56 +00:00
swordshine
17d3f23bed Fix Atla Palani, Nest Tender 2019-08-14 15:22:12 +08:00
swordshine
c248034a3d Merge branch 'patch' into 'master'
Fix a few cards reported in the slightlymagic forum

See merge request core-developers/forge!2034
2019-08-14 01:46:05 +00:00
swordshine
5b43f81d7b Fix a few cards reported in the slightlymagic forum 2019-08-14 09:45:24 +08:00
Sol
09157b0122 Merge branch 'patch-3' into 'master'
Add messaging about Java 8.211 being bad

See merge request core-developers/forge!2033
2019-08-14 01:22:13 +00:00
Sol
34a2917e08 Update ANNOUNCEMENTS.txt 2019-08-14 01:21:38 +00:00
Agetian
dc73d5b417 - NPE prevention. 2019-08-13 22:19:52 +03:00
swordshine
b591421bd5 Merge branch 'patch' into 'master'
Fix Frostwalk Bastion

See merge request core-developers/forge!2031
2019-08-13 15:24:51 +00:00
swordshine
6f517770d9 Fix Frostwalk Bastion 2019-08-13 23:22:56 +08:00
Alessandro Coli
941e3a7537 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-13 15:42:20 +02:00
Michael Kamensky
8e5c50ed9c Merge branch 'master' into 'master'
Added puzzle PS_M205 - Possibility Storm - Magic Core Set 2020 05

See merge request core-developers/forge!2030
2019-08-13 06:15:36 +00:00
Agetian
d56c6c78e4 - Added puzzle PS_M205. 2019-08-13 09:14:27 +03:00
Michael Kamensky
c788329202 Merge branch 'endCombatPhase' into 'master'
EndCombatPhase: add way to end combat phase by effect

See merge request core-developers/forge!2029
2019-08-13 05:35:29 +00:00
Hans Mackowiak
581e05c01d EndCombatPhase: add way to end combat phase by effect 2019-08-13 05:35:29 +00:00
Michael Kamensky
0142532532 Merge branch 'typofix5' into 'master'
Fix typos in card files, mostly having to do with missing or extra pipes

See merge request core-developers/forge!2028
2019-08-13 04:42:41 +00:00
kms70847
ec8c77abfb Fix typos in card files, mostly having to do with missing or extra pipes 2019-08-12 23:09:40 -04:00
swordshine
61087e135b Merge branch 'patch' into 'master'
Fix Battlefield Thaumaturge

See merge request core-developers/forge!2027
2019-08-13 02:39:20 +00:00
swordshine
3a6c07bb0b Fix Battlefield Thaumaturge 2019-08-13 10:38:55 +08:00
swordshine
bb09ac2550 Merge branch 'patch' into 'master'
C19: Sevinne, the Chronoclasm

See merge request core-developers/forge!2026
2019-08-13 01:06:12 +00:00
swordshine
f55b57718f C19: Sevinne, the Chronoclasm 2019-08-13 09:05:22 +08:00
Michael Kamensky
691d1021de Merge branch 'master' into 'master'
Added puzzle PS_M204 - Possibility Storm - Magic Core Set 2020 04.

See merge request core-developers/forge!2025
2019-08-12 16:47:15 +00:00
Michael Kamensky
40b21710b1 Merge branch 'fix_nre_loading_limited_deck' into 'master'
Fix null reference exception when loading deck

See merge request core-developers/forge!2015
2019-08-12 16:46:29 +00:00
Agetian
77820b4f78 - Added puzzle PS_M204. 2019-08-12 19:45:15 +03:00
swordshine
e483981207 Merge branch 'facedownCostAdjust' into 'master'
CostAdjustment: fix facedown cast setting facedown flag

See merge request core-developers/forge!2024
2019-08-11 12:33:42 +00:00
Hans Mackowiak
9110cd08fd CostAdjustment: fix facedown cast setting facedown flag 2019-08-11 12:33:41 +00:00
swordshine
a2efaa3c45 Merge branch 'sonarqubefixes02' into 'master'
More SonarQube detected bugs fixed

See merge request core-developers/forge!2021
2019-08-11 02:10:30 +00:00
swordshine
17946c00d9 Merge branch 'patch' into 'master'
Add Wildfire Devils

See merge request core-developers/forge!2022
2019-08-11 02:09:27 +00:00
Alessandro Coli
4487952c28 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-10 23:21:59 +02:00
klaxnek
9aaaf93062 Fix variable memSet might not have been initialized 2019-08-10 14:07:03 +02:00
klaxnek
d04fae8e96 More SonarQube detected bugs fixed:
- Use try-with-resources in AutoCloseable objects.
- End this switch case with an unconditional break, return or throw statement.
- A "NullPointerException" could be thrown.
- Use the "equals" method if value comparison was intended.
- Correct this "&" to "&&".
2019-08-10 13:57:06 +02:00
swordshine
ef598642b4 C19: Add Wildfire Devils 2019-08-10 19:56:22 +08:00
swordshine
c9744bea27 Merge branch 'panelDragFix' into 'master'
don't rearrange frames if the cursor is in the frame's head region

See merge request core-developers/forge!2012
2019-08-10 10:49:46 +00:00
swordshine
b690388358 Merge branch 'manifestChoices' into 'master'
Manifest: add Choices

See merge request core-developers/forge!2020
2019-08-10 10:44:53 +00:00
Hans Mackowiak
f08432273c Manifest: add Choices 2019-08-10 10:44:53 +00:00
swordshine
49bdff3f17 Merge branch 'sonarqubefixes01' into 'master'
Fixes some SonarQube detected bugs

See merge request core-developers/forge!2019
2019-08-10 10:32:18 +00:00
klaxnek
2534c2c27a Fixes some SonarQube detected bugs:
1. Use try-with-resources in AutoCloseable objects
2. Use the "equals" method if value comparison was intended.
3. Fixed getting the cheapest mana card in getCheapestPermanentAI.
2019-08-10 12:15:17 +02:00
swordshine
0899629e16 Merge branch 'patch' into 'master'
C19

See merge request core-developers/forge!2017
2019-08-10 10:01:28 +00:00
swordshine
587535cc4a Merge branch 'goadStatic' into 'master'
StaticAbility: add flag for static Goad

See merge request core-developers/forge!2018
2019-08-10 08:44:44 +00:00
Hans Mackowiak
fd0c79968d StaticAbility: add flag for static Goad 2019-08-10 08:44:44 +00:00
swordshine
6c6a729dcf C19: Fix Cliffside Rescuer 2019-08-10 15:47:24 +08:00
swordshine
278c8b7770 C19: Add Hate Mirage 2019-08-10 14:29:03 +08:00
swordshine
f83b09bad3 C19: Add Cliffside Rescuer 2019-08-10 13:42:33 +08:00
swordshine
aa4e04e0f6 C19: Add Archfiend of Spite 2019-08-10 13:29:49 +08:00
swordshine
d744a50e2d Merge branch 'patch' into 'master'
C19 cards

See merge request core-developers/forge!2016
2019-08-10 04:52:24 +00:00
swordshine
d58dbac90f C19: Added three cards 2019-08-10 12:46:11 +08:00
swordshine
5b659c433e C19: Update tokens 2019-08-10 10:51:30 +08:00
swordshine
1288830c0e C19: Update edition file 2019-08-10 10:21:37 +08:00
swordshine
ca06bc69a2 Merge branch 'patch' into 'master'
C19 cards

See merge request core-developers/forge!2014
2019-08-10 01:08:07 +00:00
NikolayHD
3c6d45ff0c Fix null reference exception when loading deck
in sealed or draft deck editor
2019-08-10 03:35:51 +03:00
Alessandro Coli
5089663b07 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-09 19:32:29 +02:00
swordshine
74af2b2423 C19: Add three charm cards 2019-08-09 23:34:44 +08:00
swordshine
004d3e5805 C19: Add Voice of Many 2019-08-09 23:12:24 +08:00
swordshine
6f6cb9296b Merge branch 'patch' into 'master'
C19 cards

See merge request core-developers/forge!2013
2019-08-09 15:11:57 +00:00
swordshine
1a3a920dba C19: add forgescribed cards (patch 8) 2019-08-09 21:47:20 +08:00
swordshine
0b1e552143 C19: add forgescribed cards (patch 7) 2019-08-09 19:47:50 +08:00
swordshine
708b5c8c9b C19: add forgescribed cards (patch 6) 2019-08-09 19:09:12 +08:00
swordshine
922c065149 C19: add forgescribed cards (patch 5) 2019-08-09 18:07:51 +08:00
swordshine
85d076bdd2 C19: add forgescribed cards (patch 4) 2019-08-09 17:35:32 +08:00
swordshine
14afacbf59 C19: add forgescribed cards (patch 3) 2019-08-09 14:10:54 +08:00
swordshine
25b7c3dd0f C19: add forgescribed cards (patch 2) 2019-08-09 12:26:22 +08:00
swordshine
f830e86612 - C19: add forgescribed cards (a) by Austinio7116 2019-08-09 09:36:26 +08:00
Hans Mackowiak
f0e22cf712 Merge branch '1112-effect-emblem-for-each-player' into 'master'
Resolve "Effect: Emblem for each player"

Closes #1112

See merge request core-developers/forge!2002
2019-08-08 18:32:52 +00:00
klaxnek
66249c9cfc Renamed es-es.properties to es-ES.properties 2019-08-08 17:00:02 +02:00
klaxnek
68bf39d218 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-08 16:57:45 +02:00
kms70847
ce32bdb0b5 don't rearrange frames if the cursor is in the frame's head region 2019-08-07 11:10:22 -04:00
swordshine
89e23077ca Merge branch 'german-translation' into 'master'
german translation update

See merge request core-developers/forge!2009
2019-08-07 00:24:52 +00:00
Sol
0dc2f2e398 Merge branch 'patch-3' into 'master'
Update ReplacementHandler: otherwise it causes crashes

See merge request core-developers/forge!2010
2019-08-06 20:55:40 +00:00
Hans Mackowiak
75cc8d3ee2 Update ReplacementHandler: otherwise it causes crashes 2019-08-06 20:55:40 +00:00
Dagin Svezek
3ef9a2fbee Replace de-DE.properties 2019-08-06 16:55:01 +00:00
Peter
720a3966c1 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-06 08:46:45 +02:00
Alessandro Coli
3ec5bfd4ff Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-05 14:46:22 +02:00
swordshine
413de957a8 Merge branch 'patch' into 'master'
Fix Yanling's Harbinger

See merge request core-developers/forge!2007
2019-08-05 00:40:52 +00:00
swordshine
82adc2383e Fix Yanling's Harbinger 2019-08-05 08:40:27 +08:00
Michael Kamensky
865ba29766 Merge branch 'patch-3' into 'master'
Update CardRenderer: for Loyalty

See merge request core-developers/forge!2005
2019-08-04 12:47:10 +00:00
Hans Mackowiak
877da770d2 Update CardRenderer: for Loyalty 2019-08-04 12:47:09 +00:00
Michael Kamensky
e024df9f2f Merge branch 'patch-3' into 'master'
Update VAssignDamage: for Loyality

See merge request core-developers/forge!2004
2019-08-04 10:00:55 +00:00
Hans Mackowiak
c58882c046 Update VAssignDamage: for Loyality 2019-08-04 10:00:55 +00:00
Michael Kamensky
b3ad190920 Merge branch '1092-core-2020-planeswalker-loyalty-ability' into 'master'
Resolve "Core 2020: Planeswalker loyalty ability"

Closes #1092

See merge request core-developers/forge!2000
2019-08-04 09:44:12 +00:00
Hanmac
e5b9c313b4 CardView: updateStateForView on GameAction changeZone 2019-08-03 10:39:15 +02:00
Michael Kamensky
9128ae2f93 Merge branch 'typofix4' into 'master'
Various ability text typo fixes

See merge request core-developers/forge!2003
2019-08-03 03:43:46 +00:00
kms70847
a3c859ca74 Various ability text typo fixes 2019-08-02 19:18:10 -04:00
Hanmac
e45babe243 EffectEffect: make an Effect for each Owner 2019-08-02 07:22:43 +02:00
Michael Kamensky
fbf99a7e52 Merge branch 'patch-2' into 'master'
Update Brawl.txt

See merge request core-developers/forge!2001
2019-08-02 03:31:44 +00:00
Sol
b2fc49e582 Update Brawl.txt 2019-08-02 00:50:59 +00:00
Hanmac
773f2b280f Loyalty: use String Property for X 2019-08-01 21:16:07 +02:00
Peter
3e2c9ad162 Wrong translation of Forest... 🤯 2019-08-01 19:43:02 +02:00
Peter
11aa2e37da Replaced with new translation files (fixed wrong regex applied) 2019-08-01 17:51:56 +02:00
Peter
734f584a2e Removed regex formatting (problems with UTF-8...)
Add an additional step of manual patching of language files
2019-08-01 17:49:50 +02:00
Peter
f473baa730 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-08-01 17:00:46 +02:00
Michael Kamensky
e509931f34 Merge branch 'patch-3' into 'master'
Updated cards, by sorting them into alphabetical order.

See merge request core-developers/forge!1999
2019-08-01 14:08:22 +00:00
Viktor Azorius
89c5df5eed Updated cards, by sorting them into alphabetical order. 2019-08-01 14:08:22 +00:00
Michael Kamensky
e193ca9873 Merge branch 'fix-drakuseth' into 'master'
Fix an issue with multitargeting the same card while UniqueTargets is set.

Closes #1113

See merge request core-developers/forge!1998
2019-08-01 14:08:09 +00:00
Michael Kamensky
88ed810e4a Fix an issue with multitargeting the same card while UniqueTargets is set. 2019-08-01 14:08:09 +00:00
Peter
dd607c82b4 Fixed oracleformat function.
Now the resulting translation files are sorted
2019-07-31 18:19:16 +02:00
Peter
e4f41903d4 Changed delimiter from # to | (reminder texts fixed).
Python script now downloads the big json file from scryfall.
Updated spanish and deutsch translations
2019-07-31 17:57:47 +02:00
Peter
00899ff4ce Extract getting translation texts to CardTranslation 2019-07-31 11:59:54 +02:00
Peter
4dc08e04c7 Fix call to new getText function 2019-07-31 11:30:41 +02:00
Peter
23b083d9ab Merge branch 'master' of https://git.cardforge.org/core-developers/forge into ui-card-translation 2019-07-31 11:17:26 +02:00
Michael Kamensky
a6d30137df Merge branch 'gui-mobile-desktop-cursorkeys' into 'master'
Mobile Backport: Cursor keys emulate swipe gestures

See merge request core-developers/forge!1997
2019-07-31 05:10:03 +00:00
Peter
782c594938 Mobile Backport: Cursor keys emulate swipe gestures
First we touch the screen and later swipe (fling) in the direction of the key pressed
2019-07-30 17:24:37 +02:00
Michael Kamensky
8a6a317f56 Merge branch 'typofix3' into 'master'
fix another batch of oracle text typos

See merge request core-developers/forge!1995
2019-07-30 12:39:16 +00:00
Michael Kamensky
4fba4522ba Merge branch 'hqpicdownloaderfix01' into 'master'
Fix HQ Pics Downloader - Backface images

See merge request core-developers/forge!1996
2019-07-30 12:38:57 +00:00
Peter
b23f3d9acc Fix: We need to pass &face=back to API in order to download backface
images correctly.
2019-07-30 14:24:54 +02:00
Peter
cb18a369dd Changed oracle translation using the original getText function (before we lost the getText additional hints when translating).
Needs more translation fixes.
Splitted cards (e.g. Grizzled Outcasts) don't update the translated oracle text.
2019-07-30 13:56:41 +02:00
kms70847
7b83c72e06 fix another batch of oracle text typos 2019-07-30 07:24:48 -04:00
Peter
c7b1e764c6 Not needed to read Forge Preferences because the language selected in UI
is passed when preloading translations.
2019-07-30 12:31:14 +02:00
Peter
98cb151929 Merge branch 'master' into ui-card-translation 2019-07-30 12:19:51 +02:00
Peter
3c23019577 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-07-30 12:16:15 +02:00
Hans Mackowiak
61c42275e6 Dash: reworked and better Haste part 2019-07-30 12:05:29 +02:00
kms70847
200e191f14 When adding cards to library, insert "closest to top" card last 2019-07-30 12:05:29 +02:00
Michael Kamensky
dd8ba357aa Merge branch 'master' into 'master'
Added puzzle PS_M203 - Possibility Storm - Magic Core Set 2020 03.

See merge request core-developers/forge!1994
2019-07-30 08:32:28 +00:00
Agetian
eab262aa7e - Added puzzle PS_M203. 2019-07-30 11:30:26 +03:00
Michael Kamensky
9b62afa7e8 Merge branch 'master' into 'master'
Added SS2 edition (Signature Spellbook: Gideon)

See merge request core-developers/forge!1993
2019-07-30 08:22:08 +00:00
Agetian
bbe324a790 - Added SS2 edition (Signature Spellbook: Gideon) 2019-07-30 11:20:03 +03:00
Michael Kamensky
91327b7310 Merge branch 'controllerInWeirdZonesFix' into 'master'
Cards in graveyards (etc) are always controlled by their owners

See merge request core-developers/forge!1991
2019-07-30 05:37:04 +00:00
Michael Kamensky
d9899636c7 Merge branch 'nicerLondonMulliganMessage' into 'master'
Show the number of cards you need to put back when London mulliganning

See merge request core-developers/forge!1990
2019-07-30 03:27:17 +00:00
Michael Kamensky
01f179168c Merge branch 'hqpicdownloader' into 'master'
Add Download HQ Card Pictures from Scryfall

See merge request core-developers/forge!1983
2019-07-30 03:19:29 +00:00
Michael Kamensky
1c0736d7be Merge branch 'android-language-selector' into 'master'
Android: Add Language selector in Settings

See merge request core-developers/forge!1984
2019-07-30 03:19:18 +00:00
Michael Kamensky
c48b1ea225 Merge branch 'reboundTypoFix' into 'master'
Rebound: "it's manacost" -> "its mana cost"

See merge request core-developers/forge!1992
2019-07-30 03:17:46 +00:00
kms70847
89da830c6c Rebound: "it's manacost" -> "its mana cost" 2019-07-29 23:03:58 -04:00
kms70847
b9cf836c1a Fix for https://git.cardforge.org/core-developers/forge/issues/619 2019-07-29 22:48:54 -04:00
kms70847
60c2119f16 Show the number of cards you need to put back when London mulliganning 2019-07-29 22:01:34 -04:00
Michael Kamensky
df3996f22a Merge branch 'master' into 'master'
Fix ChooseCardEffect crashing for e.g. Curse of the Pierced Heart on a planeswalker

See merge request core-developers/forge!1989
2019-07-29 16:43:21 +00:00
Agetian
37fe37d5d9 - Fix ChooseCardEffect crashing for e.g. Curse of the Pierced Heart on a planeswalker 2019-07-29 19:42:12 +03:00
Peter
668a0c7cc4 Merge remote-tracking branch 'remotes/Forge/master' into ui-card-translation 2019-07-29 08:52:28 +02:00
Michael Kamensky
6fa513fefd Merge branch 'gainControlRework' into 'master'
ControlGain: without addExtrinsicKeyword

See merge request core-developers/forge!1988
2019-07-28 19:55:49 +00:00
Hanmac
6cf5a08be2 Card: remove non hidden extrinsic keyword 2019-07-28 20:00:11 +02:00
Hanmac
599e0bbe4c ControlGain: without addExtrinsicKeyword 2019-07-28 17:47:13 +02:00
Peter
b2562cb89c Mobile: Added oracle translation to front card 2019-07-28 14:34:29 +02:00
Michael Kamensky
6f52632c68 Merge branch 'scrollRackReorder' into 'master'
When adding cards to library, insert "closest to top" card last

See merge request core-developers/forge!1986
2019-07-28 12:21:05 +00:00
Michael Kamensky
c14ec0380c Merge branch 'dashRework' into 'master'
Dash: reworked and better Haste part

See merge request core-developers/forge!1985
2019-07-28 12:21:01 +00:00
Hans Mackowiak
af021e7d2a Dash: reworked and better Haste part 2019-07-28 12:21:01 +00:00
Peter
6d126acd7c Added new font characters to mobile port (diacritics).
Deleted removeDiacritics because it's not needed now in mobile port.
2019-07-28 13:55:15 +02:00
Peter
b6b48be445 Add Python script to generate translations card info files.
It needs the big scryfall-all-cards.json from https://archive.scryfall.com/json/scryfall-all-cards.json
2019-07-28 11:04:41 +02:00
Peter
6e3cadac99 Added es-ES and de-DE translation files (generated via python script) 2019-07-28 11:00:47 +02:00
Peter
21141f3b6a Mobile: Preload card translations and show card name and overlay translated 2019-07-28 09:50:49 +02:00
Peter
24f7de8ee1 Show translated card name in card overlay 2019-07-28 09:40:57 +02:00
Peter
4ffb226100 Preload translations in FModel.
Add cardname translations in CardDetailUtil.
Removed translated flavors in CardTranslations.
Only remove diacritics in mobile port.
2019-07-28 09:31:50 +02:00
Peter
eb7168ea97 Changed normalized accents code 2019-07-28 07:55:21 +02:00
Peter
92bbda14ac Revert "Changed normalized accents code"
This reverts commit 86ce46eb
2019-07-28 07:52:45 +02:00
Peter
86ce46eb4e Changed normalized accents code 2019-07-28 07:52:27 +02:00
kms70847
e94cc348c0 When adding cards to library, insert "closest to top" card last 2019-07-27 19:16:00 -04:00
klaxnek
d717c0b260 Add card translation info (card, type, oracle and flavor).
It reads the translation file from res/language/cardname-languagecode.txt
The translation file is generated via a script using Scryfall info (from big json file).
2019-07-27 12:13:30 +02:00
Peter
198cb4f90a Android: Add Language selector in Settings 2019-07-27 10:17:30 +02:00
Peter
1d8e7a0cb3 Add Download HQ Card Pictures from Scryfall 2019-07-26 18:39:38 +02:00
swordshine
0826f0c01f Merge branch 'patch' into 'master'
Fix the token color of Ajani's Pridemate

See merge request core-developers/forge!1982
2019-07-26 08:58:40 +00:00
swordshine
1e127aa163 Fix the token color of Ajani's Pridemate 2019-07-26 16:58:21 +08:00
Michael Kamensky
a055c54ff7 Merge branch 'epicSplice' into 'master'
EffectSource: now they can know about the SpellAbility that did the Effect for Epic

Closes #1101

See merge request core-developers/forge!1981
2019-07-26 05:47:21 +00:00
Hans Mackowiak
b2fc1844be EffectSource: now they can know about the SpellAbility that did the Effect for Epic 2019-07-26 05:47:21 +00:00
Michael Kamensky
72e5b7dfaa Merge branch 'master' into 'master'
Don't check Morph Down for playability if the card is already on the battlefield

Closes #1107

See merge request core-developers/forge!1980
2019-07-26 05:10:02 +00:00
Agetian
553106741c - Don't check Morph Down for playability if the card is already on the battlefield to avoid side effects. 2019-07-26 08:09:20 +03:00
swordshine
ed842b4fd5 Merge branch 'patch' into 'master'
Update banned list

See merge request core-developers/forge!1979
2019-07-25 14:51:22 +00:00
swordshine
e5473b4193 Update banned list 2019-07-25 22:50:24 +08:00
swordshine
d2b2ef4114 Merge branch '1108-gargos-triggered-from-pulse-of-murasa' into 'master'
Resolve "Gargos triggered from Pulse of Murasa"

Closes #1108

See merge request core-developers/forge!1977
2019-07-25 14:27:57 +00:00
swordshine
7b9ffa7d27 Merge branch 'patch' into 'master'
Fix two cards

See merge request core-developers/forge!1978
2019-07-25 14:27:49 +00:00
swordshine
c9c5f8a0da Fix two cards 2019-07-25 22:27:24 +08:00
Hans Mackowiak
0dbd45edb2 Gargos, Vicious Watcher: fix Target Trigger 2019-07-25 08:39:38 +00:00
Sol
12519605d6 Merge branch 'playCopyCMCFix' into 'master'
PlayEffect: set CopiedPermanent to fix CMC

See merge request core-developers/forge!1976
2019-07-25 01:07:50 +00:00
Hans Mackowiak
3368a45455 PlayEffect: set CopiedPermanent to fix CMC 2019-07-25 01:07:50 +00:00
Michael Kamensky
80df2b0275 Merge branch 'add-khans-expanded-cube' into 'master'
Add Elliot Raff's Khans Expanded Cube (MTGO)

See merge request core-developers/forge!1975
2019-07-24 10:19:24 +00:00
pfirpfel
b73bd5a46c Add Elliot Raff's Khans Expanded Cube (MTGO) 2019-07-24 12:00:14 +02:00
Michael Kamensky
f7b0a0d9ab Merge branch '1091-vivien-arkbow-ranger-unable-to-complete-plus-ability-with-0-targets' into 'master'
Resolve "Vivien, Arkbow Ranger unable to complete plus ability with 0 targets"

Closes #1091

See merge request core-developers/forge!1974
2019-07-24 05:34:29 +00:00
Hans Mackowiak
440f215a14 Resolve "Vivien, Arkbow Ranger unable to complete plus ability with 0 targets" 2019-07-24 05:34:29 +00:00
Michael Kamensky
0a52238816 Merge branch 'typofix2' into 'master'
Fix typos in the oracle text of various cards

See merge request core-developers/forge!1972
2019-07-24 04:14:43 +00:00
Michael Kamensky
d19366da46 Merge branch 'workshopNewline' into 'master'
Cardfiles saved in the workshop should end with a newline

See merge request core-developers/forge!1973
2019-07-24 04:13:46 +00:00
kms70847
be52002a48 Cardfiles saved in the workshop should end with a newline 2019-07-23 20:51:06 -04:00
kms70847
1db0cd99c2 Fix typos in the oracle text of various cards 2019-07-23 19:46:38 -04:00
Michael Kamensky
222a0ee16e Merge branch 'master' into 'master'
Added puzzle PS_M202 - Possibility Storm - Magic Core Set 2020 02

See merge request core-developers/forge!1971
2019-07-23 18:27:06 +00:00
Agetian
64c8edd520 - Added puzzle PS_M202. 2019-07-23 21:26:17 +03:00
swordshine
496124cc1f Merge branch 'patch' into 'master'
Fix two cards

See merge request core-developers/forge!1970
2019-07-23 11:23:43 +00:00
swordshine
58227bd11b Fix two cards 2019-07-23 19:23:16 +08:00
swordshine
50ee2a78ad Merge branch 'patch' into 'master'
Add two ELD cards

See merge request core-developers/forge!1969
2019-07-23 02:57:14 +00:00
swordshine
781423074e Add two ELD cards 2019-07-23 10:56:48 +08:00
Michael Kamensky
7b93cae29b Merge branch 'master' into 'master'
Somewhat better logic for Risk Factor.

Closes #1105

See merge request core-developers/forge!1968
2019-07-22 16:51:44 +00:00
Agetian
edbf3801f8 - Somewhat better logic for Risk Factor. 2019-07-22 19:50:56 +03:00
swordshine
2727bcad77 Merge branch 'patch-2' into 'master'
Chandras Regulator: fix discard CostDesc

See merge request core-developers/forge!1967
2019-07-22 13:42:20 +00:00
Hans Mackowiak
52aaf8a949 Chandras Regulator: fix discard CostDesc 2019-07-22 13:42:19 +00:00
swordshine
506b03619d Merge branch 'woodlandChampion' into 'master'
Woodland Champion: add ChangeZoneAll Trigger to Token Effects

See merge request core-developers/forge!1956
2019-07-22 05:18:49 +00:00
Hans Mackowiak
ef0af2d769 Woodland Champion: add ChangeZoneAll Trigger to Token Effects 2019-07-22 05:18:49 +00:00
Michael Kamensky
f1eb4609b7 Merge branch 'token-viewer-patch-unsets' into 'master'
Token viewer patch

See merge request core-developers/forge!1960
2019-07-21 18:37:24 +00:00
Michael Kamensky
71eb80de4d Merge branch 'mps_war' into 'master'
Add WAR Mythic Edition

See merge request core-developers/forge!1966
2019-07-21 18:36:32 +00:00
Michael Kamensky
59c37dfdad Merge branch 'patch' into 'master'
Fix an NPE in getBestPlaneswalkerToDamage (for Chandra, Awakened Inferno)

See merge request core-developers/forge!1964
2019-07-21 18:36:25 +00:00
swordshine
2c71f574bf Merge branch 'newlinefix' into 'master'
remove literal "\n" sequences from AbilityDescription and SpellDescriptions,...

See merge request core-developers/forge!1965
2019-07-21 14:09:04 +00:00
schnautzr
31d17f4d26 War of the Spark Mythic Edition 2019-07-21 08:38:04 -05:00
kms70847
45ed12cddd remove literal "\n" sequences from AbilityDescription and SpellDescriptions, since they don't get rendered anyway 2019-07-21 08:47:52 -04:00
swordshine
13b4fd2600 Fix getBestPlaneswalkerToDamage (new chandra's ultimate has a -X cost, which cannot be handled by the convertAmount method) 2019-07-21 16:26:36 +08:00
Alessandro Coli
adb1ef35d9 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-20 13:12:50 +02:00
swordshine
45a44a8e39 Merge branch 'patch' into 'master'
Fix Cavalier of Thorns

See merge request core-developers/forge!1963
2019-07-19 06:24:30 +00:00
swordshine
b695c35ee6 Fix Cavalier of Thorns 2019-07-19 14:24:09 +08:00
swordshine
499cac0ca1 Merge branch 'm20deckgen' into 'master'
M20 standard deckgen data

See merge request core-developers/forge!1962
2019-07-19 00:29:31 +00:00
austinio7116
9adf1c72c4 M20 standard deckgen data
(cherry picked from commit fd3b3a1)
2019-07-18 22:36:32 +01:00
Alessandro Coli
df85278a44 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-18 12:51:43 +02:00
swordshine
f6869c95fb Merge branch 'patch-2' into 'master'
Card Patches

See merge request core-developers/forge!1961
2019-07-18 08:13:59 +00:00
Hans Mackowiak
7f34c835d9 Cavalier of Night: fix ImmediateTrigger TriggerDescription 2019-07-18 07:29:51 +00:00
Hans Mackowiak
51c52c7867 Cavalier of Flame: Damage not optional 2019-07-18 07:28:09 +00:00
Hans Mackowiak
02ddbeaf64 Field of the Dead: fix double trigger on ETB 2019-07-18 07:24:01 +00:00
Alessandro Coli
7a04669560 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-18 09:09:03 +02:00
Rob Schnautz
dd602b933a Delete b_2_2_rogue.txt 2019-07-17 04:40:44 +00:00
schnautzr
d044d1d120 fix rogue token 2019-07-16 23:31:41 -05:00
schnautzr
d006f01afb Fix UST token list, add scripts for the ones that are filling up the logfile with errors. 2019-07-16 22:52:12 -05:00
Michael Kamensky
c76c5e0328 Merge branch 'format-key-fix' into 'master'
Update forge-gui/res/formats/Historic/DCI/Extended/2013-07-19.txt,...

See merge request core-developers/forge!1959
2019-07-17 03:37:12 +00:00
Rob Schnautz
505798b635 Update forge-gui/res/formats/Historic/DCI/Extended/2013-07-19.txt, forge-gui/res/formats/Historic/DCI/Extended/2012-07-13.txt, forge-gui/res/formats/Historic/DCI/Vintage/2003-04-01.txt files 2019-07-16 16:43:23 +00:00
Michael Kamensky
c8dc6f5e31 Merge branch 'master' into 'master'
Added puzzle PS_M201 - Possibility Storm - Core Set 2020 01

See merge request core-developers/forge!1958
2019-07-16 12:39:01 +00:00
Agetian
a477b0ebc0 - Added puzzle PS_M201. 2019-07-16 15:38:09 +03:00
swordshine
275e08f4f8 Merge branch 'patch-2' into 'master'
Saheeli, Sublime Artificer: fix clone target

See merge request core-developers/forge!1957
2019-07-15 07:44:21 +00:00
Hans Mackowiak
2388eba0b2 Saheeli, Sublime Artificer: fix clone target 2019-07-15 07:44:21 +00:00
Michael Kamensky
0dad6068c3 Merge branch 'chorusRework' into 'master'
Chorus of the Conclave: moved to addExtraKeywordCost

See merge request core-developers/forge!1955
2019-07-14 17:54:41 +00:00
Hans Mackowiak
af2e2caf24 Chorus of the Conclave: moved to addExtraKeywordCost 2019-07-14 17:54:41 +00:00
Alessandro Coli
2e24a1bde4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-14 13:35:09 +02:00
swordshine
2992b1cd68 Merge branch '1062-digeffect-with-three-and-or' into 'master'
Resolve "DigEffect with three and/or"

Closes #1062

See merge request core-developers/forge!1949
2019-07-14 10:14:45 +00:00
swordshine
209ea120bc Merge branch 'patch-2' into 'master'
Update Domri's Ambush DamageSource

See merge request core-developers/forge!1954
2019-07-14 10:14:34 +00:00
Hans Mackowiak
7b7cd089ff Update Domri's Ambush DamageSource 2019-07-14 10:14:34 +00:00
Alessandro Coli
16134cb857 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-14 09:03:33 +02:00
Michael Kamensky
a68eb85280 Merge branch 'master' into 'master'
Fix 2x DamageDone replacement effect not affecting damage from Emblems

Closes #1097

See merge request core-developers/forge!1953
2019-07-14 04:11:46 +00:00
Hanmac
4182ad7395 DigEffect: remove AndOrValid 2019-07-14 05:59:04 +02:00
Agetian
2e2911de2c - Fix 2x DamageDone replacement effect not affecting damage from Emblems 2019-07-13 19:17:31 +03:00
Hanmac
4fa0419dd3 DigMultiple: refactor cards using AndOrValid 2019-07-13 14:40:34 +02:00
Alessandro Coli
d396a8755b Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-12 18:52:27 +02:00
Michael Kamensky
e7e8293fd2 Merge branch 'master' into 'master'
Fix AI logic for a couple cards

Closes #1096 and #1095

See merge request core-developers/forge!1952
2019-07-12 16:10:57 +00:00
Agetian
87b53ed127 - Fix AI logic for Ancient Animus
- Fix AI logic for Priest of Forgotten Gods
2019-07-12 19:10:07 +03:00
Agetian
f6ae65d901 - Basic AI support for DigMultipleEffect
- Reveal fix in DigMultipleEffect
2019-07-12 19:09:12 +03:00
Agetian
a5c55c85cd - Add Kaalia, Zenith Seeker
- Add DigMultiple to the effect API enumeration
2019-07-12 13:55:23 +03:00
swordshine
6e4744baac Merge branch 'patch' into 'master'
Fix Gideon's Battle Cry

See merge request core-developers/forge!1951
2019-07-12 01:34:06 +00:00
swordshine
bac67caa87 Fix Gideon's Battle Cry 2019-07-12 09:33:35 +08:00
swordshine
510c7c1af1 Merge branch 'patch' into 'master'
Fix Blightbeetle

See merge request core-developers/forge!1950
2019-07-12 01:22:23 +00:00
swordshine
5e831bd8c6 Fix Blightbeetle 2019-07-12 09:21:25 +08:00
Hanmac
371379def8 DigMultipleEffect: new effect for Kaalia 2019-07-11 07:18:42 +02:00
Alessandro Coli
7617b95fae Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-10 20:23:03 +02:00
Michael Kamensky
dc6ec874b1 Merge branch 'm20-printsheets' into 'master'
M20 printsheets

See merge request core-developers/forge!1948
2019-07-10 03:55:24 +00:00
Sol
cb7b660479 Update printsheets.txt 2019-07-10 00:39:37 +00:00
Sol
604b4ac58c Update Magic 2020.txt 2019-07-10 00:37:15 +00:00
swordshine
0c20b9983c Merge branch 'patch' into 'master'
Add Woodland Mystic

See merge request core-developers/forge!1947
2019-07-09 08:08:11 +00:00
swordshine
abf2326d23 Add Woodland Mystic 2019-07-09 16:05:32 +08:00
swordshine
6de03d8f0b Merge branch 'master' into 'master'
M20 AI hints

See merge request core-developers/forge!1946
2019-07-09 07:44:45 +00:00
Agetian
e08f34539d - Revert hint on Faerie Miscreant until further investigation. 2019-07-09 08:15:34 +03:00
Agetian
34633ded24 - M20 AI hints 2019-07-09 08:12:14 +03:00
Michael Kamensky
2ec04c1a83 Merge branch 'etbReorder3' into 'master'
Print all "enters the battlefield" replacement abilities above triggered...

See merge request core-developers/forge!1941
2019-07-08 09:52:33 +00:00
Michael Kamensky
eeb8b7bc6c Merge branch '1087-splice-onto-sorcery-can-be-done-on-eot-triggers' into 'master'
Resolve "Splice onto Sorcery can be done on EoT triggers"

Closes #1087

See merge request core-developers/forge!1945
2019-07-08 09:52:22 +00:00
Michael Kamensky
5c4f2ab8bc Merge branch 'replicateConspire' into 'master'
Replicate rework

Closes #1068

See merge request core-developers/forge!1929
2019-07-08 09:52:20 +00:00
Hans Mackowiak
3ca71ccd7b - Basic AI for the revised Replicate and Conspire (will currently mimic the old behavior of paying as much as possible, to be improved) 2019-07-08 09:52:20 +00:00
Hans Mackowiak
cb7ab5b981 AbilityUtils: Splice only for Spells 2019-07-08 07:43:56 +00:00
Michael Kamensky
8b268a3f05 Merge branch 'master' into 'master'
- Preparing Forge for Android publish 1.6.27.001 [incremental]

See merge request core-developers/forge!1944
2019-07-08 06:27:43 +00:00
Agetian
d2b98bcec6 - Preparing Forge for Android publish 1.6.27.001 [incremental] 2019-07-08 09:27:14 +03:00
Blacksmith
6eb0fdd9da Clear out release files in preparation for next release 2019-07-08 01:01:10 +00:00
Blacksmith
9a12564054 [maven-release-plugin] prepare for next development iteration 2019-07-08 00:55:54 +00:00
Blacksmith
118e86ec92 [maven-release-plugin] prepare release forge-1.6.27 2019-07-08 00:55:48 +00:00
Blacksmith
27c2ecaf6c Update README.txt for release 2019-07-08 00:53:17 +00:00
Sol
0795755290 Merge branch 'patch-2' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!1943
2019-07-08 00:44:05 +00:00
Sol
5b488c7f56 Update ANNOUNCEMENTS.txt 2019-07-08 00:43:52 +00:00
Sol
732ffdff18 Merge branch 'fix-chandras-spitfire' into 'master'
Fix Chandra Spitfire not triggering on damage from Emblems

Closes #1086

See merge request core-developers/forge!1942
2019-07-07 14:06:02 +00:00
Alessandro Coli
ecdda5b678 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-07 15:55:17 +02:00
Agetian
27bfe72491 - Fix Chandra Spitfire not triggering on damage from Emblems 2019-07-07 15:26:39 +03:00
Michael Kamensky
6dc982e0bc Merge branch 'octopusFix' into 'master'
Octopus fix

See merge request core-developers/forge!1940
2019-07-07 03:43:27 +00:00
kms70847
1e6ba6c6ed Print all "enters the battlefield" replacement abilities above triggered abilities, not just "enters the battlefield tapped" specifically. 2019-07-06 16:56:47 -04:00
kms70847
e3f04333e6 Fix the wording of the triggered ability. 2019-07-06 15:59:06 -04:00
kms70847
3745942868 Add the 8/8 power/toughness setting ability to the card description panel 2019-07-06 15:54:06 -04:00
swordshine
d9ff6680b8 Merge branch 'budokaFix' into 'master'
Set the token's power and toughness to X

See merge request core-developers/forge!1939
2019-07-06 02:30:40 +00:00
kms70847
b13347190d Set the token's power and toughness to X 2019-07-05 20:40:02 -04:00
swordshine
58649ab6ed Merge branch 'm20fixes' into 'master'
Final editions file for M20 with additional hidden cards - moved from upcoming

See merge request core-developers/forge!1937
2019-07-05 06:28:34 +00:00
austinio7116
cb692db9dc Updated changes with details of the new random modern world in quest mode 2019-07-05 06:25:12 +01:00
maustin
cc22094c95 Merge remote-tracking branch 'Austin/m20fixes' into m20fixes 2019-07-05 06:21:07 +01:00
austinio7116
d15062b59a Move upcoming ready for release 2019-07-05 06:19:26 +01:00
austinio7116
cd4f9157c8 Final editions file for M20 with additional hidden cards 2019-07-05 06:19:26 +01:00
austinio7116
62e9c897af Final editions file for M20 with additional hidden cards 2019-07-05 06:19:26 +01:00
austinio7116
9136a80a47 Move upcoming ready for release 2019-07-05 06:18:19 +01:00
austinio7116
f1528c7711 Final editions file for M20 with additional hidden cards 2019-07-05 06:13:36 +01:00
swordshine
a8110158ab Merge branch 'patch' into 'master'
Fix Masterful Replication

See merge request core-developers/forge!1938
2019-07-05 00:22:23 +00:00
swordshine
95259b994b Fix Masterful Replication 2019-07-05 08:22:03 +08:00
austinio7116
d6c8fed2fe Final editions file for M20 with additional hidden cards 2019-07-04 09:48:29 +01:00
Michael Kamensky
24c6794c2b Merge branch 'master' into 'master'
A couple card fixes

Closes #1083 and #1084

See merge request core-developers/forge!1936
2019-07-03 10:57:53 +00:00
Agetian
510ec7d7b4 - Fixed Diviner's Lockbox. 2019-07-03 13:56:50 +03:00
Agetian
330a811dd0 - Fix ChangeZone UI for Sideboard->Library (and possibly other cases going through this code path) 2019-07-03 13:53:35 +03:00
swordshine
53f26133b3 Merge branch 'm20fixes' into 'master'
Fixed Vivien Arkbow Ranger

See merge request core-developers/forge!1935
2019-07-03 01:28:42 +00:00
austinio7116
d0df99bc27 Fixed Vivien Arkbow Ranger 2019-07-02 22:34:34 +01:00
Alessandro Coli
2a16a29ea2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-02 19:15:49 +02:00
Michael Kamensky
961537ab51 Merge branch 'master' into 'master'
Added puzzle PS_WAR9 - Possibility Storm - War of the Spark 09

See merge request core-developers/forge!1934
2019-07-02 04:38:03 +00:00
Agetian
00a45ba2ba - Added puzzle PS_WAR9 2019-07-02 07:36:58 +03:00
swordshine
bbf6ae2d6f Merge branch 'master' into 'master'
Fix Nightpack Ambusher

Closes #1080

See merge request core-developers/forge!1933
2019-07-02 04:10:11 +00:00
Agetian
0db02d4104 - Fix Nightpack Ambusher 2019-07-02 06:59:04 +03:00
swordshine
7abcb92c6d Merge branch 'patch' into 'master'
Fix Flood of Tears

See merge request core-developers/forge!1932
2019-07-01 15:55:36 +00:00
swordshine
9b13312d17 Fix Flood of Tears 2019-07-01 23:55:18 +08:00
Michael Kamensky
de2ef63635 Merge branch 'master' into 'master'
Fix Precursor Golem

See merge request core-developers/forge!1931
2019-07-01 14:46:09 +00:00
Agetian
92b391cde4 - Added a zone specifier to the copy part of Precursor Golem. 2019-07-01 17:31:48 +03:00
Agetian
8d2fb8da4b - Fix Precursor Golem. 2019-07-01 17:21:26 +03:00
Michael Kamensky
2993136455 Merge branch 'master' into 'master'
Assorted card fixes

Closes #1074, #1075, and #1076

See merge request core-developers/forge!1930
2019-07-01 13:46:50 +00:00
Agetian
4b4adad411 - Assorted card fixes 2019-07-01 16:46:07 +03:00
swordshine
810e2bcd38 Merge branch 'patch' into 'master'
Fix an AI cheat when using ExceptSelf logic

See merge request core-developers/forge!1928
2019-06-30 14:58:18 +00:00
swordshine
a2332addae Fix an AI cheat when using ExceptSelf logic 2019-06-30 22:56:12 +08:00
Michael Kamensky
94b22b2e9c Merge branch 'master' into 'master'
Fix Herald of the Sun

Closes #1072

See merge request core-developers/forge!1927
2019-06-30 04:48:16 +00:00
Agetian
608c1f37a5 - Fix Herald of the Sun 2019-06-30 07:46:34 +03:00
Alessandro Coli
81d7bec2cd Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-29 10:10:20 +02:00
Michael Kamensky
e51ad44f41 Merge branch 'netdecks' into 'master'
More of Churrufli's metagame netdecks

See merge request core-developers/forge!1926
2019-06-29 07:40:17 +00:00
austinio7116
51281e8e44 More of Churrufli's metagame netdecks 2019-06-29 07:04:21 +01:00
swordshine
e84ce13481 Merge branch 'patch' into 'master'
Fix a typo

See merge request core-developers/forge!1925
2019-06-29 05:48:38 +00:00
swordshine
c849fdaa17 Fix a typo 2019-06-29 13:48:13 +08:00
swordshine
e11016cf04 Merge branch 'patch' into 'master'
More M20 Fix

See merge request core-developers/forge!1924
2019-06-29 04:12:41 +00:00
swordshine
761b75f15a Fix Rienne 2019-06-29 11:57:13 +08:00
swordshine
7db1b2a02c Merge branch 'patch' into 'master'
Fix Wakeroot Elemental

See merge request core-developers/forge!1923
2019-06-28 16:22:31 +00:00
swordshine
80ac6eba1c Fix Wakeroot Elemental 2019-06-29 00:21:43 +08:00
swordshine
dc06e00278 Merge branch 'patch' into 'master'
Add Pattern Matcher

See merge request core-developers/forge!1918
2019-06-28 09:57:55 +00:00
swordshine
6f6ad458e9 Add Pattern Matcher 2019-06-28 11:50:42 +08:00
swordshine
198309da75 Merge branch 'master' into 'master'
Give r_7_1_elemental_trample_haste trample

See merge request core-developers/forge!1922
2019-06-28 00:02:08 +00:00
Isaac Butterfield
2c53e74e2b Give r_7_1_elemental_trample_haste trample 2019-06-27 18:24:13 +00:00
Michael Kamensky
e6a4f5422b Merge branch 'm20fixes' into 'master'
Corrected name of treasure token in editions file

See merge request core-developers/forge!1919
2019-06-27 16:26:54 +00:00
Michael Kamensky
ed93d94697 Merge branch 'master' into 'master'
Added M20 planeswalker achievements by Marek14

See merge request core-developers/forge!1921
2019-06-27 16:26:28 +00:00
Agetian
8115e09a18 - Added M20 planeswalker achievements by Marek14 2019-06-27 19:25:39 +03:00
Michael Kamensky
e1dc8d3b59 Merge branch 'master' into 'master'
Disable the ability for the AI that it can't pay the cost for (on a RemAIDeck card)

Closes #1070

See merge request core-developers/forge!1920
2019-06-27 16:16:08 +00:00
Agetian
77e3d9dbc6 - Disable the ability for the AI that it can't pay the cost for (on a RemAIDeck card) 2019-06-27 19:15:21 +03:00
austinio7116
abc0e5d4e0 Corrected name of treasure token in editions file 2019-06-27 17:11:43 +01:00
austinio7116
b09e8074fa Corrected name of treasure token in editions file 2019-06-27 17:06:56 +01:00
swordshine
cdb77daf6b Add ailogic for Lotus Field 2019-06-27 23:29:30 +08:00
swordshine
29b56797c3 Merge branch 'patch' into 'master'
Add two cards

See merge request core-developers/forge!1917
2019-06-27 15:01:44 +00:00
swordshine
b9559c1b06 Add two cards 2019-06-27 23:00:22 +08:00
swordshine
e9968a88e6 Merge branch 'm20fixes' into 'master'
Fixed omnath's duplicate Svars

See merge request core-developers/forge!1916
2019-06-27 05:38:28 +00:00
austinio7116
6694d58cd8 Switched omnath to use conditionpresent 2019-06-27 06:32:50 +01:00
austinio7116
75fb9a6e9e Switched omnath to use ispresent 2019-06-27 06:30:04 +01:00
austinio7116
2c999008d5 Fixed omnath's duplicate Svars 2019-06-27 06:28:00 +01:00
swordshine
f4d6d2931c Merge branch 'm20' into 'master'
M20

See merge request core-developers/forge!1905
2019-06-27 05:17:49 +00:00
Michael Kamensky
d39eb5b26a Merge branch 'm20rankings' into 'master'
Preparing for M20 constructed and draft formats - rankings scraped from draftsim

See merge request core-developers/forge!1915
2019-06-27 03:24:54 +00:00
Michael Kamensky
c719e03b94 Merge branch 'updatedshopimages' into 'master'
Updated product images for recent sets - already present in FTP

See merge request core-developers/forge!1914
2019-06-27 03:24:06 +00:00
swordshine
b40ef41ad2 Fix two cards 2019-06-27 08:30:15 +08:00
austinio7116
6a54481d97 Preparing for M20 constructed and draft formats - rankings scraped from draftsim
(cherry picked from commit c452ac2)
2019-06-26 23:35:25 +01:00
austinio7116
05a736bcbe Switched to correct naming convention 2019-06-26 23:04:09 +01:00
austinio7116
aa7a9c09af Updated product images for recent sets - already present in FTP 2019-06-26 17:16:29 +01:00
swordshine
5f82039e84 Add two cards 2019-06-26 23:59:31 +08:00
Rob Schnautz
c163da47e6 delete reprint 2019-06-26 15:27:33 +00:00
swordshine
1367a4465f Merge branch 'master' into 'master'
Fix Nightpack Ambusher

See merge request core-developers/forge!1913
2019-06-26 14:46:09 +00:00
swordshine
f5a05cdfb9 Fix Nightpack Ambusher 2019-06-26 22:45:21 +08:00
Rob Schnautz
1470a9c583 Update Magic 2020.txt 2019-06-26 14:38:24 +00:00
swordshine
c16f0b9c64 Update a card 2019-06-26 19:27:14 +08:00
swordshine
0b705e062b Update forgescribed cards 2019-06-26 19:20:27 +08:00
swordshine
a70b9415d0 Merge branch 'patch-2' into 'master'
Risen Reef: add ForgetChanged so the Land isn't added to Hand if it enters the Battlefield

See merge request core-developers/forge!1912
2019-06-26 07:51:57 +00:00
Hans Mackowiak
ade716a9cf Risen Reef: add ForgetChanged so the Land isn't added to Hand if it enters the Battlefield 2019-06-26 07:51:57 +00:00
swordshine
03fc16cb56 Add forgescribed cards by Austinio7116 2019-06-26 12:13:08 +08:00
Rob Schnautz
4017dff71c Update printsheets.txt 2019-06-26 00:11:42 +00:00
Rob Schnautz
e706cd6f6c Update Magic 2020.txt 2019-06-26 00:08:46 +00:00
Michael Kamensky
9628c8d3fe Merge branch 'lotusFieldFix' into 'master'
Lotus field should add three mana, not one

See merge request core-developers/forge!1911
2019-06-25 14:27:47 +00:00
swordshine
498ab89757 Merge branch 'typoFix' into 'master'
Change the wording of four cards from "remove a +1/+1 counter from Creature...

See merge request core-developers/forge!1909
2019-06-25 14:13:09 +00:00
swordshine
aa203680de Merge branch 'arcadesTypo' into 'master'
add missing "defender" to ability description

See merge request core-developers/forge!1910
2019-06-25 14:12:14 +00:00
kms70847
f1ea190acf Lotus field should add three mana, not one 2019-06-25 10:07:44 -04:00
kms70847
7f3f5276e8 add missing "defender" to ability description 2019-06-25 10:04:00 -04:00
kms70847
82409960d8 Change the wording of four cards from "remove a +1/+1 counter from Creature you Control" to "remove a +1/+1 counter from a creature you control" 2019-06-25 09:48:49 -04:00
swordshine
eebf60276d Add today's forgescribe cards 2019-06-25 19:31:50 +08:00
Michael Kamensky
cc1179ae6d Merge branch 'master' into 'master'
Added puzzle PS_WAR8 - Possibility Storm - War of the Spark 08

See merge request core-developers/forge!1908
2019-06-25 08:53:21 +00:00
Agetian
7580dd91bb - Added puzzle PS_WAR8 2019-06-25 11:50:29 +03:00
Michael Kamensky
12fad7906b Merge branch 'mh1deckgen' into 'master'
MH1 modern deck generation data

See merge request core-developers/forge!1907
2019-06-25 05:56:28 +00:00
austinio7116
84bcc1418f MH1 modern deck generation data
(cherry picked from commit 3ef010c)
2019-06-25 06:26:25 +01:00
swordshine
fbc8415b35 Add Veil of Summer 2019-06-25 12:59:01 +08:00
swordshine
8ec454b908 Add Scheming Symmetry 2019-06-25 12:43:03 +08:00
swordshine
fff0916d47 Fix Vivien 2019-06-25 12:24:03 +08:00
swordshine
9436c9f759 Update forgescribed cards by Austinio7116 2019-06-25 12:19:32 +08:00
swordshine
0c3868b9cc Merge branch 'precombat-simple' into 'master'
Clean up isPreCombatMain and related

See merge request core-developers/forge!1906
2019-06-25 04:07:25 +00:00
Rob Schnautz
0d9be130d2 Update Magic 2020.txt 2019-06-25 03:45:21 +00:00
Adam Pantel
2c5699ae17 Clean up isPreCombatMain and related 2019-06-24 22:32:57 -04:00
Michael Kamensky
cd2c66da66 Merge branch 'master' into 'master'
Internationalisation (reverting GroupDef.java andColumnDef.java)

See merge request core-developers/forge!1904
2019-06-24 16:03:06 +00:00
swordshine
d0c5c07c8d Add Thought Distortion 2019-06-24 23:26:27 +08:00
swordshine
feae5779a7 Merge branch 'm20' into 'master'
M20

See merge request core-developers/forge!1903
2019-06-24 11:16:54 +00:00
swordshine
4b0c412547 Add Embodiment of Agonies 2019-06-24 19:11:13 +08:00
swordshine
72da47cc67 Add Loxodon Lifechanter 2019-06-24 13:46:28 +08:00
churrufli
02d59e668f Merge remote-tracking branch 'origin/master' 2019-06-24 07:03:58 +02:00
churrufli
34fcb0cca5 reverting GroupDef.java 2019-06-24 07:03:37 +02:00
Agetian
25112dac67 - Most likely not the best idea in case the AI wants to just sweep the board 2019-06-24 06:54:42 +02:00
Agetian
7746547f18 - Added a couple AI hints 2019-06-24 06:54:42 +02:00
Agetian
05ee9afcac - One of the changes in Lands WRG unneeded 2019-06-24 06:54:42 +02:00
Agetian
25753585a5 - Fix an issue with the theme deck generator hanging on certain decks (-1 -1 BG Counters, Lands WRG) 2019-06-24 06:54:42 +02:00
Agetian
a8d60afd17 - Most likely not the best idea in case the AI wants to just sweep the board 2019-06-24 06:54:34 +02:00
Agetian
34866c9ac2 - Added a couple AI hints 2019-06-24 06:54:34 +02:00
Agetian
caa9e92a3a - One of the changes in Lands WRG unneeded 2019-06-24 06:54:34 +02:00
Agetian
bad2c9bb3f - Fix an issue with the theme deck generator hanging on certain decks (-1 -1 BG Counters, Lands WRG) 2019-06-24 06:54:34 +02:00
churrufli
b91773f73f Moving hard-coded text to res files 2019-06-24 06:54:33 +02:00
churrufli
181aa0f2ab Moving hard-coded text to res files 2019-06-24 06:54:33 +02:00
swordshine
131284d35f Fix Sorin 2019-06-24 12:53:35 +08:00
swordshine
49e9f86f36 Merge branch 'm20' into 'master'
M20

See merge request core-developers/forge!1890
2019-06-24 02:13:33 +00:00
swordshine
d6af23958e Add Dread Presence. 2019-06-24 10:12:28 +08:00
Hans Mackowiak
8a0b8242f0 Player: fix monarch and blessing 2019-06-23 23:57:59 +02:00
Agetian
245c021ed7 - Most likely not the best idea in case the AI wants to just sweep the board 2019-06-23 23:57:59 +02:00
Agetian
c83c77052e - Added a couple AI hints 2019-06-23 23:57:58 +02:00
Agetian
762fe37237 - Somewhat improve the AI for combat pumps coming from permanents 2019-06-23 23:57:58 +02:00
Agetian
1ce2556e99 - Improve the AI for combat pumps when it comes to timing the activation. 2019-06-23 23:57:58 +02:00
Agetian
05b2b95cac - One of the changes in Lands WRG unneeded 2019-06-23 23:57:58 +02:00
Agetian
a677ef2b9a - Fix an issue with the theme deck generator hanging on certain decks (-1 -1 BG Counters, Lands WRG) 2019-06-23 23:57:58 +02:00
Michael D
ac333e7425 Update Hypercube to intended drafting format. 2019-06-23 23:57:58 +02:00
austinio7116
2c12e12e89 Improved land counts in deck generation to use linear regression to generate land requirements from average CMC - also increased variance of CMC ratios and reduced land count requirements if filtered decks enabled 2019-06-23 23:57:58 +02:00
kms70847
97082267d1 Use FMouseAdapter's onLeftDoubleClick event for double click detection in ListChooser. 2019-06-23 23:57:58 +02:00
Michael Kamensky
59d259e764 Merge branch 'removecomlabels' into 'master'
Removing Commander from the list of formats shown in the deck item view as it...

See merge request core-developers/forge!1901
2019-06-23 18:05:17 +00:00
austinio7116
b7fb52c7a0 Removing Commander from the list of formats shown in the deck item view as it only checks against the banlist, not other deckbuilding requirements.
(cherry picked from commit a6f3371)
2019-06-23 18:29:11 +01:00
swordshine
1675030f40 Update a card 2019-06-23 18:30:39 +08:00
swordshine
a7d34be796 Add Masterful Replication 2019-06-23 11:31:06 +08:00
swordshine
286fa173a8 Add Diviner's Lockbox 2019-06-23 00:11:03 +08:00
Alessandro Coli
87ffbe4c20 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-22 17:22:36 +02:00
swordshine
72eb4d4f0e Merge branch 'monarchBlessing' into 'master'
Player: fix monarch and blessing

See merge request core-developers/forge!1900
2019-06-22 10:22:37 +00:00
Hans Mackowiak
bc4c5bed1c Player: fix monarch and blessing 2019-06-22 10:22:37 +00:00
swordshine
087ca8b08f Forgescribed cards, edited. 2019-06-22 16:17:09 +08:00
Michael Kamensky
c4d20d870f Merge branch 'master' into 'master'
Added an AI hint

See merge request core-developers/forge!1899
2019-06-22 05:22:33 +00:00
Agetian
f5c553c51e - Most likely not the best idea in case the AI wants to just sweep the board 2019-06-22 08:22:14 +03:00
Agetian
ebde3de7d8 - Added a couple AI hints 2019-06-22 08:09:48 +03:00
Michael Kamensky
550de5e9e6 Merge branch 'master' into 'master'
Somewhat improve the AI for combat pumps coming from permanents

Closes #1064

See merge request core-developers/forge!1898
2019-06-21 17:50:55 +00:00
Agetian
3ef5e82c46 - Somewhat improve the AI for combat pumps coming from permanents 2019-06-21 20:49:30 +03:00
Michael Kamensky
24dcaa6caa Merge branch 'master' into 'master'
Improve the timing for activating combat pumps

Closes #1066

See merge request core-developers/forge!1897
2019-06-21 15:56:43 +00:00
Agetian
12e3dd2198 - Improve the AI for combat pumps when it comes to timing the activation. 2019-06-21 18:55:57 +03:00
swordshine
44fc3567b0 Update three cards 2019-06-21 19:53:32 +08:00
swordshine
4d50de2777 Update some scripts 2019-06-21 15:49:38 +08:00
swordshine
5604118176 Update some scripts 2019-06-21 15:09:21 +08:00
austinio7116
f0b25bf135 Some Forgescribe scripts cleaned up and ready
(cherry picked from commit 4754ace)
2019-06-21 06:37:28 +01:00
churrufli
2d0b39141f Moving hard-coded text to res files 2019-06-21 00:41:06 +02:00
Michael Kamensky
d91e36ab7f Merge branch 'master' into 'master'
Fix an issue with the theme deck generator hanging on certain decks

Closes #1024

See merge request core-developers/forge!1896
2019-06-20 16:34:22 +00:00
Agetian
a686573ea7 - One of the changes in Lands WRG unneeded 2019-06-20 19:33:42 +03:00
Agetian
e8ceda3a12 - Fix an issue with the theme deck generator hanging on certain decks (-1 -1 BG Counters, Lands WRG) 2019-06-20 19:30:36 +03:00
swordshine
b74f8e51ab Update some forgescribe cards 2019-06-21 00:10:55 +08:00
Michael Kamensky
e92456bba1 Merge branch 'NoHangingLists' into 'master'
Use FMouseAdapter's `onLeftDoubleClick` event for double click detection in ListChooser.

See merge request core-developers/forge!1889
2019-06-20 15:54:12 +00:00
Michael Kamensky
c03f83b10f Merge branch 'master' into 'master'
Update Hypercube to intended drafting format.

See merge request core-developers/forge!1894
2019-06-20 15:45:14 +00:00
Rob Schnautz
29c8203c63 more spoilers 2019-06-20 14:31:31 +00:00
Rob Schnautz
040c88221d Spoilers from yesterday 2019-06-20 14:25:57 +00:00
churrufli
58aff11457 Moving hard-coded text to res files 2019-06-20 13:35:21 +02:00
Michael D
69d1e0f2b9 Update Hypercube to intended drafting format. 2019-06-20 08:50:59 +00:00
swordshine
f026b1e288 Update some forgescrible scripts by austinio7116 2019-06-20 16:16:38 +08:00
Michael Kamensky
2a9c442553 Merge branch 'betterdeckgenlandcount' into 'master'
Improved land counts in deck generation to use linear regression to generate...

See merge request core-developers/forge!1893
2019-06-20 05:41:55 +00:00
Michael Kamensky
d64d1cafb3 Merge branch 'master' into 'master'
Fix en-US localization for lblCard

See merge request core-developers/forge!1892
2019-06-19 18:59:26 +00:00
Agetian
416eb02da4 - Fix en-US localization for lblCard 2019-06-19 21:58:52 +03:00
austinio7116
4a9a763b40 Improved land counts in deck generation to use linear regression to generate land requirements from average CMC - also increased variance of CMC ratios and reduced land count requirements if filtered decks enabled 2019-06-19 19:52:08 +01:00
Michael Kamensky
0e6369937b Merge branch 'master' into 'master'
Fix Angrath's Rampage description.

See merge request core-developers/forge!1891
2019-06-19 16:32:26 +00:00
Agetian
17f1a9ed8b - Fix Angrath's Rampage description. 2019-06-19 19:32:04 +03:00
Rob Schnautz
6a9990950b loxodon lifechanter 2019-06-19 13:17:06 +00:00
Rob Schnautz
01239c423d rename to punitive wand 2019-06-19 13:08:43 +00:00
Rob Schnautz
017983a9ca yanling's elemental bird 2019-06-19 12:37:58 +00:00
Rob Schnautz
0da2140736 Wednesday early morning spoilers 2019-06-19 12:28:29 +00:00
Michael Kamensky
313fb53afa Merge branch 'RandomModernWorld' into 'master'
Added Random Modern World

See merge request core-developers/forge!1888
2019-06-19 09:28:46 +00:00
swordshine
4d0337acce cards waiting for implemented scripts 2019-06-19 16:39:19 +08:00
swordshine
ff2b5d331f Merge branch 'm20' into 'master'
M20 cards

See merge request core-developers/forge!1887
2019-06-19 08:34:43 +00:00
swordshine
0f8c30a379 Temporarily removed unimplemented cards for merge 2019-06-19 16:33:21 +08:00
swordshine
da63da60c8 Update Blightbeetle 2019-06-19 16:01:38 +08:00
swordshine
7aedbefcdf Fix a typo 2019-06-19 15:18:07 +08:00
swordshine
03ff6923fd Add Chandras by AStrangerIsHere 2019-06-19 15:08:19 +08:00
swordshine
9f71beae57 Update forgescrible scripts by austinio7116 2019-06-19 14:52:25 +08:00
austinio7116
3df07861cf Removed unused import 2019-06-19 06:49:57 +01:00
austinio7116
49d57a0365 Added Random Modern World 2019-06-19 06:40:15 +01:00
kms70847
c82950555d Use FMouseAdapter's onLeftDoubleClick event for double click detection in ListChooser. 2019-06-19 01:34:19 -04:00
swordshine
680d8e1c9c add some scripts 2019-06-19 13:19:24 +08:00
swordshine
ff7d4cfc31 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into m20 2019-06-19 12:15:37 +08:00
swordshine
707638c0c5 Merge branch 'master' into 'master'
Moving hard-coded text to res files

See merge request core-developers/forge!1886
2019-06-19 04:14:47 +00:00
swordshine
9c1c075de2 The unimplemented m20 cards 2019-06-19 12:08:53 +08:00
swordshine
6d663f8933 Merge branch 'm20' into 'master'
Core Set 2020 cards

See merge request core-developers/forge!1882
2019-06-19 04:06:50 +00:00
swordshine
7e5cc4d9fe Temporarily removed unscripted cards for merge 2019-06-19 12:00:25 +08:00
Rob Schnautz
8b8a61dd74 Tuesday evening spoilers 2019-06-19 03:04:58 +00:00
swordshine
879d01b1ec Merge branch 'm20spoilers' into m20
Update some scripts
2019-06-19 10:17:56 +08:00
swordshine
17d0a5c0f1 Merge branch 'm20' of https://git.cardforge.org/core-developers/forge into m20 2019-06-19 10:09:05 +08:00
swordshine
7b41e9b19d Merge branch 'master' of https://git.cardforge.org/core-developers/forge into m20 2019-06-19 10:04:02 +08:00
churrufli
e029ee713d Moving hard-coded text to res files 2019-06-19 00:05:20 +02:00
Michael Kamensky
495f6946bf Merge branch 'puzzle-survive1' into 'master'
Puzzle Engine: add several features, add PS_GRNS (disabled) as an example of how to code these features

See merge request core-developers/forge!1885
2019-06-18 19:41:17 +00:00
Agetian
f17a3f2500 - Add a comment to PS_GRNS 2019-06-18 22:34:23 +03:00
Agetian
769a3f6dd8 - Remove empty line. 2019-06-18 22:32:23 +03:00
Agetian
ecd48916c0 - Restore functionality for remove sickness and choose cards 2019-06-18 22:31:45 +03:00
Agetian
9831995db3 - Patch GameState to work with the latest changes. 2019-06-18 22:24:57 +03:00
Agetian
113409516c - Disable PS_GRNS until a way can be found to make the AI behave correctly. 2019-06-18 22:23:29 +03:00
Agetian
78e78bb3d5 - Added puzzle PS_GRNS (Survive the Turn: GRN edition).
- Currently doesn't work well because the AI doesn't prioritize cards in such a way that they would play the cards in such a way they'd actually win on their first turn.
2019-06-18 22:18:41 +03:00
Michael Kamensky
064b686ac0 Merge branch 'master' into 'master'
Added puzzle PS_WAR7 - Possibility Storm - War of the Spark 07

See merge request core-developers/forge!1884
2019-06-18 19:16:33 +00:00
Agetian
af6d437407 - Added puzzle PS_WAR7. 2019-06-18 22:15:48 +03:00
Rob Schnautz
03769a5600 pacifism 2019-06-18 18:18:20 +00:00
Rob Schnautz
1a6d3a0dd3 leyline of anticipation reprint 2019-06-18 17:47:33 +00:00
Michael Kamensky
74c097fef3 Merge branch 'master' into 'master'
Improve logic for Ajani, the Greathearted.

See merge request core-developers/forge!1883
2019-06-18 16:58:27 +00:00
Agetian
4b38c614fa - Improve logic for Ajani, the Greathearted. 2019-06-18 19:57:44 +03:00
Rob Schnautz
66fcd517ea rest of tuesday morning spoilers 2019-06-18 16:45:50 +00:00
Michael Kamensky
cec1956ffd Merge branch 'patch' into 'master'
M20: Add Leyline of Combustion

See merge request core-developers/forge!1881
2019-06-18 16:42:12 +00:00
Rob Schnautz
376a2821e8 more spoilers 2019-06-18 16:33:43 +00:00
Rob Schnautz
18777d9224 more 2019-06-18 16:07:01 +00:00
Rob Schnautz
f1737b993c more 2019-06-18 15:38:55 +00:00
Rob Schnautz
21356478e0 move oracle to bottom 2019-06-18 15:03:52 +00:00
swordshine
a5679cab49 Add Atemsis, All-Seeing 2019-06-18 22:39:02 +08:00
swordshine
39df559050 Update Ajani, Strength of the Pride 2019-06-18 22:26:44 +08:00
swordshine
7c92e75359 M20: Add Leyline of Combustion 2019-06-18 20:23:48 +08:00
Michael Kamensky
7e78b233d4 Merge branch 'fix-alesha' into 'master'
Fix defender selection on "enters attacking" effects

See merge request core-developers/forge!1872
2019-06-18 05:26:45 +00:00
Michael Kamensky
74d3af3c20 Merge branch 'master' into 'master'
War of the Spark: it looks like there are only 3 booster covers

See merge request core-developers/forge!1880
2019-06-18 04:27:55 +00:00
Agetian
680e2d63e3 - War of the Spark: it looks like there are only 3 booster covers (except for color-themed boosters and other stuff) 2019-06-18 07:27:25 +03:00
schnautzr
7fc32ae4ca Merge branch 'm20' of https://git.cardforge.org/core-developers/forge into m20 2019-06-17 16:04:09 -05:00
schnautzr
21fe950df0 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into m20 2019-06-17 16:02:34 -05:00
Rob Schnautz
62ae636dd5 Merge branch 'master' into 'm20'
update from master

See merge request core-developers/forge!1878
2019-06-17 20:56:11 +00:00
Rob Schnautz
6cdbcf3a0b - Somewhat better logic for Might of Old Krosa and Arrester's Zeal, allowing the AI to use them in Main 1 in overwhelming situations. 2019-06-17 20:56:11 +00:00
schnautzr
f0345438da dragon mage and stuff 2019-06-17 15:52:10 -05:00
schnautzr
7492891db7 moar cardz 2019-06-17 13:58:21 -05:00
schnautzr
c30505ad8d cavalier of flame, ajani strength of pride. note that ajani's third ability needs work yet to prevent graying out when the condition is false, but this would rarely if ever be a problem 2019-06-17 13:32:40 -05:00
Michael Kamensky
697b4d66ca Merge branch 'master' into 'master'
Added AI cast preference to Mass Hysteria and Concordant Crossroads

Closes #1059

See merge request core-developers/forge!1876
2019-06-17 16:10:57 +00:00
Agetian
077bfc4fdf - Added AI cast preference to Mass Hysteria and Concordant Crossroads 2019-06-17 19:08:14 +03:00
Rob Schnautz
e927b6f6de empyrean eagle 2019-06-17 15:49:43 +00:00
Rob Schnautz
68f8b9800c add ajani 2019-06-17 15:46:41 +00:00
Rob Schnautz
7a7cf01caf Rienne is a secret card, add Ironroot Warlord and Unsummon. 2019-06-17 15:38:48 +00:00
Rob Schnautz
db7077adcd Add the first several preview cards 2019-06-17 15:21:23 +00:00
Michael Kamensky
ad3873d986 Merge branch 'master' into 'master'
Fix Shirei, Shizo's Caretaker

See merge request core-developers/forge!1875
2019-06-17 14:59:28 +00:00
Agetian
489f583e67 - Fix Shirei, Shizo's Caretaker 2019-06-17 17:57:19 +03:00
Michael Kamensky
e8429f2cea Merge branch 'iss1057v3' into 'master'
Shuffle list of potential cards before passing them to the commander deck generator.

See merge request core-developers/forge!1874
2019-06-17 14:15:05 +00:00
kms70847
97ae1bc451 Shuffle list of potential cards before passing them to the commander deck generator.
Proposed fix for https://git.cardforge.org/core-developers/forge/issues/1057
2019-06-17 00:42:13 -04:00
Adam Pantel
6c15a05c8e Fix defender selection on "enters attacking" effects 2019-06-16 17:14:22 -04:00
Michael Kamensky
f0a7d2e911 Merge branch 'master' into 'master'
Fix Aquatic Incursion

See merge request core-developers/forge!1871
2019-06-16 14:33:06 +00:00
Agetian
46c91b9eb5 - Fix Aquatic Incursion 2019-06-16 17:32:46 +03:00
Michael Kamensky
4817475efb Merge branch 'master' into 'master'
Somewhat better logic for Might of Old Krosa and Arrester's Zeal, allowing the AI to cast in Main Phase when planning to attack anyway

Closes #1056

See merge request core-developers/forge!1870
2019-06-16 14:25:22 +00:00
Agetian
7b8e59810c - Somewhat better logic for Might of Old Krosa and Arrester's Zeal, allowing the AI to use them in Main 1 in overwhelming situations. 2019-06-16 17:20:40 +03:00
Michael Kamensky
c3ec264edd Merge branch 'master' into 'master'
Added an AI logic parameter to Bond of Discipline similar to Cryptic Command

See merge request core-developers/forge!1869
2019-06-16 12:53:00 +00:00
Agetian
f7cd068532 - Added an AI logic parameter to Bond of Discipline similar to Cryptic Command 2019-06-16 15:52:31 +03:00
Michael Kamensky
00e9a2dffb Merge branch 'master' into 'master'
Fix tests to comply with the newest Oracle.

See merge request core-developers/forge!1868
2019-06-16 10:13:39 +00:00
Agetian
e75929c16d - Fix tests to comply with the newest Oracle. 2019-06-16 13:13:19 +03:00
Michael Kamensky
0e2bd3da48 Merge branch 'master' into 'master'
Fix a logic error in TapAllAi

See merge request core-developers/forge!1867
2019-06-16 09:59:58 +00:00
Agetian
80946ca88f - Fix a logic error in TapAllAi 2019-06-16 12:59:06 +03:00
Alessandro Coli
94a0fb20d2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-16 08:54:25 +02:00
swordshine
cff0793d80 Merge branch 'undefined' into 'master'
Battlebond - Stolen Strategy

See merge request core-developers/forge!1859
2019-06-16 04:03:25 +00:00
swordshine
1997842f97 Merge branch 'formats-update' into 'master'
Formats update

See merge request core-developers/forge!1862
2019-06-16 04:02:42 +00:00
swordshine
bba281f43c Merge branch 'oracle-updates-functional' into 'master'
Oracle updates functional

See merge request core-developers/forge!1865
2019-06-16 04:02:19 +00:00
Rob Schnautz
0bcec97f46 Merge branch 'oracle-updates-nonfunctional-rna' into 'master'
Oracle updates nonfunctional rna

See merge request core-developers/forge!1866
2019-06-16 03:59:18 +00:00
Rob Schnautz
7a5930ed07 Merge branch 'oracle-updates-nonfunctional' into 'master'
Oracle updates nonfunctional

See merge request core-developers/forge!1864
2019-06-16 03:58:55 +00:00
Rob Schnautz
88ac34bad9 Crazed Firecat and the tense verbs (nonfunctional) 2019-06-16 03:45:39 +00:00
Rob Schnautz
7273c36d71 Time Spiral zones (nonfunctional) 2019-06-16 03:42:59 +00:00
Rob Schnautz
109339f058 Creating Marit Lage (nonfunctional) 2019-06-16 03:40:39 +00:00
Rob Schnautz
3b4be89e55 Planeswalker reminder text (nonfunctional) 2019-06-16 03:38:28 +00:00
Rob Schnautz
1eb609d30c Lord of Atlantis gets into commerce (functional... kinda) 2019-06-16 03:31:39 +00:00
Rob Schnautz
27521623a6 Missing a (nonfunctional) period. 2019-06-16 03:28:43 +00:00
Rob Schnautz
147ad884da Ajani's Pride-may-te (functional) 2019-06-16 03:14:10 +00:00
Rob Schnautz
685c452ea5 Merge branch 'master' into 'oracle-updates-nonfunctional'
# Conflicts:
#   forge-gui/res/cardsfolder/a/artisan_of_forms.txt
#   forge-gui/res/cardsfolder/c/cemetery_puca.txt
#   forge-gui/res/cardsfolder/d/dimir_doppelganger.txt
#   forge-gui/res/cardsfolder/e/evil_twin.txt
#   forge-gui/res/cardsfolder/h/heat_shimmer.txt
#   forge-gui/res/cardsfolder/i/increasing_devotion.txt
#   forge-gui/res/cardsfolder/i/increasing_vengeance.txt
#   forge-gui/res/cardsfolder/k/kiki_jiki_mirror_breaker.txt
#   forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt
#   forge-gui/res/cardsfolder/m/minion_reflector.txt
#   forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt
#   forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt
#   forge-gui/res/cardsfolder/s/splinter_twin.txt
#   forge-gui/res/cardsfolder/t/tempt_with_vengeance.txt
#   forge-gui/res/cardsfolder/t/thespians_stage.txt
#   forge-gui/res/cardsfolder/t/twinflame.txt
#   forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt
#   forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt
#   forge-gui/res/cardsfolder/v/vesuvan_shapeshifter.txt
2019-06-16 03:09:06 +00:00
schnautzr
2951cb5660 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-06-15 15:45:37 -05:00
schnautzr
7436bf5385 format updates 2019-06-15 15:44:48 -05:00
Michael Kamensky
3dd54e06e9 Merge branch 'master' into 'master'
Fix the order of elements for Charm effect being random in the UI

Closes #940

See merge request core-developers/forge!1861
2019-06-15 19:13:42 +00:00
Agetian
ed818f1bd1 - Fix the order of elements for Charm effect being random in the UI 2019-06-15 22:12:06 +03:00
Michael Kamensky
c08e20f2a7 Merge branch 'master' into 'master'
Fix AI logic for Teferi, Time Raveler

See merge request core-developers/forge!1860
2019-06-15 18:03:09 +00:00
Agetian
df01fe5085 - Fix AI logic for Teferi, Time Raveler 2019-06-15 21:02:42 +03:00
Michael Kamensky
9f1763e9a1 Merge branch '1053-etb-replacement-dependent-on-kicker-is-broken' into 'master'
Resolve "ETB Replacement dependent on Kicker is broken"

Closes #1053

See merge request core-developers/forge!1858
2019-06-15 15:41:01 +00:00
Agetian
be9e53d517 - Fix imports. 2019-06-15 18:36:49 +03:00
Agetian
946a96a9b0 - Added a test for Epochrasite 2019-06-15 18:35:04 +03:00
Agetian
55a2cc92a4 - Revert a change in Epochrasite (no longer necessary) 2019-06-15 18:02:16 +03:00
Computica
75a195f952 Battlebond - Stolen Strategy 2019-06-15 14:42:48 +00:00
Hanmac
85ef08f4bb CardUtil: copy Kicker and OptionalCost into LKI 2019-06-15 16:14:53 +02:00
Michael Kamensky
e7dadc5a4c Merge branch 'ai-kicker' into 'master'
Improve AI playability checks for Kicker costs

Closes #1049

See merge request core-developers/forge!1856
2019-06-15 11:13:52 +00:00
Agetian
379e866424 - Improve AI playability checks for Kicker costs 2019-06-15 09:52:02 +03:00
Michael Kamensky
13d2064459 Merge branch 'master' into 'master'
Fix AI for Sadistic Obsession.

Closes #1052

See merge request core-developers/forge!1855
2019-06-15 05:04:44 +00:00
Agetian
60c967dcf7 - Fix AI for Sadistic Obsession. 2019-06-15 07:38:19 +03:00
swordshine
d724950ab3 Merge branch 'patch-1' into 'master'
Update Phantasmal Form

See merge request core-developers/forge!1854
2019-06-15 01:02:02 +00:00
Hans Mackowiak
ce90d3b845 Update Phantasmal Form 2019-06-15 01:02:02 +00:00
Michael Kamensky
26c8f78620 Merge branch 'patch-1' into 'master'
Update throatseeker

See merge request core-developers/forge!1853
2019-06-14 17:40:28 +00:00
Hans Mackowiak
e1ed2da86c Update throatseeker 2019-06-14 17:40:28 +00:00
Sol
af8126ca83 Merge branch 'test-necrotic-ooze-copy' into 'master'
Added a test for Necrotic Ooze copying Basking Rootwalla's ability from a graveyard.

See merge request core-developers/forge!1645
2019-06-14 15:28:53 +00:00
Michael Kamensky
bf38dac8c8 Added a test for Necrotic Ooze copying Basking Rootwalla's ability from a graveyard. 2019-06-14 15:28:53 +00:00
Michael Kamensky
e51236086b Merge branch 'patch-1' into 'master'
Update Kamahl's Druidic Vow SpellDescription

See merge request core-developers/forge!1852
2019-06-14 12:17:42 +00:00
Hans Mackowiak
34363829f0 Update Kamahl's Druidic Vow SpellDescription 2019-06-14 12:17:42 +00:00
swordshine
5ade9ea6e8 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1851
2019-06-14 07:24:55 +00:00
swordshine
192f205c0d Update some scripts 2019-06-14 15:24:39 +08:00
Michael Kamensky
0bcc5e2532 Merge branch 'master' into 'master'
Fix token definition in Ravnica Allegiance

See merge request core-developers/forge!1850
2019-06-14 06:05:13 +00:00
Agetian
296a9c32d4 - Fix token definition in Ravnica Allegiance 2019-06-14 09:04:46 +03:00
Michael Kamensky
668bc3ab2c Merge branch 'master' into 'master'
Fix the Domain achievement not working correctly with snow-covered basic lands.

See merge request core-developers/forge!1849
2019-06-14 04:19:06 +00:00
Agetian
a9275b1184 - Fix the Domain achievement not working correctly with snow-covered basic lands. 2019-06-14 07:18:30 +03:00
swordshine
3063b954a2 Merge branch 'deprecation-cleanup' into 'master'
Deprecation cleanup

See merge request core-developers/forge!1419
2019-06-14 00:45:29 +00:00
Rob Schnautz
19d2703ff4 Update forge-gui/res/editions/Magic 2020.txt 2019-06-13 22:34:31 +00:00
Rob Schnautz
249649dbaa Merge branch 'master' into 'deprecation-cleanup'
# Conflicts:
#   forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
#   forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
2019-06-13 22:10:10 +00:00
Michael Kamensky
a85a340312 Merge branch 'master' into 'master'
Migrate "upcoming" for MH1 in preparation for the upcoming M20 development.

See merge request core-developers/forge!1848
2019-06-13 04:05:34 +00:00
Agetian
7f3da042ea - Migrate "upcoming" for MH1 in preparation for the upcoming M20 development. 2019-06-13 07:04:48 +03:00
Michael Kamensky
a14f5269ef Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.26.001 [incremental].

See merge request core-developers/forge!1847
2019-06-13 03:26:45 +00:00
Agetian
83ba31a6cd - Preparing Forge for Android publish 1.6.26.001 [incremental]. 2019-06-13 06:21:23 +03:00
Blacksmith
803e82f5f8 Clear out release files in preparation for next release 2019-06-12 20:18:07 +00:00
Blacksmith
560fdf1a46 [maven-release-plugin] prepare for next development iteration 2019-06-12 20:13:01 +00:00
Blacksmith
2974f6a7c3 [maven-release-plugin] prepare release forge-1.6.26 2019-06-12 20:12:56 +00:00
Blacksmith
4e9b3ce256 Update README.txt for release 2019-06-12 20:10:26 +00:00
Alessandro Coli
7313670d8f Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-12 18:32:48 +02:00
Michael Kamensky
ef15bb8da0 Merge branch 'master' into 'master'
Fix London Mulligan AI so that the necessary number of cards is actually returned each time

See merge request core-developers/forge!1846
2019-06-12 10:32:53 +00:00
Agetian
09e0967c37 - Fix London Mulligan AI 2019-06-12 13:32:19 +03:00
Michael Kamensky
b7b8103bd8 Merge branch 'master' into 'master'
Fix logic for Domri, Anarch of Bolas

See merge request core-developers/forge!1845
2019-06-12 08:26:56 +00:00
Agetian
9b3b1b9e8d - Fix logic for Domri, Anarch of Bolas 2019-06-12 11:26:27 +03:00
Michael Kamensky
38b72c8196 Merge branch 'master' into 'master'
Improved London Mulligan AI

See merge request core-developers/forge!1844
2019-06-12 08:01:41 +00:00
Agetian
06abfc1f14 - Improved London Mulligan AI
- Also tweaked Goatnap to use AddKWs
2019-06-12 11:00:48 +03:00
Michael Kamensky
8fa029ac4a Merge branch 'master' into 'master'
Fix Goatnap.

See merge request core-developers/forge!1843
2019-06-12 06:54:23 +00:00
Agetian
7fb089d120 - Fix Goatnap. 2019-06-12 09:53:58 +03:00
Michael Kamensky
c97782a437 Merge branch 'master' into 'master'
Fix kill spell prediction for wrapped abilities (fixes AI for Munitions Expert)

See merge request core-developers/forge!1842
2019-06-12 06:50:06 +00:00
Agetian
23b8b91a20 - Fix kill spell prediction for wrapped abilities (fixes AI for Munitions Expert) 2019-06-12 09:49:14 +03:00
Michael Kamensky
1463bda564 Merge branch 'master' into 'master'
Fix AI for a couple cards with AF Draw

See merge request core-developers/forge!1841
2019-06-12 05:45:59 +00:00
Agetian
293b5a1a5f - Fix AI for a couple cards with AF Draw 2019-06-12 08:45:31 +03:00
Michael Kamensky
5c7910e639 Merge branch 'triggerExiled' into 'master'
TriggerExiled: make new Trigger for exile keyword action for Soulherder

Closes #1033

See merge request core-developers/forge!1840
2019-06-12 05:23:31 +00:00
Hans Mackowiak
244fa13961 TriggerExiled: make new Trigger for exile keyword action for Soulherder 2019-06-12 05:23:31 +00:00
Michael Kamensky
f3ba20452d Merge branch 'master' into 'master'
Use a standardized AILogic$ Always name for Hunt the Weak/Savage Stomp instead of inventing a new one

See merge request core-developers/forge!1839
2019-06-12 05:02:16 +00:00
Agetian
b772b08d03 - A more traditional name for the AI logic 2019-06-12 08:01:35 +03:00
Michael Kamensky
982c138ca6 Merge branch 'master' into 'master'
Fix AI logic for Hunt the Weak and Savage Stomp

See merge request core-developers/forge!1838
2019-06-12 05:00:34 +00:00
Agetian
b23fc791a2 - Same tweak for Savage Stomp 2019-06-12 07:59:50 +03:00
Agetian
25995db862 - Fix the AI logic for Hunt the Weak 2019-06-12 07:59:09 +03:00
Michael Kamensky
e09cb43ef8 Merge branch 'master' into 'master'
Fix AI logic for Domri's Ambush

See merge request core-developers/forge!1837
2019-06-12 04:50:51 +00:00
Agetian
2acbddbecf - Fix AI logic for Domri's Ambush 2019-06-12 07:44:57 +03:00
Michael Kamensky
54ccf6e7a8 Merge branch 'master' into 'master'
Tweak ANNOUNCEMENTS.txt.

See merge request core-developers/forge!1836
2019-06-12 03:50:02 +00:00
Agetian
de0807f6f8 - Tweak ANNOUNCEMENTS.txt. 2019-06-12 06:49:16 +03:00
Michael Kamensky
9dda5bbbcf Merge branch 'patch-2' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!1835
2019-06-12 03:48:01 +00:00
Sol
84b26638dd Update ANNOUNCEMENTS.txt 2019-06-12 01:52:32 +00:00
Michael Kamensky
54f397cca9 Merge branch 'master' into 'master'
Tweak the new cubes for better AI rankings.

See merge request core-developers/forge!1834
2019-06-11 19:49:38 +00:00
Agetian
2c7d38fa39 - Tweak the new cubes for better AI rankings. 2019-06-11 22:49:13 +03:00
Michael Kamensky
854a5575e1 Merge branch 'master' into 'master'
Added 2 draft cubes (cubetutor.com)

See merge request core-developers/forge!1833
2019-06-11 19:40:46 +00:00
Agetian
a1e8d15818 - Added 2 draft cubes. 2019-06-11 22:40:02 +03:00
Michael Kamensky
4dde3610fa Merge branch 'master' into 'master'
de-DE internationalization work

See merge request core-developers/forge!1832
2019-06-11 18:10:21 +00:00
churrufli
704fa9ad5c de-DE internationalization work 2019-06-11 18:50:10 +02:00
Michael Kamensky
ec1d1ec221 Merge branch 'master' into 'master'
Added Wtwlf123 540-card Powered Cube originally contributed in Forge format by peepser

See merge request core-developers/forge!1831
2019-06-11 13:09:31 +00:00
Agetian
3145412ca9 - Added Wtwlf123 540-card Powered Cube originally contributed in Forge format by peepser 2019-06-11 16:02:57 +03:00
Michael Kamensky
0fe0ca00bc Merge branch 'master' into 'master'
DamageDealAi: fix a crash and logic error for cards like Expansion // Explosion, Chamber Sentry, etc.

See merge request core-developers/forge!1830
2019-06-11 12:20:12 +00:00
Agetian
cfed38f4f1 - DamageDealAi: fix a crash and logic error for cards like Expansion // Explosion, Chamber Sentry, etc. 2019-06-11 15:19:32 +03:00
Michael Kamensky
ee2733cd86 Merge branch 'master' into 'master'
Added puzzle PS_WAR6 - Possibility Storm - War of the Spark 06

See merge request core-developers/forge!1829
2019-06-11 10:42:04 +00:00
Agetian
c75d8fa065 - Added puzzle PS_WAR6. 2019-06-11 13:41:06 +03:00
Michael Kamensky
43c7956e13 Merge branch 'master' into 'master'
Fix RevealAi logic "Kefnet"

See merge request core-developers/forge!1828
2019-06-11 06:09:15 +00:00
Agetian
6115c0cc45 - Fix RevealAi logic "Kefnet" 2019-06-11 09:08:44 +03:00
Michael Kamensky
0bbdddada1 Merge branch 'master' into 'master'
internationalization works

See merge request core-developers/forge!1820
2019-06-11 05:36:06 +00:00
Michael Kamensky
8c65965669 Merge branch 'london-mulligan-ui' into 'master'
Improved London Mulligan UI (visually highlight selected cards, don't allow to select more cards than needed)

See merge request core-developers/forge!1826
2019-06-11 05:33:25 +00:00
Michael Kamensky
391c81101f - Improved London Mulligan UI (visually highlight selected cards, don't allow to select more cards than necessary) 2019-06-11 05:33:25 +00:00
Michael Kamensky
b5d12c809a Merge branch 'revealFirstTrigger' into 'master'
cards: refactor Reveal the first card you draw into Static Trigger

See merge request core-developers/forge!1827
2019-06-11 05:33:12 +00:00
Hans Mackowiak
1b138b11f8 cards: refactor Reveal the first card you draw into Static Trigger 2019-06-11 05:33:12 +00:00
Michael Kamensky
1c22f8cc60 Merge branch 'M15-Prerelease-Challenge' into 'master'
Added M15 Prerelease Challenge Edition

See merge request core-developers/forge!1822
2019-06-11 04:36:37 +00:00
Michael Kamensky
a6bce235f1 Merge branch 'mulligan-ui' into 'master'
UI for choosing the Mulligan type

See merge request core-developers/forge!1821
2019-06-11 04:02:16 +00:00
Michael Kamensky
08e2ba54ea UI for choosing the Mulligan type 2019-06-11 04:02:16 +00:00
Michael Kamensky
dad052fa07 Merge branch 'london-mulligan-feature-flag' into 'master'
Fix LondonMulligan not actually working

See merge request core-developers/forge!1825
2019-06-11 04:02:05 +00:00
Chris H
aa5851329d Fix LondonMulligan not actually working 2019-06-10 22:55:50 -04:00
swordshine
37fabf33a6 Merge branch 'support-fixes' into 'master'
MH1 misc fixes

See merge request core-developers/forge!1824
2019-06-11 00:36:30 +00:00
apantel
dd404b678e MH1 misc fixes 2019-06-10 19:35:16 -04:00
Michael Kamensky
92ca339c64 Merge branch 'master' into 'master'
Fixed Spark Double

Closes #1047

See merge request core-developers/forge!1823
2019-06-10 17:02:28 +00:00
Agetian
f9f710f9b9 - Fixed Spark Double. 2019-06-10 20:01:39 +03:00
Dagin Svezek
ab813e7327 Added M15 Prerelease Challenge Edition 2019-06-10 07:33:42 +00:00
Agetian
e3ee75bd39 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-06-10 06:19:04 +03:00
Michael Kamensky
ef7e23d131 Merge branch 'fix-lavinia' into 'master'
Fix Lavinia, Azorius Renegade

See merge request core-developers/forge!1819
2019-06-10 03:06:25 +00:00
Michael Kamensky
b45ef60ed2 Fix Lavinia, Azorius Renegade 2019-06-10 03:06:25 +00:00
churrufli
5a98eafacb internationalization works 2019-06-09 23:08:45 +02:00
Agetian
09a91bd8d2 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-06-09 17:57:49 +03:00
Michael Kamensky
3300ebafb1 Merge branch 'master' into 'master'
Fix Sorin, Vengeful Bloodlord and implement a basic AI for it.

See merge request core-developers/forge!1818
2019-06-09 14:08:32 +00:00
Michael Kamensky
caf6c73b7d Fix Sorin, Vengeful Bloodlord and implement a basic AI for it. 2019-06-09 14:08:32 +00:00
Agetian
6588c2d6d3 - Remove the Announce mechanism for X. 2019-06-09 17:07:16 +03:00
Agetian
0252e346c3 - Fix Sorin, Vengeful Bloodlord and implement an AI for it. 2019-06-09 17:03:22 +03:00
Michael Kamensky
8ed4126893 Merge branch 'master' into 'master'
Fix Deliver unto Evil.

Closes #1044

See merge request core-developers/forge!1817
2019-06-09 11:46:32 +00:00
Agetian
d985e37bc7 - Fix Deliver unto Evil. 2019-06-09 14:46:01 +03:00
Michael Kamensky
7122b666a2 Merge branch 'master' into 'master'
Assorted AI improvements (RearrangeTopOfLibraryAi, attack AI logic, WithSameCreatureType targeting)

See merge request core-developers/forge!1816
2019-06-09 11:38:44 +00:00
Agetian
86d7880df7 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-06-09 14:37:38 +03:00
Agetian
597bcd17c8 - Fix the AI incorrectly considering valid targets in RearrangeTopOfLibraryAi. 2019-06-09 14:37:10 +03:00
Agetian
3dc6cc9795 - Various AI attack logic improvements (consider only valid blockers when evaluating shouldAttack, don't judge by canKillAllDangerous if dangerous creatures aren't among the potential defenders) 2019-06-09 14:36:44 +03:00
Agetian
d622e6c8fc - ChangeZoneAi: use the new targeting restriction 2019-06-09 14:35:06 +03:00
Michael Kamensky
0a8a0f67d8 Merge branch 'targetSameCreatureType2' into 'master'
SpellAbility: add isWithoutSameCreatureType and isWithSameCreatureType to canTarget

See merge request core-developers/forge!1815
2019-06-09 11:34:58 +00:00
Hans Mackowiak
ae19b12844 SpellAbility: add isWithoutSameCreatureType and isWithSameCreatureType to canTarget 2019-06-09 11:34:58 +00:00
Michael Kamensky
6ef6189177 Merge branch 'master' into 'master'
Fix copying SVars for SAs with Original Host

Closes #1043

See merge request core-developers/forge!1813
2019-06-09 11:30:57 +00:00
Agetian
a9328d2961 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-06-09 12:23:23 +03:00
Michael Kamensky
48d61922f6 Merge branch 'sliceMH1' into 'master'
MH1 Slice onto instance or sorcery

See merge request core-developers/forge!1814
2019-06-09 09:22:57 +00:00
Hans Mackowiak
3644b8f74f MH1 Slice onto instance or sorcery 2019-06-09 09:22:57 +00:00
Agetian
5db867009d - Some more checks for OriginalHost. 2019-06-09 12:09:42 +03:00
Agetian
fb12dd30b2 - Fix copying SVars for SAs with Original Host.
- Add a missing reference to Cobra Trap.
2019-06-09 10:32:15 +03:00
Michael Kamensky
6ea96baf0a Merge branch 'master' into 'master'
Fix Soulherder EOT trigger targeting.

Closes #1042

See merge request core-developers/forge!1812
2019-06-09 07:02:54 +00:00
Agetian
6c19f39279 - Fix Soulherder EOT trigger targeting. 2019-06-09 10:02:23 +03:00
Michael Kamensky
d099be187f Merge branch 'gideonstriumphfix' into 'master'
Adding missing references

See merge request core-developers/forge!1810
2019-06-09 06:45:31 +00:00
Michael Kamensky
25f52185bf Merge branch 'currentmetagamenetdeck' into 'master'
Split Churrufli's net decks by format

See merge request core-developers/forge!1811
2019-06-09 06:45:24 +00:00
austinio7116
30e38538e2 Split Churrufli's mtggoldfish metagame netdecks by format to allow for format specific quick gauntlets 2019-06-09 07:30:54 +01:00
austinio7116
6bd9cced6e Split Churrufli's mtggoldfish metagame netdecks by format to allow for format specific quick gauntlets 2019-06-09 07:26:56 +01:00
austinio7116
93d0820216 Adding missing references 2019-06-09 07:24:11 +01:00
Michael Kamensky
1d00cc3fff Merge branch 'currentmetagamenetdeck' into 'master'
Adding netdeck for Churrufli's top deck lists

See merge request core-developers/forge!1809
2019-06-09 03:41:33 +00:00
austinio7116
9d1ea5a6c7 Adding netdeck for Churrufli's top deck lists 2019-06-08 17:09:34 +01:00
swordshine
1772696181 Merge branch 'master' into 'master'
Moving hard-coded text to en-US.properties file

See merge request core-developers/forge!1805
2019-06-08 07:46:12 +00:00
Michael Kamensky
9d64e1a4f7 Merge branch 'master' into 'master'
Added MH1 achievements by Marek14.

See merge request core-developers/forge!1808
2019-06-08 06:45:23 +00:00
Agetian
cdb091ad8b - Added MH1 achievements. 2019-06-08 09:44:39 +03:00
Michael Kamensky
a35058a0c3 Merge branch 'ai-mh1-hints' into 'master'
Modern Horizons AI hints + various minor tweaks

See merge request core-developers/forge!1807
2019-06-08 06:39:17 +00:00
Agetian
e21ec52fdd - Improve ChangeZoneAi for Wrenn and Six like abilities. 2019-06-08 09:38:47 +03:00
Agetian
260acd5403 - MH1 AI hints
- Tweaked some AI hints for various older cards (similar to how they are on newer cards)
- Added MH1 to Time Vault in Planar Conquest
2019-06-08 09:35:27 +03:00
churrufli
1059666444 Moving hard-coded text to en-US.properties file 2019-06-08 07:55:27 +02:00
Michael Kamensky
f08e8d58b1 Merge branch 'master' into 'master'
Fix and improve AI for Band Together and Courage in Crisis

Closes #1041

See merge request core-developers/forge!1806
2019-06-08 04:11:27 +00:00
Agetian
1383549ea6 - Fix imports 2019-06-08 07:10:32 +03:00
Agetian
9b1ed633f5 - Fix and improve AI for Band Together and Courage in Crisis 2019-06-08 07:08:59 +03:00
churrufli
f44c6ac1a5 Moving hard-coded text to en-US.properties file 2019-06-07 20:56:15 +02:00
churrufli
6783f4e700 Moving hard-coded text to en-US.properties file 2019-06-07 20:50:04 +02:00
churrufli
6ddbadd339 Moving hard-coded text to en-US.properties file 2019-06-07 20:36:59 +02:00
churrufli
a63d02ff00 Moving hard-coded text to en-US.properties file 2019-06-07 20:34:14 +02:00
churrufli
4589f783b6 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	forge-gui/res/languages/es-es.properties
2019-06-07 20:26:40 +02:00
churrufli
55721fb5d3 Moving hard-coded text to en-US.properties file 2019-06-07 20:26:02 +02:00
Churrufli
aafad639a6 Update es-es.properties 2019-06-07 20:25:45 +02:00
Churrufli
233e6d7794 Update en-US.properties 2019-06-07 20:25:38 +02:00
Churrufli
83df3e507f Update de-DE.properties 2019-06-07 20:25:38 +02:00
churrufli
bd4eace538 Moving hard-coded text to en-US.properties file 2019-06-07 20:25:38 +02:00
churrufli
1afc657ce6 updating res files 2019-06-07 20:25:15 +02:00
Churrufli
0f46f8c5e5 Update es-es.properties 2019-06-07 20:24:51 +02:00
Churrufli
1c1bbcebcb Update en-US.properties 2019-06-07 20:24:51 +02:00
Churrufli
f92edc3c3d Update de-DE.properties 2019-06-07 20:24:51 +02:00
churrufli
cefffc5d90 Moving hard-coded text to en-US.properties file 2019-06-07 20:24:51 +02:00
churrufli
821e345861 updating res files 2019-06-07 20:24:51 +02:00
Michael Kamensky
e67258a40f Merge branch 'master' into 'master'
Fix a missing reference.

See merge request core-developers/forge!1804
2019-06-07 16:08:24 +00:00
Agetian
f145569292 - Fix a missing reference. 2019-06-07 19:07:17 +03:00
Michael Kamensky
70e5d978c3 Merge branch 'master' into 'master'
Some additional logic for Return from Extinction.

See merge request core-developers/forge!1803
2019-06-07 16:00:38 +00:00
Agetian
261454d803 - Fix imports. 2019-06-07 19:00:12 +03:00
Agetian
90276e1217 - Some additional logic for Return from Extinction. 2019-06-07 18:58:20 +03:00
Michael Kamensky
643f4025e3 Merge branch 'master' into 'master'
Fix Reap the Past card name.

See merge request core-developers/forge!1802
2019-06-07 15:24:26 +00:00
Agetian
fd59807413 - Fix Reap the Past card name. 2019-06-07 18:23:56 +03:00
Michael Kamensky
a0638e5273 Merge branch '1040-feudkiller-s-verdict-creates-the-wrong-kind-of-token-though-with-the-right-image' into 'master'
Resolve "Feudkiller's Verdict creates the wrong kind of token though with the right image."

Closes #1040

See merge request core-developers/forge!1801
2019-06-07 14:40:07 +00:00
Hans Mackowiak
6d09f2a278 Update w_5_5_giant_warrior.txt 2019-06-07 12:39:27 +00:00
Michael Kamensky
19d1232ec8 Merge branch 'master' into 'master'
Tweak AnimateAi so that the AI is less likely to waste resources.

See merge request core-developers/forge!1800
2019-06-07 10:39:01 +00:00
Agetian
e5d3808407 - Tweak AnimateAi a little. 2019-06-07 13:38:17 +03:00
Michael Kamensky
1dffdc16b3 Merge branch 'master' into 'master'
NPE precaution

See merge request core-developers/forge!1799
2019-06-07 05:19:52 +00:00
Agetian
35f01cebf1 - NPE precaution 2019-06-07 08:19:22 +03:00
Michael Kamensky
7fff3c5b5c Merge branch 'master' into 'master'
Fix AI for Karn, the Great Creator.

See merge request core-developers/forge!1798
2019-06-07 05:18:23 +00:00
Agetian
47cfa67c09 - Fix AI for Karn, the Great Creator. 2019-06-07 08:17:09 +03:00
Michael Kamensky
41abad1131 Merge branch 'war-cards' into 'master'
Fix Winds of Abandon

See merge request core-developers/forge!1795
2019-06-07 03:13:47 +00:00
Michael Kamensky
cf1e0b1885 Merge branch 'ai-exalted' into 'master'
Improve AI considerations for attacking in presence of Exalted

Closes #1039

See merge request core-developers/forge!1796
2019-06-06 19:20:03 +00:00
Michael Kamensky
1709d0825c Improve AI considerations for attacking in presence of Exalted 2019-06-06 19:20:03 +00:00
apantel
b7217e1f20 Fix Winds of Abandon 2019-06-06 14:58:24 -04:00
Michael Kamensky
7d2300aa11 Merge branch 'fix-combo-anydifferent' into 'master'
Fix Combo mana with AnyDifferent allowing to produce two mana of the same color.

Closes #1034

See merge request core-developers/forge!1791
2019-06-06 17:49:54 +00:00
Michael Kamensky
854fb12729 Fix Combo mana with AnyDifferent allowing to produce two mana of the same color. 2019-06-06 17:49:54 +00:00
Michael Kamensky
4f49e0acde Merge branch 'master' into 'master'
Fix AI for Epiphany at the Drownyard.

Closes #1038

See merge request core-developers/forge!1794
2019-06-06 14:17:38 +00:00
Agetian
5ee562333a - Fix AI for Epiphany at the Drownyard. 2019-06-06 17:16:27 +03:00
Michael Kamensky
314ddefff1 Merge branch 'targetSameCreatureType' into 'master'
Target: TargetsWithSameCreatureType

See merge request core-developers/forge!1793
2019-06-06 12:27:49 +00:00
Hans Mackowiak
9848775d70 Target: TargetsWithSameCreatureType 2019-06-06 12:27:49 +00:00
Michael Kamensky
9233f778c5 Merge branch 'mhspoilers2' into 'master'
Switched MH1 to use WAR basic lands for limited formats as there are no (non...

See merge request core-developers/forge!1792
2019-06-06 05:57:13 +00:00
austinio7116
f9ffb0e1df Switched MH1 to use WAR basic lands for limited formats as there are no (non snow) basic lands in MH1 2019-06-06 06:29:56 +01:00
Michael Kamensky
795472d82b Merge branch 'patch-31' into 'master'
Giver of Runes

See merge request core-developers/forge!1773
2019-06-06 03:49:23 +00:00
Charles Baker
f1e5d0ac5c Merge branch 'protectionColorless' into 'patch-31'
Protection colorless

See merge request Flair/forge!1
2019-06-05 20:10:46 +00:00
Hans Mackowiak
519d57065d Updated deckgen data
(cherry picked from commit 29f1065)
2019-06-05 20:10:46 +00:00
Michael Kamensky
bb18d8f60b Merge branch 'master' into 'master'
Add a basic AristocratCounters hook for Dreadmalkin (currently doesn't sac planeswalkers).

See merge request core-developers/forge!1790
2019-06-05 18:30:47 +00:00
Agetian
8161bd5f2c - Add a basic AristocratCounters hook for Dreadmalkin (currently doesn't sac planeswalkers).
- Fix division by zero in AristocratCounters logic.
2019-06-05 21:29:29 +03:00
Michael Kamensky
7d2513c0f6 Merge branch 'master' into 'master'
Fix RearrangeTopOfLibraryAi missed triggers.

See merge request core-developers/forge!1789
2019-06-05 10:16:20 +00:00
Agetian
e61441c250 - Fix RearrangeTopOfLibraryAi missed triggers. 2019-06-05 13:15:42 +03:00
Michael Kamensky
b675f1c387 Merge branch 'master' into 'master'
Fix imports.

See merge request core-developers/forge!1788
2019-06-05 09:11:28 +00:00
Agetian
532accd709 - Fix imports. 2019-06-05 12:11:08 +03:00
Michael Kamensky
5e83a2e79d Merge branch 'master' into 'master'
Basic AI for Gideon Blackblade

See merge request core-developers/forge!1787
2019-06-05 09:10:34 +00:00
Agetian
fadd08bd21 - Basic AI for Gideon Blackblade. 2019-06-05 12:09:23 +03:00
austinio7116
4fd360a840 Merge branch 'wardeckgen' into 'master'
Updated deckgen data

See merge request core-developers/forge!1786
2019-06-05 05:30:36 +00:00
austinio7116
01f35cea63 Updated deckgen data
(cherry picked from commit 29f1065)
2019-06-05 06:28:59 +01:00
Michael Kamensky
9d28bf2546 Merge branch 'master' into 'master'
Fix Ahn-Crop Invader AI

Closes #1012

See merge request core-developers/forge!1785
2019-06-05 04:37:31 +00:00
Agetian
de01a88d52 - Fix Ahn-Crop Invader AI 2019-06-05 07:34:44 +03:00
swordshine
e264a92e82 Merge branch 'patch' into 'master'
Implement Return from Extinction

See merge request core-developers/forge!1783
2019-06-05 00:59:56 +00:00
swordshine
a442122c7b Merge branch 'false-order' into 'master'
False Orders and Balduvian Warlord

See merge request core-developers/forge!1758
2019-06-05 00:59:40 +00:00
Adam Pantel
0a3f47e721 Descriptions, Cleanup 2019-06-04 16:20:20 -04:00
apantel
9b1d500073 BlockEffect and related cards 2019-06-04 12:42:43 -04:00
swordshine
ee7f1f4136 Fix Sisay, Weatherlight Captain by Marvel, Dawnbringer 2019-06-04 22:58:27 +08:00
Michael Kamensky
6bbc8d54df Merge branch 'master' into 'master'
Added puzzle PS_WAR5 - Possibility Storm - War of the Spark 05

See merge request core-developers/forge!1784
2019-06-04 14:25:42 +00:00
Agetian
70b12a439a - Added puzzle PS_WAR5. 2019-06-04 17:24:59 +03:00
swordshine
74b84f43cb Fix Return from Extinction 2019-06-04 19:18:06 +08:00
swordshine
523d965571 Merge branch 'last-mh1-charms' into 'master'
Add Return from Extinction, Shatter Assumptions

See merge request core-developers/forge!1770
2019-06-04 10:51:58 +00:00
Michael Kamensky
859c02c881 Merge branch 'patch' into 'master'
Add Valiant Changeling

See merge request core-developers/forge!1782
2019-06-04 10:39:50 +00:00
swordshine
454d644947 Fix a typo 2019-06-04 18:14:02 +08:00
swordshine
8b7b50b85d Add Valiant Changeling 2019-06-04 18:12:00 +08:00
swordshine
4d325d3fa2 Merge branch 'patch' into 'master'
Update String of Disappearances

See merge request core-developers/forge!1781
2019-06-04 08:15:29 +00:00
swordshine
1c7e1a226f Update String of Disappearances 2019-06-04 16:15:07 +08:00
swordshine
5055d42279 Merge branch 'some-missing-mh1-cards' into 'master'
Add String of Disappearances, Aria of Flame

See merge request core-developers/forge!1765
2019-06-04 08:11:21 +00:00
pfirpfel
aa320fccea Add Aria of Flame, String of Disappearances 2019-06-04 10:05:21 +02:00
swordshine
b437347791 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1779
2019-06-04 07:58:28 +00:00
Michael Kamensky
f8402c2fa5 Merge branch 'master' into 'master'
Fixed Casualties of War description.

See merge request core-developers/forge!1780
2019-06-04 07:58:27 +00:00
Agetian
fce5293eba - Fixed Casualties of War description. 2019-06-04 10:58:03 +03:00
swordshine
d9168ba658 Update some scripts 2019-06-04 15:57:58 +08:00
swordshine
4f2515994f Merge branch 'mhspoilers2' into 'master'
scripts by nikivan plus Glacial Revelation

See merge request core-developers/forge!1774
2019-06-04 07:47:58 +00:00
Michael Kamensky
83b3564f9e Merge branch 'master' into 'master'
Added AI hint for Thundering Ceratok.

See merge request core-developers/forge!1778
2019-06-04 07:26:02 +00:00
Agetian
cb1b6cf2f0 - Added AI hint for Thundering Ceratok. 2019-06-04 10:25:39 +03:00
Michael Kamensky
4a2721a151 Merge branch 'master' into 'master'
Card description patch

See merge request core-developers/forge!1777
2019-06-04 07:19:03 +00:00
Agetian
0a18874567 - Card description patch. 2019-06-04 10:18:36 +03:00
Michael Kamensky
aad506da0c Merge branch 'master' into 'master'
- Some more minor card/AI fixes.

See merge request core-developers/forge!1776
2019-06-04 07:15:01 +00:00
Agetian
c412b726a1 - Some more minor card/AI fixes. 2019-06-04 10:14:33 +03:00
Michael Kamensky
6441300d55 Merge branch 'master' into 'master'
Fix RemoveCounterAi logic for Price of Betrayal and other cases, various minor card fixes

See merge request core-developers/forge!1775
2019-06-04 07:08:17 +00:00
Agetian
635ebf1d67 - Assorted minor card fixes. 2019-06-04 10:07:18 +03:00
Agetian
43117e8c98 - Fix RemoveCounterAi logic for Price of Betrayal 2019-06-04 10:05:37 +03:00
austinio7116
5b0bcc8d10 Added glacial revelation 2019-06-04 06:35:40 +01:00
austinio7116
834301d382 Ayula, Queen Among Bears by nikivan 2019-06-04 06:29:00 +01:00
maustin
6b06b1df9d Merge remote-tracking branch 'Austin/mhspoilers2' into mhspoilers2 2019-06-04 06:26:49 +01:00
austinio7116
8c3967afec Marit Lage's Slumber by nikivan 2019-06-04 06:26:24 +01:00
austinio7116
85068deb3b Merge branch 'last-mh1-slivers' into 'master'
Add Spiteful Sliver, Scuttling Sliver

See merge request core-developers/forge!1769
2019-06-04 05:20:31 +00:00
Charles Baker
d44ac939e9 WIP: Giver of Runes 2019-06-04 01:33:26 +00:00
swordshine
ec9e725823 Merge branch 'patch-30' into 'master'
Winding Way

See merge request core-developers/forge!1772
2019-06-04 00:44:01 +00:00
swordshine
ba882998a6 Merge branch 'patch-29' into 'master'
Update ephemerate script clean up.

See merge request core-developers/forge!1771
2019-06-04 00:43:21 +00:00
swordshine
41306dd95a Merge branch 'master' into 'master'
Moving hard-coded text to en-US.properties file

See merge request core-developers/forge!1768
2019-06-04 00:41:46 +00:00
swordshine
9dcdcd787d Merge branch 'mh1-cards-3' into 'master'
Add Springbloom Druid, Soul-Strike Technique, Settle Beyond Reality

See merge request core-developers/forge!1767
2019-06-04 00:39:33 +00:00
Charles Baker
0abffed28f Winding Way 2019-06-03 23:29:07 +00:00
Charles Baker
2acbf4d576 Update ephemerate.txt 2019-06-03 22:34:59 +00:00
Churrufli
318a6eea8f Update es-es.properties 2019-06-03 22:01:18 +00:00
Charles Baker
7c3783c935 Update ephemeral script clean up. 2019-06-03 21:25:50 +00:00
pfirpfel
8d35381454 Add Return from Extinction, Shatter Assumptions 2019-06-03 21:58:41 +02:00
pfirpfel
c30828acd3 Add Spiteful Sliver, Scuttling Sliver 2019-06-03 21:15:02 +02:00
Churrufli
b886cbadd2 Update en-US.properties 2019-06-03 18:30:57 +00:00
Churrufli
f3286e6474 Update de-DE.properties 2019-06-03 18:25:28 +00:00
churrufli
83817e21b6 Moving hard-coded text to en-US.properties file 2019-06-03 20:15:13 +02:00
pfirpfel
41e7bdba1d Add Springbloom Druid, Soul-Strike Technique, Settle Beyond Reality 2019-06-03 20:03:03 +02:00
Michael Kamensky
737253fe73 Merge branch 'even-more-mh1-cards' into 'master'
Add Pyrophobia, Orcish Hellraiser, On Thin Ice

See merge request core-developers/forge!1766
2019-06-03 17:39:32 +00:00
churrufli
f008eaba9a Merge remote-tracking branch 'forgecoredevelopers/master' 2019-06-03 18:51:35 +02:00
pfirpfel
52f9c5d644 Fix On Thin Ice aura target 2019-06-03 16:40:25 +02:00
pfirpfel
720ab6840c Add Pyrophobia 2019-06-03 15:46:28 +02:00
pfirpfel
97d048bfbf Add Orcish Hellraiser 2019-06-03 15:36:28 +02:00
pfirpfel
e1d1d41e04 Add On Thin Ice 2019-06-03 15:35:54 +02:00
Michael Kamensky
2a258ffe12 Merge branch 'patch-27' into 'master'
Hogaak, Arisen Necropolis

See merge request core-developers/forge!1756
2019-06-03 09:16:51 +00:00
Michael Kamensky
5822435635 Merge branch 'exploitedThis' into 'master'
Exploited: add info about exploited creature

See merge request core-developers/forge!1764
2019-06-03 08:12:45 +00:00
Hans Mackowiak
361860f23f Exploited: add info about exploited creature 2019-06-03 08:12:44 +00:00
austinio7116
23a95d86dd Merge branch 'patch' into 'master'
MH1: more cards

See merge request core-developers/forge!1763
2019-06-03 04:49:05 +00:00
swordshine
188e944c4f Add Farmstead Gleaner 2019-06-03 12:13:12 +08:00
swordshine
51a0942b87 Add four cards 2019-06-03 12:08:05 +08:00
swordshine
b1d37fe4fb Add two cards 2019-06-03 11:46:27 +08:00
swordshine
ea8ccec5d5 Add two cards 2019-06-03 09:56:21 +08:00
swordshine
27b7243a9a Fix Answered Prayers 2019-06-03 09:03:07 +08:00
swordshine
dc1320925b Fix Mirrodin Besieged 2019-06-03 09:00:28 +08:00
swordshine
739a154f40 Merge branch 'patch-28' into 'master'
Mirrodin Besieged

See merge request core-developers/forge!1762
2019-06-03 00:47:17 +00:00
swordshine
7fc94a9ec1 Merge branch 'patch' into 'master'
MH1: add some cards

See merge request core-developers/forge!1761
2019-06-03 00:38:06 +00:00
Charles Baker
3594b38149 Mirrodin Besieged 2019-06-02 22:32:28 +00:00
churrufli
f74a4a8461 updating res files 2019-06-02 19:40:10 +02:00
Michael Kamensky
a8e8bed9ac Merge branch 'unboundChangeX' into 'master'
ChangeX: add new Api to change the X value of a spell on the stack

See merge request core-developers/forge!1759
2019-06-02 16:08:13 +00:00
Hans Mackowiak
3ff3fbdcf5 ChangeX: add new Api to change the X value of a spell on the stack 2019-06-02 16:08:13 +00:00
swordshine
9087da3806 Add Fallen Shinobi 2019-06-02 22:59:21 +08:00
austinio7116
a7c97c58bf Fix for answered prayers animate 2019-06-02 15:45:36 +01:00
swordshine
1414b55467 Add Wrenn and Six 2019-06-02 22:19:47 +08:00
swordshine
c5e79213fe Merge branch 'mhspoilers2' into 'master'
Added booster details for mh1

See merge request core-developers/forge!1760
2019-06-02 14:15:23 +00:00
austinio7116
8f0c1b92a8 Added booster details for mh1 2019-06-02 14:34:44 +01:00
Alessandro Coli
5047e7732c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-01 18:48:35 +02:00
Michael Kamensky
134a7a122e Merge branch 'master' into 'master'
Fixed a missing reference

See merge request core-developers/forge!1757
2019-06-01 16:14:50 +00:00
Agetian
afda688f56 Merge remote-tracking branch 'origin/master' into agetian-master 2019-06-01 19:14:18 +03:00
Agetian
095fbda8a3 - Fix a reference in Finale of Devastation. 2019-06-01 19:13:27 +03:00
swordshine
0009ee8012 Merge branch 'patch-26' into 'master'
Ephemerate

See merge request core-developers/forge!1755
2019-06-01 12:03:45 +00:00
Charles Baker
29772c440a Hogaak, Arisen Necropolis 2019-06-01 11:32:35 +00:00
Charles Baker
86bc2b215e Ephemerate 2019-06-01 11:24:59 +00:00
swordshine
86de03e5ea Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1754
2019-06-01 07:50:21 +00:00
swordshine
29b35df7ac Update some scripts 2019-06-01 15:48:35 +08:00
Michael Kamensky
5312ff0138 Merge branch 'master' into 'master'
Add the Human Sideboard for AI option to mobile Forge.

See merge request core-developers/forge!1753
2019-06-01 07:07:20 +00:00
Agetian
0dacd48c00 - Add the Human Sideboard for AI option to mobile Forge. 2019-06-01 10:05:43 +03:00
swordshine
8328af8327 Merge branch 'mhspoilers2' into 'master'
Final day MH1 spoilers from forgescribe

See merge request core-developers/forge!1752
2019-06-01 07:04:39 +00:00
Michael Kamensky
135b6a3921 Merge branch 'sideboard_for_ai' into 'master'
Add a feature to be able to Sideboard for the AI

See merge request core-developers/forge!1746
2019-06-01 06:43:29 +00:00
austinio7116
81ff908705 Reverted soul diviner change now AI issue fixed 2019-06-01 07:31:09 +01:00
austinio7116
9f3c5e1ea1 Preparing for MH1 draft boosters 2019-06-01 06:54:55 +01:00
austinio7116
32f2be0d06 Preparing for MH1 draft 2019-06-01 06:49:16 +01:00
austinio7116
542a558a27 Fixed missing cost 2019-06-01 06:48:20 +01:00
austinio7116
6f5c28e555 Final day spoilers editions update 2019-06-01 06:48:20 +01:00
austinio7116
37382af825 Final day spoilers editions update 2019-06-01 06:48:20 +01:00
austinio7116
a6b0c1c71b Final day spoilers editions update 2019-06-01 06:48:20 +01:00
austinio7116
f25f497314 Final day spoilers from forgescribe 2019-06-01 06:48:20 +01:00
swordshine
88406d6ba0 Merge branch 'patch-25' into 'master'
Watcher for Tomorrow

See merge request core-developers/forge!1749
2019-06-01 04:22:28 +00:00
swordshine
d64cda692b Merge branch 'patch-24' into 'master'
Twisted Reflection

See merge request core-developers/forge!1748
2019-06-01 04:13:25 +00:00
swordshine
a399ed94cd Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1751
2019-06-01 04:11:57 +00:00
swordshine
5336b42a01 Update Throes of Chaos 2019-06-01 12:11:25 +08:00
swordshine
79a056d126 Update some scripts 2019-06-01 11:53:00 +08:00
Michael Kamensky
8d439d3068 Merge branch 'master' into 'master'
Vesperlark: added an AI Evoke hint

See merge request core-developers/forge!1750
2019-06-01 03:08:52 +00:00
Agetian
75bf338e84 - Vesperlark: added an AI Evoke hint 2019-06-01 06:08:26 +03:00
Charles Baker
8669940283 Watcher for Tomorrow 2019-06-01 03:02:10 +00:00
swordshine
65bcffa527 Merge branch 'mhspoilers2' into 'master'
More MH1 spoilers from forgeScribe

See merge request core-developers/forge!1744
2019-06-01 02:58:16 +00:00
Charles Baker
2100d20bfd Twisted Reflection 2019-06-01 02:30:34 +00:00
Michael Kamensky
101aacfe4d Merge branch 'evoke-ai' into 'master'
Added a way to specify a NeedsToPlay variable for Evoke.

Closes #1030

See merge request core-developers/forge!1747
2019-06-01 02:24:26 +00:00
Michael Kamensky
a4ca3c77d8 Added a way to specify a NeedsToPlay variable for Evoke. 2019-06-01 02:24:26 +00:00
austinio7116
687ad17036 Fixes suggested in MR 2019-05-31 20:50:48 +01:00
austinio7116
072877d644 Updated editions file 2019-05-31 07:57:18 +01:00
austinio7116
92792996da More MH1 spoilers from forgescribe 2019-05-31 07:52:44 +01:00
austinio7116
79be6b8a8b Sisay from Cryptix 2019-05-31 07:12:44 +01:00
Chris H
cd20443255 Add a feature to be able to Sideboard for the AI 2019-05-30 22:55:31 -04:00
austinio7116
d0b8f38b7e Updated editions file 2019-05-30 17:14:16 +01:00
austinio7116
ab14324f88 More MH1 spoilers from forgeScribe 2019-05-30 16:13:06 +01:00
Michael Kamensky
7da1d23018 Merge branch 'master' into 'master'
Fixed Master of Waves

See merge request core-developers/forge!1745
2019-05-30 10:52:35 +00:00
Agetian
cd587694c2 - Fixed Master of Waves 2019-05-30 13:52:07 +03:00
Alessandro Coli
98a459ac9c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-30 12:34:52 +02:00
maustin
34558f3ce4 Merge remote-tracking branch 'Austin/mhspoilers2' into mhspoilers2
# Conflicts:
#	forge-gui/res/cardsfolder/upcoming/pashalik_mons.txt
2019-05-30 08:34:00 +01:00
austinio7116
9fc01d2e83 More MH1 spoilers from forgeScribe 2019-05-30 08:33:17 +01:00
austinio7116
2eda6ea8dc More MH1 spoilers from forgeScribe 2019-05-30 08:29:18 +01:00
Michael Kamensky
b96c734ca5 Merge branch 'master' into 'master'
Make the AI a little less reckless when evaluating a no-counterattack attrition attack

See merge request core-developers/forge!1743
2019-05-30 05:35:13 +00:00
Agetian
407629bb69 - Be a little less reckless when evaluating a no-counterattack attrition attack 2019-05-30 08:34:46 +03:00
Michael Kamensky
010ce2ecf7 Merge branch 'master' into 'master'
Make the AI play a little bit more aggressively in attrition scenarios where it's favored

See merge request core-developers/forge!1742
2019-05-30 05:32:50 +00:00
Agetian
04281db55f - Make the AI play a little bit more aggressively in attrition scenarios where it's favored 2019-05-30 08:24:30 +03:00
Michael Kamensky
db0e5e1ead Merge branch 'patch-2' into 'master'
Added several cards to the Innistrad card list for planar conquest

See merge request core-developers/forge!1733
2019-05-30 03:56:48 +00:00
Viktor Azorius
eec4dfb3ec Ordered the list of extra cards added to innistrad.
Removed a second extraneous listing of Jeleva, nephalia's scourge and predator's howl
Removed Ajani's pridemate as it has nothing to do with innistrad
Added Entreat the Dead as it's a black miracle and thus on theme.
Added several cards from magic origins that seem to be on theme for innistrad
Added Liliana's contract because it seemed on theme with the demons in general and grislebrand in particular.
2019-05-30 03:56:48 +00:00
swordshine
c5d9226662 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1741
2019-05-30 01:40:14 +00:00
swordshine
b94e3621e3 Update some scripts 2019-05-30 09:38:36 +08:00
swordshine
f384e1dd99 Merge branch 'mh1spoilers' into 'master'
Mh1spoilers

See merge request core-developers/forge!1729
2019-05-30 01:22:03 +00:00
swordshine
ada0667bfb Merge branch 'patch-23' into 'master'
Pashalik Mons

See merge request core-developers/forge!1734
2019-05-30 01:21:12 +00:00
Charles Baker
6ae22b0c5c Update pashalik_mons.txt 2019-05-29 21:20:28 +00:00
Michael Kamensky
e905ffdac6 Merge branch 'master' into 'master'
Added draft cube: SCG Con Cube 2018 December

See merge request core-developers/forge!1740
2019-05-29 17:34:43 +00:00
Agetian
37b1201a4f - Added draft cube: SCG Con Cube 2018 December 2019-05-29 20:33:44 +03:00
Michael Kamensky
2d890defcf Merge branch 'master' into 'master'
Don't run triggers for cards being turned up when moving from battlefield

See merge request core-developers/forge!1739
2019-05-29 16:05:29 +00:00
Agetian
228b522565 - Don't run triggers for cards being turned up when moving from battlefield 2019-05-29 19:03:31 +03:00
Michael Kamensky
97b98aeae7 Merge branch 'master' into 'master'
Fix DamageDealAi setting damage to 0 if adjustment to minimum required damage fails.

Closes #1023

See merge request core-developers/forge!1738
2019-05-29 15:54:10 +00:00
Agetian
2dcf1c088a - Fix DamageDealAi setting damage to 0 if adjustment to minimum required damage fails. 2019-05-29 18:53:32 +03:00
Michael Kamensky
c015893ea3 Merge branch 'master' into 'master'
Fix AI for Hide // Seek

Closes #1022

See merge request core-developers/forge!1737
2019-05-29 15:30:48 +00:00
Agetian
b9a848f7eb - Fix AI for Hide // Seek 2019-05-29 18:27:01 +03:00
Hans Mackowiak
5efc4a32ab Merge branch 'fix-akoum_stonewaker' into 'master'
FIX: Exile token of Akoum Stonewalker properly

Closes #953

See merge request core-developers/forge!1736
2019-05-29 13:23:27 +00:00
pfirpfel
99f34af5df FIX: Exile token of Akoum Stonewalker properly 2019-05-29 15:05:26 +02:00
swordshine
cb996d48c5 Merge branch 'fix-ai-removeanycounter' into 'master'
Fix Remove Any Counter for the AI

See merge request core-developers/forge!1735
2019-05-29 12:28:52 +00:00
swordshine
0bf17d5357 Merge branch 'patch-22' into 'master'
Kaya's Guile

See merge request core-developers/forge!1732
2019-05-29 12:16:05 +00:00
Agetian
d3b8a2cc0e - Fix Remove Any Counter for the AI 2019-05-29 14:24:01 +03:00
Charles Baker
59456e1aec Pashalik Mons 2019-05-29 02:18:33 +00:00
Charles Baker
bbda835e68 Kaya's Guile 2019-05-29 01:53:39 +00:00
swordshine
ba35cbb578 Merge branch 'handsize' into 'master'
Fix NPE when AI discards to hand size

See merge request core-developers/forge!1731
2019-05-29 00:43:06 +00:00
swordshine
3c434aca4c Merge branch 'mh1-cards' into 'master'
MH1 cards (Hexdrinker, Winds of Abandon)

See merge request core-developers/forge!1719
2019-05-29 00:37:28 +00:00
apantel
a93d131e02 Fix NPE when AI discards to hand size 2019-05-28 20:02:44 -04:00
Adam Pantel
31d871c3ff MH1 cards 2019-05-28 19:57:03 -04:00
austinio7116
a3f29963d0 corrected SVAR name 2019-05-28 23:18:24 +01:00
Michael Kamensky
d5f8a0a790 Merge branch 'master' into 'master'
Make Knollspine Invocation AI playable.

See merge request core-developers/forge!1730
2019-05-28 15:31:55 +00:00
Agetian
6810f6f68e - Make Knollspine Invocation AI playable. 2019-05-28 18:31:20 +03:00
austinio7116
34df24f192 Today's spoilers from forgescribe 2019-05-28 16:07:46 +01:00
austinio7116
bb0ec2107e Today's spoilers from forgescribe 2019-05-28 16:07:00 +01:00
Michael Kamensky
4c111d550d Merge branch 'damagedealai-weirdness' into 'master'
AI needs to locate the PayX through the Original card state in case the current card state doesn't have it

See merge request core-developers/forge!1728
2019-05-28 14:30:06 +00:00
Michael Kamensky
43b51c4795 - DamageDealAi: for some weird reason, PayX needs to be on both SA and the host, otherwise some cards break for the AI 2019-05-28 14:30:06 +00:00
Sol
09f00ae4e4 Merge branch 'vancouver-mulligan' into 'master'
Vancouver mulligan only allows to scry if the mulligan actually happened

See merge request core-developers/forge!1727
2019-05-28 12:08:19 +00:00
Michael Kamensky
108abbe16c Vancouver mulligan only allows to scry if the mulligan actually happened 2019-05-28 12:08:19 +00:00
Alessandro Coli
eec3f05dc7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-28 13:29:02 +02:00
Michael Kamensky
c371ad921d Merge branch 'master' into 'master'
Added puzzle PS_WAR4 (Possibility Storm - War of the Spark 04)

Closes #1017

See merge request core-developers/forge!1725
2019-05-28 05:07:41 +00:00
Agetian
2da373b119 - Fix DamageDealAi PayX setup 2019-05-28 07:53:30 +03:00
Agetian
a7ee1fa5b1 - Added puzzle PS_WAR4. 2019-05-28 07:38:26 +03:00
Agetian
29ed49ba11 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-28 06:56:41 +03:00
swordshine
477f2d4ea6 Merge branch 'mulligans' into 'master'
Extract mulligans from GameAction

See merge request core-developers/forge!1724
2019-05-28 03:55:20 +00:00
Chris H
2f2acea1dd Even more warnings 2019-05-27 21:14:27 -04:00
Chris H
8a93262662 Merge branch 'mulligans' of https://git.cardforge.org/friarsol/forge into mulligans 2019-05-27 21:04:12 -04:00
Chris H
c0600d364f Fixing import warnings 2019-05-27 21:01:49 -04:00
swordshine
d7cad9fa83 Merge branch 'patch-19' into 'master'
Orim's Thunder Update

Closes #1013

See merge request core-developers/forge!1720
2019-05-28 00:48:18 +00:00
swordshine
fc1768d3b5 Merge branch 'patch-21' into 'master'
Talisman of Conviction

See merge request core-developers/forge!1723
2019-05-28 00:47:14 +00:00
swordshine
a507f33e46 Merge branch 'mh1spoilers' into 'master'
Mh1spoilers from forgescribe

See merge request core-developers/forge!1722
2019-05-28 00:46:31 +00:00
Sol
6371e708b0 Merge branch 'master' into 'mulligans'
# Conflicts:
#   forge-game/src/main/java/forge/game/GameAction.java
2019-05-28 00:39:05 +00:00
Charles Baker
4e48b42b17 Update talisman_of_conviction.txt 2019-05-27 19:58:30 +00:00
Chris H
220e75a81b Extract mulligans from GameAction
- Add a few different types of Mulliganing that should be expandable
- To finish the work, we need the AI to better handle London mulligans
- And have the UI make this option selectable
2019-05-27 15:58:20 -04:00
Charles Baker
cf29a85af3 Talisman of Conviction 2019-05-27 19:13:30 +00:00
maustin
9d9826402f Merge remote-tracking branch 'Austin/mh1spoilers' into mh1spoilers
# Conflicts:
#	forge-gui/res/cardsfolder/upcoming/yawgmoth_thran_physician.txt
2019-05-27 18:24:06 +01:00
austinio7116
de21a14a77 Added new cards to MH1 editions file 2019-05-27 18:22:55 +01:00
austinio7116
f71b4cc739 Some MH1 spoilers from forgescribe 2019-05-27 18:19:40 +01:00
austinio7116
b5920a5ac2 Merge branch 'patch-20' into 'master'
Yawgmoth, Thran Physician

See merge request core-developers/forge!1721
2019-05-27 17:15:42 +00:00
austinio7116
c1265ce8c3 Some MH1 spoilers from forgescribe 2019-05-27 18:13:57 +01:00
Charles Baker
f4d5e337a2 Yawgmoth, Thran Physician 2019-05-27 15:55:18 +00:00
Charles Baker
cba21451c1 Orim's Thunder Update 2019-05-27 04:54:23 +00:00
Agetian
1a0988336e Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-26 13:01:31 +03:00
Alessandro Coli
4db2fd4ee7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-26 08:53:55 +02:00
Alessandro Coli
41e0760678 Riallineamento con branch master remoto 2019-05-26 08:52:02 +02:00
swordshine
25620ec33c Merge branch 'patch-17' into 'master'
Sword of Sinew and Steel

See merge request core-developers/forge!1717
2019-05-26 06:14:16 +00:00
swordshine
37325b8a9e Merge branch 'patch-16' into 'master'
Sword of Truth and Justice

See merge request core-developers/forge!1716
2019-05-26 06:13:42 +00:00
swordshine
d8593cff8f Merge branch 'patch-15' into 'master'
Archmage's Charm

See merge request core-developers/forge!1715
2019-05-26 06:11:29 +00:00
swordshine
de0149dace Merge branch 'patch-18' into 'master'
Update Modern Horizons edition file

See merge request core-developers/forge!1718
2019-05-26 06:07:07 +00:00
swordshine
3f632d74d7 Merge branch 'patch-14' into 'master'
Condemn update

See merge request core-developers/forge!1714
2019-05-26 06:05:49 +00:00
Charles Baker
8b561bacfd Update Modern Horizons edition file 2019-05-26 03:06:52 +00:00
Charles Baker
427d23dfa4 Sword of Sinew and Steel 2019-05-26 03:02:21 +00:00
Charles Baker
17bb054bc4 Sword of Truth and Justice 2019-05-26 02:45:44 +00:00
Charles Baker
af935f96ce Archmage's Charm 2019-05-26 02:28:34 +00:00
Charles Baker
94c21f7fff Condemn update 2019-05-26 02:08:23 +00:00
swordshine
b590e9613c Merge branch 'patch' into 'master'
Update more scripts

See merge request core-developers/forge!1713
2019-05-25 16:42:36 +00:00
swordshine
d6f32071e3 Update more scripts 2019-05-26 00:41:07 +08:00
swordshine
03e6c71b10 Merge branch 'patch' into 'master'
Patch

See merge request core-developers/forge!1712
2019-05-25 16:19:22 +00:00
swordshine
c3ff31f078 Update more scripts 2019-05-26 00:13:00 +08:00
Agetian
d8c39bd5da Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-25 19:04:34 +03:00
swordshine
8ba80940da Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1710
2019-05-25 16:02:48 +00:00
Agetian
8101af1fa2 - Fixed Mox Tantalite. 2019-05-25 19:02:33 +03:00
swordshine
3659bd6777 Update some scripts 2019-05-26 00:02:29 +08:00
swordshine
4fc93a3f71 Merge branch 'mh1spoilers' into 'master'
Mh1spoilers

See merge request core-developers/forge!1695
2019-05-25 15:57:59 +00:00
Alessandro Coli
36b9689cf8 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-25 17:17:16 +02:00
Michael Kamensky
5563cbe3b5 Merge branch 'master' into 'master'
Added puzzle PS_WAR3: Possibility Storm - War of the Spark 03

See merge request core-developers/forge!1709
2019-05-25 14:53:11 +00:00
Agetian
da0e89fde9 - Added puzzle PS_WAR3. 2019-05-25 17:52:20 +03:00
maustin
5dbc01b81b Merge remote-tracking branch 'Austin/mh1spoilers' into mh1spoilers
# Conflicts:
#	forge-gui/res/cardsfolder/upcoming/bazaar_trademage.txt
#	forge-gui/res/cardsfolder/upcoming/mother_bear.txt
2019-05-25 15:07:41 +01:00
austinio7116
46bfb76a84 Updated modern horizons edition file tokens 2019-05-25 15:05:19 +01:00
austinio7116
8a59d00423 Updated modern horizons edition file 2019-05-25 15:05:19 +01:00
austinio7116
bd23f13dbc More spoilers from forgescribe 2019-05-25 15:05:19 +01:00
austinio7116
7ce5f9a94c Remove unsupported Slice onto instant/sorcery for now 2019-05-25 15:01:18 +01:00
austinio7116
4306c16e57 Updated modern horizons edition file 2019-05-25 15:01:18 +01:00
austinio7116
36db4d8d14 Some of today's spoilers from forgescribe - untested 2019-05-25 15:01:18 +01:00
Michael Kamensky
ab982a7ebd Merge branch 'master' into 'master'
AnimateAllAi: implement an "Always" logic hook for cards that are beneficial to activate

Closes #1004

See merge request core-developers/forge!1708
2019-05-25 05:06:46 +00:00
Agetian
8caf66ecea - AnimateAllAi: implement an "Always" logic hook for cards that are generally beneficial to activate. 2019-05-25 08:05:03 +03:00
Michael Kamensky
6c6cdbe9d7 Merge branch 'master' into 'master'
Fix a logic error in RearrangeTopOfLibrary AI

Closes #1005

See merge request core-developers/forge!1707
2019-05-25 04:06:55 +00:00
Agetian
1c0f98e55a - Fix a logic error in RearrangeTopOfLibrary AI 2019-05-25 07:05:18 +03:00
Michael Kamensky
08b426b49c Merge branch 'master' into 'master'
Fix Ob Nixilis's Cruelty.

Closes #1003

See merge request core-developers/forge!1706
2019-05-25 04:01:12 +00:00
Agetian
9cd92946b0 - Fix Ob Nixilis's Cruelty. 2019-05-25 07:00:41 +03:00
austinio7116
13eb77fb78 Updated modern horizons edition file tokens 2019-05-24 22:59:30 +01:00
austinio7116
66eccbf287 Updated modern horizons edition file 2019-05-24 22:57:54 +01:00
austinio7116
84de707081 More spoilers from forgescribe 2019-05-24 22:51:52 +01:00
Michael Kamensky
ade5107200 Merge branch 'ai-clone-legendary' into 'master'
Make the AI consider the NonLegendary flag on AF Clone and AF CopyPermanent

Closes #999

See merge request core-developers/forge!1704
2019-05-24 16:00:49 +00:00
austinio7116
d34a216176 Remove unsupported Slice onto instant/sorcery for now 2019-05-24 16:56:36 +01:00
Alessandro Coli
c5b09815e3 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-24 13:40:56 +02:00
swordshine
c8f21c2c8a Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1705
2019-05-24 03:52:42 +00:00
swordshine
e020fce608 Update some scripts 2019-05-24 11:52:20 +08:00
swordshine
ca8cb7c312 Merge branch 'patch-13' into 'master'
Umezawa's Charm

See merge request core-developers/forge!1703
2019-05-24 03:45:38 +00:00
swordshine
dccb60c541 Merge branch 'patch-12' into 'master'
Feaster of Fools

See merge request core-developers/forge!1701
2019-05-24 03:45:32 +00:00
swordshine
112ba12e6d Merge branch 'patch-11' into 'master'
Mother Bear

See merge request core-developers/forge!1700
2019-05-24 03:45:10 +00:00
swordshine
2e175c3adb Merge branch 'patch-9' into 'master'
Bazaar Trademage

See merge request core-developers/forge!1698
2019-05-24 03:44:16 +00:00
Agetian
86480dde6f - Make the AI consider the NonLegendary flag on AF Clone and AF CopyPermanent 2019-05-24 06:17:48 +03:00
Charles Baker
96fedcea5c Umezawa's Charm 2019-05-24 02:59:30 +00:00
Michael Kamensky
b31dce4a59 Merge branch 'master' into 'master'
Fix Liliana's Triumph (both the card and the AI)

See merge request core-developers/forge!1702
2019-05-24 02:46:33 +00:00
Agetian
2b04494256 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-24 05:45:24 +03:00
Charles Baker
dd7f3f008c Feaster of Fools 2019-05-24 02:45:13 +00:00
Agetian
4c98b135be - Fix Defined declaration on Liliana's Triumph (also takes care of the AI issues with it). 2019-05-24 05:44:00 +03:00
Charles Baker
fa711fb1e1 Mother Bear 2019-05-24 02:32:41 +00:00
swordshine
69be7a0f7a Merge branch 'patch-10' into 'master'
Mox Tantalite

See merge request core-developers/forge!1699
2019-05-24 02:29:57 +00:00
swordshine
6112f17339 Merge branch 'patch-8' into 'master'
Collected Conjuring

See merge request core-developers/forge!1697
2019-05-24 02:27:45 +00:00
Charles Baker
08706e17f4 Mox Tantalite 2019-05-24 02:25:10 +00:00
Charles Baker
4b0a80adaf Bazaar Trademage 2019-05-24 02:24:06 +00:00
Charles Baker
619bf7bd02 Update collected_conjuring.txt 2019-05-24 02:17:36 +00:00
Charles Baker
e31856994f Collected Conjuring 2019-05-24 02:03:47 +00:00
swordshine
d4ac3153ce Merge branch 'master' into 'master'
Moving hard-coded text to res files

See merge request core-developers/forge!1632
2019-05-24 00:35:11 +00:00
swordshine
fac735edc7 Merge branch 'urza-mh1' into 'master'
Added Urza, Lord High Artificer.

See merge request core-developers/forge!1696
2019-05-24 00:33:54 +00:00
Agetian
2daf92608c - AI logic support for Urza, Lord High Artificer.
- Minor fix.
2019-05-23 21:51:39 +03:00
Agetian
009909042b - Added Urza, Lord High Artificer. 2019-05-23 21:40:41 +03:00
austinio7116
1abc000deb Updated modern horizons edition file 2019-05-23 18:39:43 +01:00
austinio7116
4d84ee6beb Some of today's spoilers from forgescribe - untested 2019-05-23 18:33:18 +01:00
Churrufli
191488089e Update en-US.properties 2019-05-23 13:23:33 +00:00
swordshine
a099cb8916 Merge branch 'master' into 'master'
Update some scripts

See merge request core-developers/forge!1694
2019-05-23 06:06:49 +00:00
swordshine
8bd6b6393e Update some scripts 2019-05-23 14:06:33 +08:00
swordshine
bb75ce6030 Merge branch 'patch-5' into 'master'
Astral Drift

See merge request core-developers/forge!1689
2019-05-23 05:59:39 +00:00
swordshine
b7828a8a61 Merge branch 'mh1spoilers' into 'master'
Some of today's MH1 spoilers from forgescribe

See merge request core-developers/forge!1688
2019-05-23 05:59:22 +00:00
swordshine
aac5a857a1 Merge branch 'patch-7' into 'master'
Good-Fortune Unicorn

See merge request core-developers/forge!1691
2019-05-23 03:49:54 +00:00
Michael Kamensky
f838cc2b20 Merge branch 'master' into 'master'
Tweak and merge Indigo Dragon's card patch.

See merge request core-developers/forge!1693
2019-05-23 03:38:23 +00:00
Agetian
3de494d6ac - Fixed Ultimate on Jace, Arcane Strategist. 2019-05-23 06:37:35 +03:00
Agetian
210e9484a0 Merge branch 'patch-2' of git.cardforge.org:Indigo_Dragon/forge into agetian-master 2019-05-23 06:36:46 +03:00
Michael Kamensky
25d8d7c338 Merge branch 'master' into 'master'
Improve AI targeting logic for Transmogrifying Wand.

Closes #994

See merge request core-developers/forge!1692
2019-05-23 03:28:26 +00:00
Agetian
f2f1c8997e - Improve AI targeting logic for Transmogrifying Wand. 2019-05-23 06:27:30 +03:00
Charles Baker
6c2b1b4633 Good-Fortune Unicorn 2019-05-23 02:55:29 +00:00
swordshine
5ecd07b939 Merge branch 'patch-6' into 'master'
Cleaner script for Morophon

See merge request core-developers/forge!1690
2019-05-23 01:15:23 +00:00
Charles Baker
37942cfc28 Cleaner script for Morophon 2019-05-23 00:18:36 +00:00
Charles Baker
3ed4663212 Astral Drift 2019-05-23 00:10:13 +00:00
austinio7116
fcedd44e4b Fixed dregscape error 2019-05-22 20:36:56 +01:00
austinio7116
886ec03b3e Sliver cards from AStrangerIsHere merged with a few additions that forscribe suggested too. 2019-05-22 20:27:27 +01:00
austinio7116
16d158f34e Some of today's MH1 spoilers from forgescribe 2019-05-22 19:56:43 +01:00
Indigo Dragon
f1ba38c3ee Update jace_arcane_strategist.txt 2019-05-22 16:16:08 +00:00
Michael Kamensky
7a6bbcb578 Merge branch 'patch-4' into 'master'
Mind grind cost fix. Original patch was committed in error.

See merge request core-developers/forge!1687
2019-05-22 15:04:18 +00:00
Charles Baker
c6768bedfc Mind grind cost fix. Original patch was committed in error. 2019-05-22 14:31:25 +00:00
Indigo Dragon
a08a99f65f Update jace_arcane_strategist.txt | Planeswalker$ True | 2019-05-22 11:32:42 +00:00
Indigo Dragon
a338cb194a Update loyal_subordinate.txt 2019-05-22 11:30:59 +00:00
Indigo Dragon
c5cf438fbd Update loyal_drake.txt 2019-05-22 11:30:52 +00:00
Indigo Dragon
f0a8e32c4f Update loyal_guardian.txt 2019-05-22 11:30:37 +00:00
Indigo Dragon
4faea5809f Update loyal_apprentice.txt 2019-05-22 11:30:26 +00:00
Indigo Dragon
06130171a6 Update loyal_unicorn.txt 2019-05-22 11:26:49 +00:00
swordshine
daf9fd4160 Merge branch 'geneticalgorithmnetdecks' into 'master'
Added a new netdeck category to house the outputs of my genetic algorithm to find the best decks for the AI to play in each format

See merge request core-developers/forge!1685
2019-05-22 06:18:14 +00:00
swordshine
26e64d5c80 Merge branch 'patch-3' into 'master'
Seasoned Pyromancer

See merge request core-developers/forge!1683
2019-05-22 06:17:19 +00:00
austinio7116
0ff4e5f515 Added details of new net deck to Changes.txt 2019-05-22 06:53:24 +01:00
austinio7116
3ed540279f Added a new netdeck category to house the outputs of my genetic algorithm to find the best decks for the AI to play in each format 2019-05-22 06:49:46 +01:00
Michael Kamensky
ad53c533f6 Merge branch 'master' into 'master'
Ugin, the Ineffable: fix duration on DB Effect.

See merge request core-developers/forge!1684
2019-05-22 03:49:38 +00:00
Agetian
023cb838cb - Ugin, the Ineffable: fix duration on DB Effect. 2019-05-22 06:49:05 +03:00
Charles Baker
989c289eb4 Seasoned Pyromancer 2019-05-22 03:15:46 +00:00
swordshine
8cb59f9ddd Merge branch 'patch-2' into 'master'
Update to mind grind, X can now be 0.

See merge request core-developers/forge!1682
2019-05-22 00:57:30 +00:00
swordshine
99561f9d23 Merge branch 'mh1spoilers' into 'master'
Some MH1 Spoilers for forgeScribe

See merge request core-developers/forge!1681
2019-05-22 00:56:37 +00:00
Charles Baker
4bfa127fce Update to mind grind, X can now be 0. 2019-05-21 23:52:22 +00:00
austinio7116
0d9784e8b9 Some MH1 Spoilers for forgeScribe 2019-05-21 22:01:01 +01:00
Alessandro Coli
3da7b0f8e6 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-21 20:38:45 +02:00
Alessandro Coli
1aa0d321cc Settings i like more for the AI 2019-05-21 20:37:30 +02:00
swordshine
f2dddd552b Merge branch 'ai-blink-reload-pw' into 'master'
AI logic to blink-reload a planeswalker using Teferi's Time Twist.

See merge request core-developers/forge!1680
2019-05-21 14:39:33 +00:00
Michael Kamensky
c5e4518779 AI logic to blink-reload a planeswalker using Teferi's Time Twist. 2019-05-21 14:39:33 +00:00
swordshine
cdeb944a57 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1679
2019-05-21 05:28:12 +00:00
swordshine
bdcca785df Update some scripts 2019-05-21 13:27:54 +08:00
Michael Kamensky
74ddb424f0 Merge branch 'master' into 'master'
Implement some logic support for Finale of Revelation.

Closes #991

See merge request core-developers/forge!1678
2019-05-21 05:21:44 +00:00
swordshine
90851d3446 Merge branch 'patch-23' into 'master'
Morophon, the Boundless

See merge request core-developers/forge!1674
2019-05-21 05:21:43 +00:00
swordshine
564a6b11eb Merge branch 'patch-22' into 'master'
Impostor of the Sixth Pride

See merge request core-developers/forge!1673
2019-05-21 05:18:36 +00:00
swordshine
64f3be6326 Merge branch 'patch-21' into 'master'
Ice-Fang Coatl

See merge request core-developers/forge!1672
2019-05-21 05:18:22 +00:00
Agetian
4e0b252ea0 - Implement some logic support for Finale of Revelation. 2019-05-21 08:18:01 +03:00
swordshine
6afb1838a0 Merge branch 'patch-20' into 'master'
Headless Specter

See merge request core-developers/forge!1671
2019-05-21 05:16:12 +00:00
swordshine
f958dc3267 Merge branch 'patch-19' into 'master'
Goblin War Party

See merge request core-developers/forge!1670
2019-05-21 05:14:55 +00:00
swordshine
c2c035997a Merge branch 'patch-18' into 'master'
Force of Vigor

See merge request core-developers/forge!1669
2019-05-21 05:13:40 +00:00
Charles Baker
be1c3defba Morophon, the Boundless 2019-05-21 04:04:40 +00:00
Charles Baker
f37f42e328 Impostor of the Sixth Pride 2019-05-21 04:03:17 +00:00
Charles Baker
855142da75 Ice-Fang Coatl 2019-05-21 04:02:15 +00:00
Charles Baker
d02d1c8e41 Headless Specter 2019-05-21 04:01:04 +00:00
Charles Baker
f3e3ce9e26 Goblin War Party 2019-05-21 04:00:06 +00:00
Charles Baker
c22a3d0657 Force of Vigor 2019-05-21 03:58:37 +00:00
swordshine
bba6009313 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1667
2019-05-21 02:09:21 +00:00
swordshine
1a42691bbc Update some scripts 2019-05-21 10:08:28 +08:00
swordshine
549d86aa53 Merge branch 'fix-reflmana' into 'master'
Fix the express mana payment sometimes presenting the player with choices which are not legal.

Closes #978

See merge request core-developers/forge!1666
2019-05-21 01:16:16 +00:00
Michael Kamensky
ccc935a025 Fix the express mana payment sometimes presenting the player with choices which are not legal. 2019-05-21 01:16:16 +00:00
Michael Kamensky
f2f2ef09e2 Merge branch 'master' into 'master'
Added an AI hint for God-Eternal Rhonas.

See merge request core-developers/forge!1665
2019-05-20 11:24:25 +00:00
Agetian
29357d05f1 - Added an AI hint for God-Eternal Rhonas. 2019-05-20 14:23:49 +03:00
swordshine
c54625574d Merge branch 'morwardeckgen' into 'master'
More WAR Standard deck generation data

See merge request core-developers/forge!1664
2019-05-20 05:43:58 +00:00
austinio7116
cd28c71336 More WAR Standard deck generation data
(cherry picked from commit 6fc7f55)
2019-05-20 05:46:19 +01:00
Michael Kamensky
836635c15c Merge branch 'master' into 'master'
Change the obsolete comment regarding the macOS version of Forge.

See merge request core-developers/forge!1663
2019-05-20 03:26:51 +00:00
Agetian
ec09353c1c - Change the obsolete comment regarding the macOS version of Forge. 2019-05-20 06:24:37 +03:00
Michael Kamensky
a97b334408 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.25.001 [incremental].

See merge request core-developers/forge!1662
2019-05-20 02:52:18 +00:00
Agetian
8bec57b991 - Preparing Forge for Android publish 1.6.25.001 [incremental]. 2019-05-20 05:51:47 +03:00
swordshine
0efc5f77b9 Merge branch 'patch-17' into 'master'
Deep Forest Hermit

See merge request core-developers/forge!1661
2019-05-20 02:32:34 +00:00
swordshine
8122e2fb67 Merge branch 'patch-16' into 'master'
Force of negation

See merge request core-developers/forge!1660
2019-05-20 02:26:39 +00:00
swordshine
5fdad29080 Merge branch 'patch' into 'master'
Modern Horizons cards

See merge request core-developers/forge!1657
2019-05-20 02:20:21 +00:00
swordshine
170a62d1d7 Merge branch 'master' into 'patch' 2019-05-20 02:19:39 +00:00
swordshine
f353d07ca3 Merge branch 'patch-15' into 'master'
Update CONTRIBUTORS.txt

See merge request core-developers/forge!1659
2019-05-20 02:18:18 +00:00
swordshine
32223f0993 Add Savage Swipe 2019-05-20 10:10:29 +08:00
Charles Baker
e07f06a452 Update force_of_negation 2019-05-20 02:04:06 +00:00
Charles Baker
1b74ae2d33 Add new file 2019-05-20 02:03:25 +00:00
Charles Baker
df6df78550 Add new file 2019-05-20 01:49:40 +00:00
Charles Baker
d7f3cee09e Update CONTRIBUTORS.txt 2019-05-20 01:06:29 +00:00
Charles Baker
5f3f54b919 Update CONTRIBUTORS.txt 2019-05-20 01:05:17 +00:00
swordshine
5b6655e14b Merge branch 'master' of https://git.cardforge.org/core-developers/forge into patch 2019-05-20 09:03:00 +08:00
swordshine
3413f7447a Merge branch 'patch-10' into 'master'
Cabal Therapist from Modern Horizons

See merge request core-developers/forge!1641
2019-05-20 01:00:44 +00:00
Blacksmith
793514b78e Clear out release files in preparation for next release 2019-05-20 00:46:57 +00:00
Blacksmith
6c945608b3 [maven-release-plugin] prepare for next development iteration 2019-05-20 00:42:07 +00:00
Blacksmith
57786e7c81 [maven-release-plugin] prepare release forge-1.6.25 2019-05-20 00:42:02 +00:00
Blacksmith
d5d8d9e34d Update README.txt for release 2019-05-20 00:39:10 +00:00
Sol
e5dc87fc7a Merge branch 'patch-2' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!1658
2019-05-20 00:33:36 +00:00
Sol
9a644b9ac9 Update ANNOUNCEMENTS.txt 2019-05-20 00:32:28 +00:00
Michael Kamensky
4eb1971bdd Merge branch 'ai-improvements' into 'master'
Assorted AI improvements and fixes

See merge request core-developers/forge!1656
2019-05-19 16:49:42 +00:00
swordshine
606f2b9ca5 Add Serra the Benevolent by nikivan 2019-05-20 00:08:40 +08:00
Agetian
0bf336140a - Sarkhan trigger damage doesn't depend on the number of attackers. 2019-05-19 18:55:00 +03:00
Agetian
ab2d9afbf6 - Basic Teferi's Time Twist AI logic (currently only uses it to flicker-save its permanents) 2019-05-19 18:52:46 +03:00
swordshine
1558bbd3b3 Merge branch 'patch' into 'master'
Fix Sorin

See merge request core-developers/forge!1655
2019-05-19 15:35:47 +00:00
Agetian
ad1c42acfc - AI precaution against attacking into Sarkhan the Masterless 2019-05-19 18:35:39 +03:00
swordshine
297e228b2a Fix Sorin 2019-05-19 23:35:17 +08:00
Agetian
1b773d0ac6 - Fixed a missing reference. 2019-05-19 17:25:50 +03:00
Agetian
84480ddf72 - DamageDealAi: SVars for PayX are now processed per spell ability. Fixes e.g. paying 0 for Explosion.
- Teferi's Time Twist: deckbuilding hint
2019-05-19 17:19:41 +03:00
Michael Kamensky
e19084c413 Merge branch 'patch-14' into 'master'
Teferi's Time Twist

See merge request core-developers/forge!1653
2019-05-19 13:42:34 +00:00
Michael Kamensky
6bdaf70812 Merge branch 'sols-ugin' into 'master'
Ugin the Ineffable

See merge request core-developers/forge!1651
2019-05-19 13:28:54 +00:00
Michael Kamensky
c46e31d8e3 Merge branch 'facedownResetFix' into 'master'
Facedown: fix effects turning cards face down in exile

See merge request core-developers/forge!1654
2019-05-19 13:28:10 +00:00
Hans Mackowiak
08041e14fb Facedown: fix effects turning cards face down in exile 2019-05-19 13:28:10 +00:00
Agetian
dec8621218 - Revert a jury-rigged workaround. 2019-05-19 16:17:50 +03:00
Charles Baker
d1c990f54e Teferi's Time Twist 2019-05-19 04:21:27 +00:00
Agetian
7ef3884d5c - FIXME: modified a check for faceDown inside changeZone so that it works for face down exiled cards. Why is isFaceDown() not working though?
- Added AI hint for Ugin.
2019-05-19 07:15:14 +03:00
Michael Kamensky
b8a0882b66 Merge branch 'master' into 'master'
Don't fall through to other switch cases in CardView to avoid subtle bugs.

See merge request core-developers/forge!1652
2019-05-19 04:03:10 +00:00
Agetian
85b697d54e - Don't fall through to other switch cases in CardView to avoid subtle bugs. 2019-05-19 06:58:37 +03:00
Sol
0fb8ed7f0a Merge branch 'bolasVivien' into 'master'
Bolas's Citadel and Vivien, Champion of the Wilds

See merge request core-developers/forge!1650
2019-05-19 02:36:56 +00:00
Hans Mackowiak
e9ad4be05d - CardView: fall through in case a card in exile is face down, so that all the relevant checks are made. 2019-05-19 02:36:56 +00:00
Sol
1eb9589548 Ugin the Ineffable 2019-05-19 02:06:32 +00:00
Michael Kamensky
39267b4723 Merge branch 'master' into 'master'
Fixed a logic error in DigAi which prevented the AI from paying a X cost for Vivien's Arkbow

Closes #988

See merge request core-developers/forge!1649
2019-05-17 13:27:41 +00:00
Agetian
e93421d4b7 - Fixed a logic error in DigAi which prevented the AI from paying a mana cost e.g. for Vivien's Arkbow. 2019-05-17 16:22:54 +03:00
swordshine
a090479253 Merge branch 'patch-13' into 'master'
Fblthp, the Lost correction

See merge request core-developers/forge!1648
2019-05-16 00:47:49 +00:00
Charles Baker
20eb6777d2 added Legendary type 2019-05-15 22:26:40 +00:00
Michael Kamensky
b00851ed24 Merge branch 'patch-12' into 'master'
Storrev, Devkarin Lich from War of the Spark

See merge request core-developers/forge!1646
2019-05-15 03:25:17 +00:00
Charles Baker
a922697d26 Storrev, Devkarin Lich from War of the Spark 2019-05-15 01:28:59 +00:00
Michael Kamensky
3b605adb4d Merge branch 'war-tricky-cards' into 'master'
Added Ashiok, Dream Render.

See merge request core-developers/forge!1644
2019-05-14 15:22:19 +00:00
Agetian
31d9a1e6b3 - Attempting to consolidate the implementation for "can't search library". 2019-05-14 16:33:09 +03:00
Agetian
3913f7661f - Some AI support for CantSearchLibrary / Ashiok effect. 2019-05-14 12:13:10 +03:00
Michael Kamensky
83be371d1c Merge branch 'patch-8' into 'master'
Fade Away from Exodus

See merge request core-developers/forge!1634
2019-05-14 08:35:47 +00:00
Agetian
72d623784a - Added Ashiok, Dream Render. 2019-05-14 08:38:24 +03:00
Michael Kamensky
681446cba4 Merge branch 'master' into 'master'
Added puzzle PS_WAR2 (Possibility Storm - War of the Spark 02)

See merge request core-developers/forge!1643
2019-05-14 05:25:52 +00:00
Agetian
5eb56e0d0e - Added puzzle PS_WAR2. 2019-05-14 07:27:46 +03:00
Agetian
b45ab00cf6 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-14 07:15:56 +03:00
Michael Kamensky
5ce0340240 Merge branch 'activationLimitStatic' into 'master'
Card: store activations in Card

See merge request core-developers/forge!1640
2019-05-13 14:39:11 +00:00
Hans Mackowiak
8e5e8e1759 Card: store activations in Card 2019-05-13 14:39:11 +00:00
Charles Baker
00bd55f063 Add new file 2019-05-11 18:19:37 +00:00
Agetian
ad80eaa4e9 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-11 20:15:48 +03:00
Michael Kamensky
8f0457f0fa Merge branch 'master' into 'master'
A couple card fixes.

Closes #981

See merge request core-developers/forge!1639
2019-05-11 04:34:17 +00:00
Michael Kamensky
e22bf5944b - Fixed Band Together.
- Adding a couple missing references to Incubation Druid.
2019-05-11 04:34:17 +00:00
Agetian
984b807f27 - Fixed Band Together, part 2. 2019-05-11 07:10:40 +03:00
Agetian
eb5d50da40 - Merge upstream. 2019-05-11 07:09:49 +03:00
Agetian
3d320603b2 - Fixed Band Together.
- Adding a couple missing references to Incubation Druid.
2019-05-11 07:00:58 +03:00
Charles Baker
48b3fe1209 Update fade_away.txt 2019-05-10 10:40:34 +00:00
swordshine
43f71b0d1e Merge branch 'patch-9' into 'master'
Band Together correction

See merge request core-developers/forge!1638
2019-05-10 02:57:39 +00:00
Charles Baker
08551d8ac9 Band Together correction 2019-05-10 02:26:45 +00:00
swordshine
d4b8174fcb Merge branch 'patch-2' into 'master'
Update dreadhorde_invasion.txt

See merge request core-developers/forge!1637
2019-05-10 01:21:28 +00:00
Sol
a32a3e5feb Update dreadhorde_invasion.txt 2019-05-10 01:10:33 +00:00
Michael Kamensky
19116c70b0 Merge branch 'wardeckgen' into 'master'
Early WAR standard deck generation data

See merge request core-developers/forge!1636
2019-05-09 11:11:33 +00:00
austinio7116
3e26cf25f1 Early WAR standard deck generation data
(cherry picked from commit ab59734)
2019-05-09 06:30:47 +01:00
Michael Kamensky
576fc9834b Merge branch 'master' into 'master'
Added puzzle PS_WAR1 (Possibility Storm - War of the Spark 01)

See merge request core-developers/forge!1635
2019-05-09 04:48:05 +00:00
Agetian
99b324162c - Added puzzle PS_WAR1. 2019-05-09 07:47:21 +03:00
swordshine
59e3e01481 Merge branch 'patch-7' into 'master'
Jaya, Vernerated Firemage correction

See merge request core-developers/forge!1633
2019-05-09 04:38:54 +00:00
Charles Baker
b2a1f696e6 Fade Away from Exodus 2019-05-09 01:54:50 +00:00
Charles Baker
ede13b134f Updated so that only other red sources the player controls get the additional 1 damage. Jaya's ability will now only do 2 damage instead of 3. 2019-05-09 01:33:05 +00:00
swordshine
335f2176df Merge branch 'undefined' into 'master'
Azra Oddsmaker

See merge request core-developers/forge!1626
2019-05-09 00:48:07 +00:00
Charles Baker
6969adcbb1 Update azra_oddsmaker.txt 2019-05-08 23:51:15 +00:00
Charles Baker
e9e85cc413 This code was able to produce the effects of the card without targeting. 2019-05-08 23:43:54 +00:00
churrufli
70655c0f26 Moving hard-coded text to en-US.properties file 2019-05-09 00:03:38 +02:00
churrufli
d041a1d315 updating res files 2019-05-08 23:21:03 +02:00
churrufli
e9b266e1d2 updating res files 2019-05-08 23:21:03 +02:00
churrufli
ae4bb531f0 updating res files 2019-05-08 23:21:03 +02:00
churrufli
08ae29c502 updating res files 2019-05-08 23:21:03 +02:00
churrufli
efb3401eff Update language properties 2019-05-08 23:21:03 +02:00
churrufli
662d725aa4 updating res files 2019-05-08 23:21:03 +02:00
churrufli
707a897fbe updating res files 2019-05-08 23:21:03 +02:00
churrufli
77bb7f9f42 Update language properties 2019-05-08 23:21:03 +02:00
Sol
d60be863d1 Merge branch 'pwNumActivated' into 'master'
Pw num activated

Closes #963

See merge request core-developers/forge!1631
2019-05-08 01:36:10 +00:00
Hanmac
a5a8386b58 cards: some card fixes 2019-05-07 23:01:12 +02:00
Hanmac
7160670597 PW Ability: store num of activations in card 2019-05-07 23:00:24 +02:00
swordshine
4cae773077 Merge branch 'patch-3' into 'master'
Together Forever - Tested and Working

See merge request core-developers/forge!1627
2019-05-07 02:17:47 +00:00
Charles Baker
b1ad461e80 Should now be choose instead of target. 2019-05-06 22:33:04 +00:00
Charles Baker
7515126302 Update together_forever.txt 2019-05-06 21:07:27 +00:00
swordshine
beba8121c1 Merge branch 'patch-2' into 'master'
Virulent Wound: Change SubAbility from DBAnimate to DBEffect. Changed Oracle to match current.

See merge request core-developers/forge!1625
2019-05-06 02:47:51 +00:00
Charles Baker
f20580084e Update virulent_wound.txt 2019-05-06 02:15:14 +00:00
Charles Baker
44b6b8fcf4 Update virulent_wound.txt 2019-05-06 02:14:42 +00:00
swordshine
d813648464 Merge branch 'patch-4' into 'master'
Ajani Goldmane Avatar Token was spawning without P/T with the previous script (causing it to die...

See merge request core-developers/forge!1628
2019-05-06 00:59:32 +00:00
Charles Baker
fb6e04720c Shadowbane - Tested and working 2019-05-05 19:09:29 +00:00
Charles Baker
f93a4aba47 Update together_forever 2019-05-05 19:08:06 +00:00
Charles Baker
5338becbfb Token was spawning without P/T with the previous script (causing it to die ASAP). This modification allows the token to spawn with the desired X value. 2019-05-05 18:38:10 +00:00
Charles Baker
9fe925dc6c Together Forever - Tested and Working 2019-05-05 17:06:53 +00:00
Charles Baker
4954aebc96 Update virulent_wound.txt 2019-05-05 16:46:30 +00:00
Charles Baker
ce68bde583 Azra Oddsmaker - Tested and Working 2019-05-05 16:41:08 +00:00
Charles Baker
943269cfac Change SubAbility from DBAnimate to DBEffect. Changed Oracle to match current. 2019-05-05 16:34:23 +00:00
swordshine
5cd60cf9a3 Merge branch 'patch' into 'master'
Some nonfunctional changes according to the update bulletin

See merge request core-developers/forge!1624
2019-05-05 04:38:39 +00:00
swordshine
ec97a6f966 Some nonfunctional changes according to the update bulletin 2019-05-05 11:55:25 +08:00
Agetian
620a407e59 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-05 06:37:40 +03:00
swordshine
aa8e41ec27 Merge branch 'patch' into 'master'
Fix more cards

See merge request core-developers/forge!1623
2019-05-05 01:00:14 +00:00
swordshine
7def9b88e8 Fix Narset's Reversal 2019-05-05 08:59:51 +08:00
swordshine
862fe57401 Fix Role Reversal 2019-05-05 08:58:10 +08:00
swordshine
27caf79e8f Merge branch 'patch' into 'master'
Fix a few cards

See merge request core-developers/forge!1622
2019-05-05 00:50:22 +00:00
swordshine
49bb679a12 Fix a few cards 2019-05-05 08:50:06 +08:00
Agetian
a4029cf114 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-04 16:39:20 +03:00
Michael Kamensky
1b76daa64f Merge branch 'patch' into 'master'
Add Niv-Mizzet Reborn

See merge request core-developers/forge!1620
2019-05-04 13:05:35 +00:00
swordshine
6b1343f6c9 Fix color pair 2019-05-04 20:55:29 +08:00
Michael Kamensky
21d980c36b Merge branch 'master' into 'master'
Fix the duration on Karn, the Great Creator's +1 ability

Closes #969

See merge request core-developers/forge!1621
2019-05-04 12:24:34 +00:00
Michael Kamensky
15964daa27 Fix the duration on Karn, the Great Creator's +1 ability 2019-05-04 12:24:34 +00:00
Agetian
6bac73fd37 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-04 15:23:29 +03:00
Agetian
add926535f - Fix Karn, the Great Creator's +1 ability duration. 2019-05-04 15:20:59 +03:00
swordshine
b6bfc9df3b Merge branch 'morphUpX' into 'master'
CardFactoryUtil: fix X in Morph cost

Closes #968

See merge request core-developers/forge!1619
2019-05-04 12:20:12 +00:00
Hans Mackowiak
7687ed591a CardFactoryUtil: fix X in Morph cost 2019-05-04 12:20:12 +00:00
swordshine
415edd2225 Merge branch 'patch-1' into 'master'
Update dire_fleet_ravager.txt (Oracle Text had wrong name)

See merge request core-developers/forge!1618
2019-05-04 12:19:58 +00:00
swordshine
e57ce5fa91 Reveal the picked cards 2019-05-04 20:01:40 +08:00
swordshine
e4fad75edd Add Niv-Mizzet Reborn 2019-05-04 19:43:01 +08:00
Computica
cc05043055 Update dire_fleet_ravager.txt (Oracle Text had wrong name) 2019-05-04 10:40:42 +00:00
Agetian
413ff146e7 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-04 13:12:37 +03:00
Michael Kamensky
54e163fb87 Merge branch 'godKefnetAi' into 'master'
Kefnet: add AI logic for the reveal effect

See merge request core-developers/forge!1617
2019-05-04 10:04:43 +00:00
Hans Mackowiak
fec2ea4bd8 Kefnet: add AI logic for the reveal effect 2019-05-04 10:04:43 +00:00
swordshine
ab340bf863 Merge branch 'war-ai-hints' into 'master'
War of the Spark AI hints

See merge request core-developers/forge!1616
2019-05-04 07:28:56 +00:00
Michael Kamensky
1be992af0c War of the Spark AI hints 2019-05-04 07:28:56 +00:00
Agetian
0bda3015d9 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-04 08:13:01 +03:00
swordshine
801ab7ceab Merge branch 'war_planeswalker_decks' into 'master'
Added WAR planeswalker decks to quest precons, added WAR to planar conquest Ravnica plane.

See merge request core-developers/forge!1615
2019-05-04 05:06:00 +00:00
Michael Kamensky
44a4e9c971 Added WAR planeswalker decks to quest precons, added WAR to planar conquest Ravnica plane. 2019-05-04 05:06:00 +00:00
Agetian
5f233e33a0 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-05-04 07:18:40 +03:00
swordshine
312dfc0205 Merge branch 'godEternalKefnet' into 'master'
Refactor Miracle and add God Eternal Kefnet

See merge request core-developers/forge!1609
2019-05-04 01:57:10 +00:00
Hans Mackowiak
38178cfb21 Refactor Miracle and add God Eternal Kefnet 2019-05-04 01:57:10 +00:00
austinio7116
3002cbb5a8 Merge branch 'patch' into 'master'
Add some cards

See merge request core-developers/forge!1613
2019-05-03 22:18:03 +00:00
swordshine
039cd133ce Update some scripts 2019-05-04 00:04:44 +08:00
swordshine
35446e583d Add Tolsimir, Friend to Wolves 2019-05-03 23:53:53 +08:00
swordshine
7cb593cec0 Add Kaya's Ghostform 2019-05-03 23:40:06 +08:00
swordshine
ef477f2b2e Update Deliver Unto Evil 2019-05-03 23:34:10 +08:00
swordshine
7aa1685590 Add Single Combat 2019-05-03 23:18:15 +08:00
swordshine
fd68a753b6 Add Gideon's Sacrifice 2019-05-03 22:56:36 +08:00
swordshine
24dff3250f Fix The Wanderer 2019-05-03 22:56:02 +08:00
swordshine
44eb2b34a2 Add Deliver Unto Evil 2019-05-03 22:28:11 +08:00
austinio7116
bfc79ca55f Merge branch 'patch' into 'master'
WAR: add some cards

See merge request core-developers/forge!1612
2019-05-03 09:14:19 +00:00
swordshine
284ef835b3 Removed a param in Command the Dreadhorde 2019-05-03 17:09:39 +08:00
swordshine
49e85c40b2 Add Command the Dreadhorde
Fix assassin token's trigger description
2019-05-03 17:06:50 +08:00
swordshine
be96de241d Add God-Eternal Rhonas 2019-05-03 16:11:13 +08:00
swordshine
a0f5afeaad Add Vraska, Swarm's Eminence 2019-05-03 13:07:14 +08:00
swordshine
00326240d4 WAR: add some cards 2019-05-03 12:47:20 +08:00
swordshine
fe20878e33 Merge branch 'patch' into 'master'
Add Mobilized District

See merge request core-developers/forge!1608
2019-05-03 03:05:35 +00:00
swordshine
0a44256403 Merge branch 'master' of https://git.cardforge.org/core-developers/forge into patch 2019-05-03 11:00:16 +08:00
swordshine
8764534d51 Merge branch 'war-cards' into 'master'
[WAR] Added 3 cards, fixed 1 card.

See merge request core-developers/forge!1607
2019-05-03 02:57:20 +00:00
swordshine
f233a1c6aa Merge branch 'patch-2' into 'master'
Update tenth_district_legionnaire.txt (Trigger didn't fire:Battlewise Hoplite w/Haste)

See merge request core-developers/forge!1611
2019-05-03 02:56:51 +00:00
swordshine
a2c0704b51 Merge branch 'patch-1' into 'master'
Update mu_yanling.txt (Add turn function wasn't called)

See merge request core-developers/forge!1610
2019-05-03 02:55:21 +00:00
Computica
94472179ee Update tenth_district_legionnaire.txt (Trigger didn't fire:Battlewise Hoplite w/Haste) 2019-05-03 02:46:26 +00:00
Computica
76b8ba2b68 Update mu_yanling.txt (Add turn function wasn't called) 2019-05-03 02:24:03 +00:00
Agetian
40df90456e - Removed Teferi's Time Twist [to be recoded differently later]. 2019-05-02 22:00:30 +03:00
swordshine
1a78f0a4f3 Add Mobilized District 2019-05-02 23:45:16 +08:00
Agetian
64bd2c8bf7 - Fix Jace, Wielder of Mysteries. 2019-05-02 18:38:29 +03:00
Agetian
6752586962 - Added a deck hint to Teferi's Time Twist. 2019-05-02 08:58:46 +03:00
Agetian
26cde44585 - Moved Tezzeret, Master of the Bridge to the proper release location. 2019-05-02 08:57:00 +03:00
Agetian
a6e9088bd8 - Added Teferi's Time Twist. 2019-05-02 08:56:08 +03:00
Agetian
1ab96d04c1 - Fix and update Tezzeret, Master of the Bridge 2019-05-02 08:36:40 +03:00
Agetian
9d5a577044 Merge branch 'nikitacards' of git.cardforge.org:Austin/forge into war-cards 2019-05-02 08:36:09 +03:00
Agetian
92c1da0c92 - Some minor tweaks. 2019-05-02 08:28:04 +03:00
Agetian
02d92e79fd - Added a missing ability to Fblthp. 2019-05-02 08:10:51 +03:00
Agetian
f5f49848fd - Adding WAR to the Ravnica plane in Planar Conquest. 2019-05-02 08:03:16 +03:00
Agetian
39714535f0 - Added Devouring Hellion and Fblthp, the Lost. 2019-05-02 08:01:27 +03:00
Michael Kamensky
e19cd9f4eb Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.24.001 [incremental].

See merge request core-developers/forge!1606
2019-05-02 03:41:02 +00:00
Agetian
dfc8db1b75 - Preparing Forge for Android publish 1.6.24.001 [incremental]. 2019-05-02 06:40:02 +03:00
Blacksmith
f846e1c262 Clear out release files in preparation for next release 2019-05-02 01:21:38 +00:00
Blacksmith
52ad5d559a [maven-release-plugin] prepare for next development iteration 2019-05-02 01:16:44 +00:00
Blacksmith
711bc38276 [maven-release-plugin] prepare release forge-1.6.24 2019-05-02 01:16:39 +00:00
Blacksmith
eed91b4354 Update README.txt for release 2019-05-02 01:14:00 +00:00
Sol
cbcb2037ea Merge branch 'war-release-info' into 'master'
Release info

See merge request core-developers/forge!1605
2019-05-02 01:12:10 +00:00
Chris H
d3e0e8ecde Release info 2019-05-01 21:04:06 -04:00
swordshine
3a2c7e8c8e Merge branch 'patch' into 'master'
Fix two cards

See merge request core-developers/forge!1604
2019-05-01 15:48:45 +00:00
swordshine
6b3d16267b Fix two cards 2019-05-01 23:48:20 +08:00
Sol
220e6eeb29 Merge branch 'migrate_war' into 'master'
Migrate WAR

See merge request core-developers/forge!1603
2019-05-01 14:06:40 +00:00
tehdiplomat
61d4faf5c0 Migrate WAR 2019-05-01 09:59:57 -04:00
Michael Kamensky
09a9718d02 Merge branch 'vitu-ghazi-test' into 'master'
A test for Awakening of Vitu-Ghazi + Cytoshape.

See merge request core-developers/forge!1602
2019-05-01 10:05:53 +00:00
Agetian
fd3deec51f - Test for the Goblin type.
- Change assert to assertTrue for style similarity.
2019-05-01 12:41:15 +03:00
Agetian
2447df4dde - Some more superfluous lines removed. 2019-05-01 12:35:41 +03:00
Agetian
7ae287b880 - Removed a couple duplicate lines. 2019-05-01 12:34:17 +03:00
Agetian
16797e67cd - Added a test for Awakening of Vitu-Ghazi + Cytoshape. 2019-05-01 12:32:06 +03:00
swordshine
f1b154319f Merge branch 'vituGhazi' into 'master'
Vitu ghazi

See merge request core-developers/forge!1596
2019-05-01 08:15:32 +00:00
Hans Mackowiak
698359cbc9 Vitu ghazi 2019-05-01 08:15:32 +00:00
Michael Kamensky
16cf063427 Merge branch 'differentColors' into 'master'
Add Different colors to combo mana

See merge request core-developers/forge!1600
2019-05-01 04:24:06 +00:00
Chris H
ea3cf1a7a8 Add Spell to mana restriction 2019-04-30 20:56:06 -04:00
Michael Kamensky
f72285e750 Merge branch 'master' into 'master'
Added puzzle PS_WAR0a (Possibility Storm - War of the Spark 00a: Pre-release Puzzle)

See merge request core-developers/forge!1601
2019-04-30 05:38:07 +00:00
Agetian
deae353e59 - Added puzzle PS_WAR0a. 2019-04-30 08:37:25 +03:00
Chris H
1f752ff210 Add Different colors to combo mana 2019-04-29 20:41:36 -04:00
swordshine
bb64aa8d25 Merge branch 'feather' into 'master'
Feather the Redeemed

See merge request core-developers/forge!1598
2019-04-29 12:41:02 +00:00
Hans Mackowiak
3f3b8bc41b Feather the Redeemed 2019-04-29 12:41:01 +00:00
Michael Kamensky
5ae6c9da0d Merge branch 'master' into 'master'
Minor code cleanup, minor counter visualization fix.

See merge request core-developers/forge!1599
2019-04-29 10:06:57 +00:00
Agetian
c609f199e4 - Minor code cleanup.
- Fix visualization of the Slumber counter.
2019-04-29 13:06:19 +03:00
Michael Kamensky
c38f1bf214 Merge branch 'sparkDouble' into 'master'
ReplacementEffect: rewrite for Riot and Spark Double

See merge request core-developers/forge!1592
2019-04-29 10:03:06 +00:00
Hans Mackowiak
1b47a81b8c ReplacementEffect: rewrite for Riot and Spark Double 2019-04-29 10:03:06 +00:00
Michael Kamensky
ca87a5d857 Merge branch 'fix_controlgain' into 'master'
Fix ControlGain effect to properly parse Defined (e.g. Humble Defector).

Closes #951

See merge request core-developers/forge!1597
2019-04-29 10:02:38 +00:00
Agetian
72101790ec - Fix ControlGain effect to properly parse Defined (e.g. Humble Defector). 2019-04-29 05:58:05 +03:00
swordshine
028afcb1be Merge branch 'patch' into 'master'
Add a token script

See merge request core-developers/forge!1595
2019-04-28 14:20:46 +00:00
swordshine
bdcf756eca Add a token script 2019-04-28 22:20:20 +08:00
swordshine
3e60e547e7 Merge branch 'morewarsparkcards' into 'master'
Another batch of forgescribe scriptable cards

See merge request core-developers/forge!1594
2019-04-28 14:19:26 +00:00
austinio7116
4f23fee435 Removed Serra for now 2019-04-28 07:22:55 +01:00
austinio7116
202667b708 Another batch of forgescriptable cards 2019-04-28 07:13:04 +01:00
Michael Kamensky
c4457110bc Merge branch 'patch-2' into 'master'
Emblems are not part of the token list

See merge request core-developers/forge!1593
2019-04-28 03:27:47 +00:00
Sol
074f180bbd Emblems are not part of the token list 2019-04-28 03:13:50 +00:00
swordshine
abfee4544d Merge branch 'nahari-storm-of-stone-x-damage' into 'master'
Fix the X-damage ability of Nahiri, Storm of Stone

See merge request core-developers/forge!1591
2019-04-28 01:26:57 +00:00
swordshine
e19980b16a Merge branch 'bleeding-edge-amass-fix' into 'master'
Fix the amass on Bleeding Edge

See merge request core-developers/forge!1590
2019-04-28 01:26:40 +00:00
Brock Fanning
39b16fd885 Fix the X-damage ability of Nahiri 2019-04-27 14:41:12 -04:00
Brock Fanning
29ed87af3a Fix the amass on Bleeding Edge 2019-04-27 14:40:16 -04:00
austinio7116
829aacf13b two cards taken from Nikita's MR to separate them from the Krenko clash 2019-04-27 08:47:49 +01:00
austinio7116
add3cf762a Merge branch 'war-cards' into 'master'
Enter the God-Eternals, Sarkhan

See merge request core-developers/forge!1588
2019-04-27 07:33:15 +00:00
Michael Kamensky
b8f7b3d4e7 Merge branch 'fix_charging_cinderhorn' into 'master'
Fix Charging Cinderhorn not working for anyone except the first player + fix Make Yourself Useful

Closes #952 and #954

See merge request core-developers/forge!1586
2019-04-27 05:07:44 +00:00
Agetian
8674487c4a - Fix Make Yourself Useful. 2019-04-27 07:52:31 +03:00
Adam Pantel
4930bc1fd1 Enter the God-Eternals, Sarkhan 2019-04-27 00:50:19 -04:00
Hans Mackowiak
2e6249cb71 Merge branch 'spark-harvest-fix' into 'master'
Fix alt costs of Spark Harvest

See merge request core-developers/forge!1585
2019-04-27 04:21:51 +00:00
Brock Fanning
5eceadb33a Fix alt costs of Spark Harvest 2019-04-27 04:21:51 +00:00
swordshine
8db8715222 Merge branch 'domris-ambush-fix' into 'master'
Domri's Ambush fix to deal damage according to correct target

See merge request core-developers/forge!1584
2019-04-27 01:09:40 +00:00
Agetian
538acaf45e - Account for all players when counting PlayerCountPlayers$Whatever 2019-04-26 20:32:54 +03:00
Brock Fanning
2d38b14a4e Domri's Ambush fix to deal damage according to correct target 2019-04-25 23:44:27 -04:00
Hans Mackowiak
db7d750fde Merge branch 'smotheringtithe' into 'master'
Smothering tithe spell description correction

See merge request core-developers/forge!1583
2019-04-25 08:32:18 +00:00
swordshine
c6bbc7bd2d Merge branch 'bio_hydra' into 'master'
Bioessence Hydra: add new Trigger for counters on many game entities at once

See merge request core-developers/forge!1574
2019-04-25 01:48:30 +00:00
Hans Mackowiak
f408950aad Bioessence Hydra: add new Trigger for counters on many game entities at once 2019-04-25 01:48:29 +00:00
swordshine
f7546eca32 Merge branch 'tomik-advokist-fix' into 'master'
Limit Tomik's ability to cards originating in graveyards

See merge request core-developers/forge!1582
2019-04-25 01:47:09 +00:00
austinio7116
ac66311b94 Smothering tithe spell description correction 2019-04-24 22:11:10 +01:00
Brock Fanning
02d355fd6d Limit Tomik's ability to cards originating in graveyards 2019-04-24 17:10:08 -04:00
swordshine
7a69f89aac Merge branch 'war_planeswalker_decks' into 'master'
First step towards WAR Planeswalker decks: adding the remaining PW exclusive card scripts

See merge request core-developers/forge!1581
2019-04-24 03:56:33 +00:00
Agetian
0196ada5bc - Adding the remaining cards for Planeswalker exclusive decks [WAR]. 2019-04-24 06:37:43 +03:00
Michael Kamensky
8253dd96e7 Merge branch 'cloneRewrite' into 'master'
Clone rewrite

See merge request core-developers/forge!1294
2019-04-24 03:01:13 +00:00
swordshine
0cdf2232b7 Merge branch 'jaya-venerated-firemage-fix' into 'master'
Limit Jaya, Venerated Firemage to once-per-turn

See merge request core-developers/forge!1580
2019-04-24 00:41:25 +00:00
Brock Fanning
7269882c52 Limit Jaya to once-per-turn 2019-04-23 14:38:07 -04:00
Hanmac
b72f965725 Make LKI have Original State even in Facedown 2019-04-23 20:00:35 +02:00
Hanmac
4ab65f6471 CloneAi: use checkPhaseRestrictions for refactor later 2019-04-23 20:00:35 +02:00
Hanmac
0b1add8098 GameSimulator: fix Clone needing gameLastState 2019-04-23 20:00:35 +02:00
Hanmac
545b085cb6 CloneEffect: only cards that where on the battlefield before the clone can be cloned 2019-04-23 20:00:35 +02:00
Hanmac
f3222e4723 some fixes 2019-04-23 20:00:35 +02:00
Hanmac
e84bbaffc3 updates for clone states 2019-04-23 20:00:35 +02:00
Hanmac
97e9e6d822 more to debug GameSimTest 2019-04-23 20:00:35 +02:00
Agetian
982e919c94 - Fix a compile error. 2019-04-23 20:00:35 +02:00
Hans Mackowiak
31be2a409e Fix CardCloneStates 2019-04-23 20:00:35 +02:00
Hans Mackowiak
be298bf544 Update GameCopier: copy Cloned CardStates 2019-04-23 20:00:35 +02:00
Hans Mackowiak
4383af9691 CardCloneStates: add copy method for GameCopier 2019-04-23 20:00:35 +02:00
Hans Mackowiak
7beb8a9bf1 CardState: add extra copy method 2019-04-23 20:00:35 +02:00
Hanmac
1bd762c0f8 GameSimTest: add test for Dimir Doppelganger 2019-04-23 20:00:35 +02:00
Hans Mackowiak
8c0c78046b Remove more unused imports 2019-04-23 20:00:35 +02:00
Agetian
14c2f7aad0 - Fix the unmorph test 2019-04-23 20:00:35 +02:00
Agetian
62f55b9ba3 - Even more unused imports. 2019-04-23 20:00:35 +02:00
Agetian
014f226d48 - Remove more unused imports. 2019-04-23 20:00:35 +02:00
Agetian
c544513535 - Remove unused imports. 2019-04-23 20:00:35 +02:00
Agetian
b5c92bf423 - Added a test for Volrath's Shapeshifter. 2019-04-23 20:00:35 +02:00
Hanmac
730344f294 GameAction: Layer can add more staticAbilities if needed 2019-04-23 20:00:35 +02:00
Hanmac
92a60a65d1 GainTextOf: fix remove of TextChangeState 2019-04-23 20:00:35 +02:00
Hanmac
61a771fdd6 CopyEffect: Volraths Shapeshifter 2019-04-23 20:00:35 +02:00
Hanmac
b5d1c3ec74 PlayLandVariantEffect: update for CloneState 2019-04-23 20:00:35 +02:00
Hanmac
3b2114755c CloneEffect: UntilFacedown for Vesuvan Shapeshifter 2019-04-23 20:00:35 +02:00
Hanmac
611c40af29 CopyPermanentEffect: use CopyStates 2019-04-23 20:00:35 +02:00
Hanmac
ba8a38c2f4 CloneRewrite 2019-04-23 20:00:35 +02:00
swordshine
744a6a42e8 Merge branch 'challengerdecks' into 'master'
2019 Challenger Decks

See merge request core-developers/forge!1579
2019-04-23 08:29:19 +00:00
austinio7116
d395897ebb 2019 Challenger Decks 2019-04-23 07:41:39 +01:00
swordshine
e6a14fa5fc Merge branch 'war-achievements' into 'master'
WAR planeswalker achievements.

See merge request core-developers/forge!1578
2019-04-23 06:26:40 +00:00
Michael Kamensky
3cfe595667 WAR planeswalker achievements. 2019-04-23 06:26:40 +00:00
Sol
9979298e6d Merge branch 'master' into 'master'
Edit Forge README to include link to IntelliJ setup instructions

See merge request core-developers/forge!1577
2019-04-22 16:41:48 +00:00
John Shedletsky
373dad5472 Add IntelliJ setup instructions fix syntax 2019-04-22 09:09:42 -07:00
John Shedletsky
4c016cbbd1 Add IntelliJ setup instructions 2019-04-22 09:03:20 -07:00
swordshine
1e338ec91e Merge branch 'master' into 'master'
Moving hard-coded text to en-US.properties file

See merge request core-developers/forge!1537
2019-04-22 04:32:33 +00:00
swordshine
1352627eb9 Merge branch 'mpseditions' into 'master'
Added tokens to Mythic Editions

See merge request core-developers/forge!1576
2019-04-22 00:19:38 +00:00
austinio7116
7430ee1a69 Added tokens to Mythic Editions 2019-04-21 23:05:17 +01:00
austinio7116
13a950a263 Merge branch 'undefined' into 'master'
WAR cards

See merge request core-developers/forge!1575
2019-04-21 21:59:15 +00:00
keineahnungking
7faacc29b2 Gideon's Company 2019-04-21 19:36:43 +00:00
keineahnungking
1755bc2a1b Flux Channeler 2019-04-21 16:07:55 +00:00
swordshine
25770eb84d Merge branch 'patch' into 'master'
Fix more cards

See merge request core-developers/forge!1573
2019-04-21 12:48:26 +00:00
swordshine
d58a8069ce Fix more cards 2019-04-21 20:47:40 +08:00
swordshine
09b81ebb13 Merge branch 'wareditions2' into 'master'
Wareditions2

See merge request core-developers/forge!1571
2019-04-21 12:21:01 +00:00
austinio7116
6b309fd8bf Merge branch 'undefined' into 'master'
WAR cards

See merge request core-developers/forge!1572
2019-04-21 12:09:37 +00:00
austinio7116
19f536097e Fixed domris ambush 2019-04-21 13:07:32 +01:00
austinio7116
e331701cdc Fixed soule diviner 2019-04-21 13:05:20 +01:00
keineahnungking
6c4d81417b Eternal Taskmaster 2019-04-21 11:59:04 +00:00
keineahnungking
940ac268be Emergence Zone 2019-04-21 11:30:45 +00:00
austinio7116
211b51e516 A couple of minor WAR corrections - Amass count on herald, correct sac cost on spark reaper 2019-04-21 12:26:36 +01:00
Jonathan Lüpfert
cd30651673 Domri, Anarch of Bolas 2019-04-21 11:01:56 +00:00
Jonathan Lüpfert
9a8f6c128f Desperate Lunge 2019-04-21 09:31:40 +00:00
Jonathan Lüpfert
e95695f3c0 Aid the Fallen 2019-04-21 09:17:01 +00:00
austinio7116
ec53b55490 Initial draft rankings 2019-04-21 09:07:27 +01:00
austinio7116
a248d74a97 Initial draft rankings 2019-04-21 09:04:57 +01:00
austinio7116
bf947df65c Fix soul diviner to work with token creatures 2019-04-21 07:52:53 +01:00
swordshine
b34f6e89b5 Merge branch 'wareditions2' into 'master'
Improved WAR editions file for boosters

See merge request core-developers/forge!1566
2019-04-21 06:22:31 +00:00
swordshine
2ac5ed403b Merge branch 'patch' into 'master'
Fix Liliana, Dreadhorde General

See merge request core-developers/forge!1569
2019-04-21 06:20:42 +00:00
swordshine
2e6e031555 Fix Liliana, Dreadhorde General 2019-04-21 14:20:24 +08:00
swordshine
bc5f011540 Merge branch 'lili-ult' into 'master'
Fix liliana_dreadhorde_general ult affecting both players

See merge request core-developers/forge!1567
2019-04-21 06:13:33 +00:00
apantel
cbeff792e9 Fix liliana_dreadhorde_general ult 2019-04-21 02:05:48 -04:00
austinio7116
db5781c56a Merge branch 'undefined' into 'master'
More WAR Cards

See merge request core-developers/forge!1564
2019-04-21 05:40:57 +00:00
austinio7116
e16535e0e4 corrected nissa emblem name 2019-04-21 06:37:17 +01:00
swordshine
da874fe7e2 Merge branch 'vedalk-fix' into 'master'
Vedalken Humiliator script

Closes #945

See merge request core-developers/forge!1565
2019-04-21 05:36:15 +00:00
Adam Pantel
802d3d78cd Vedalken Humiliator script 2019-04-20 22:21:11 -04:00
Jonathan Lüpfert
70438bd6d8 Storm the Citadel 2019-04-20 20:03:16 +00:00
Jonathan Lüpfert
890b2f0da9 Prison Realm 2019-04-20 16:56:49 +00:00
Jonathan Lüpfert
9c1e36e456 Return to Nature 2019-04-20 11:11:12 +00:00
Jonathan Lüpfert
cde3f824e8 Planewide Celebration Token 2019-04-20 10:00:17 +00:00
Jonathan Lüpfert
adb4579d99 Planewide Celebration 2019-04-20 09:58:33 +00:00
Jonathan Lüpfert
bcb8d0ef12 Toll of Invasion 2019-04-20 09:57:05 +00:00
swordshine
6f1cd8f080 Merge branch 'undefined' into 'master'
More WAR cards

See merge request core-developers/forge!1562
2019-04-20 08:28:10 +00:00
Jonathan Lüpfert
830ecafe13 Update oath_of_kaya.txt 2019-04-20 07:23:32 +00:00
swordshine
03ebbc4da3 Merge branch 'wareditionsfile' into 'master'
Wareditionsfile

See merge request core-developers/forge!1563
2019-04-20 06:15:48 +00:00
austinio7116
e980af0b39 corrected nissa emblem name 2019-04-20 06:58:12 +01:00
austinio7116
48699f4f4d added extra amass tokens 2019-04-20 06:56:48 +01:00
swordshine
95c52b7bab Merge branch 'warcards2' into 'master'
Final WAR easy spoilers from Forgescribe

See merge request core-developers/forge!1560
2019-04-20 00:46:46 +00:00
Jonathan Lüpfert
708c9acee1 Tyrant's Scorn 2019-04-19 23:08:49 +00:00
austinio7116
179fcbfb0e corrected gold token 2019-04-19 23:13:04 +01:00
Jonathan Lüpfert
a808888215 Bond of Passion 2019-04-19 21:15:31 +00:00
Jonathan Lüpfert
08e456683f Oath of Kaya 2019-04-19 21:15:12 +00:00
Jonathan Lüpfert
3ab85f460e Pollenbright Druid 2019-04-19 21:14:13 +00:00
Sol
b984751a41 Merge branch 'wareditionsfile' into 'master'
Complete WAR editions card list (tokens still to complete)

See merge request core-developers/forge!1559
2019-04-19 19:41:58 +00:00
austinio7116
e3dfc23376 Final WAR easy spoilers from Forgescribe 2019-04-19 19:55:38 +01:00
austinio7116
576189410e Added tokens to edition file 2019-04-19 19:26:36 +01:00
austinio7116
330329eb97 Complete WAR editions card list (tokens still to complete) 2019-04-19 17:46:43 +01:00
swordshine
e367a962e8 Merge branch 'patch' into 'master'
Fix Gideon Blackblade

See merge request core-developers/forge!1558
2019-04-19 15:44:42 +00:00
swordshine
bced8f0ea4 Fix Gideon Blackblade 2019-04-19 23:44:17 +08:00
swordshine
983425dc7d Merge branch 'war-cards' into 'master'
Gideon, Karn's Bastion

See merge request core-developers/forge!1554
2019-04-19 15:42:58 +00:00
apantel
f72252dc2e Gideon, Karn's Bastion 2019-04-19 11:24:54 -04:00
swordshine
f2657f1d80 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1557
2019-04-19 04:50:38 +00:00
swordshine
a061282a54 Update some scripts 2019-04-19 12:49:51 +08:00
swordshine
5456bff229 Merge branch 'undefined' into 'master'
New War of the Spark Scripts

See merge request core-developers/forge!1550
2019-04-19 03:46:46 +00:00
Sol
1db3251fac Merge branch 'patch-2' into 'master'
Remove fromSheet that was causing issues

See merge request core-developers/forge!1556
2019-04-19 02:01:19 +00:00
Sol
893e900087 Remove fromSheet that was causing issues 2019-04-19 02:01:05 +00:00
swordshine
55900cdf6d Merge branch 'patch' into 'master'
Update scripts

See merge request core-developers/forge!1555
2019-04-19 01:50:52 +00:00
swordshine
e545be3514 Update scripts 2019-04-19 09:49:47 +08:00
swordshine
bebd28af4b Merge branch 'warcards2' into 'master'
Some more easy WAR spoilers

See merge request core-developers/forge!1552
2019-04-19 01:49:16 +00:00
Jonathan Lüpfert
8a7aa10419 Upload New File 2019-04-19 00:21:35 +00:00
Jonathan Lüpfert
bda5728913 Upload New File 2019-04-19 00:13:54 +00:00
Jonathan Lüpfert
1124b695d7 Upload New File 2019-04-18 19:29:42 +00:00
Jonathan Lüpfert
e4fd36c40f Upload New File 2019-04-18 19:17:05 +00:00
Jonathan Lüpfert
495eae9c23 Upload New File 2019-04-18 19:05:10 +00:00
Michael Kamensky
804b97b841 Merge branch 'master' into 'master'
Added puzzle PS_RNAS (Possibility Storm - Ravnica Allegiance Sunset Puzzle)

See merge request core-developers/forge!1553
2019-04-18 18:22:34 +00:00
Agetian
ffafa05d9b - Added puzzle PS_RNAS. 2019-04-18 21:21:54 +03:00
austinio7116
c6b59ad5f9 Some more easy WAR spoilers 2019-04-18 17:20:15 +01:00
Jonathan Lüpfert
548cecbadb Upload New File 2019-04-18 13:33:56 +00:00
Jonathan Lüpfert
9a3278913f Update tibalt_rakish_instigator.txt 2019-04-18 11:53:12 +00:00
Jonathan Lüpfert
7164ac5b25 Upload New File 2019-04-18 11:51:13 +00:00
Jonathan Lüpfert
1fb7a9f23d Upload New File 2019-04-18 11:50:45 +00:00
Jonathan Lüpfert
0ec0c64462 Update nissas_triumph.txt 2019-04-18 10:59:38 +00:00
Jonathan Lüpfert
1bbae111f7 Upload New File 2019-04-18 10:14:49 +00:00
Jonathan Lüpfert
efdf84ae5f Upload New File 2019-04-18 10:14:34 +00:00
Jonathan Lüpfert
bd482f17c4 Upload New File 2019-04-18 10:14:14 +00:00
Jonathan Lüpfert
c4da601195 Upload New File 2019-04-18 10:13:57 +00:00
swordshine
c486415a4e Merge branch 'war-cards' into 'master'
Finale cycle

See merge request core-developers/forge!1551
2019-04-18 03:58:16 +00:00
Jonathan Lüpfert
c16a72b5a6 Add new file 2019-04-18 01:40:08 +00:00
Jonathan Lüpfert
6b6b474707 Delete bond_of_insight.txt 2019-04-18 01:38:28 +00:00
Jonathan Lüpfert
810b72b1d6 Upload New File 2019-04-18 01:35:33 +00:00
adampantel
03cbabbd0a Finale cycle 2019-04-17 20:41:42 -04:00
swordshine
c990d0eb4f Merge branch 'warcards2' into 'master'
Some more WAR spoilers

See merge request core-developers/forge!1548
2019-04-18 00:39:20 +00:00
swordshine
3c6d82b2e8 Merge branch 'patch' into 'master'
Add more WAR cards

See merge request core-developers/forge!1547
2019-04-18 00:18:03 +00:00
Jonathan Lüpfert
9f4affb62c Upload New File 2019-04-17 21:13:12 +00:00
swordshine
8f48f77a0b Update some scripts 2019-04-17 23:47:08 +08:00
austinio7116
7a808c2399 Some more WAR spoilers 2019-04-17 13:43:30 +01:00
swordshine
9b6c056020 Merge branch 'wargear' into 'master'
Allow TriggeredObject in filtering (fix Grafted Wargear)

See merge request core-developers/forge!1542
2019-04-17 12:15:50 +00:00
swordshine
445c0b2c75 Update some triggers 2019-04-17 20:12:39 +08:00
swordshine
afbcdf3928 Add more cards 2019-04-17 17:52:12 +08:00
swordshine
0ba040750e Add Chandra, Fire Artisan 2019-04-17 13:39:24 +08:00
swordshine
fce9d590ad Update some incomplete cards 2019-04-17 13:05:48 +08:00
swordshine
be4e652b24 Merge branch 'patch' into 'master'
Update more scripts

See merge request core-developers/forge!1546
2019-04-17 03:50:45 +00:00
swordshine
aed9774c7a Update more scripts 2019-04-17 11:49:56 +08:00
swordshine
297f315f76 Merge branch 'patch' into 'master'
Update some scripts

See merge request core-developers/forge!1545
2019-04-17 02:36:12 +00:00
swordshine
147d6b789b Update some scripts 2019-04-17 10:35:36 +08:00
swordshine
d3ff90e154 Merge branch 'warcards2' into 'master'
More spoilers from WAR

See merge request core-developers/forge!1528
2019-04-17 02:31:03 +00:00
swordshine
aa57b522b7 Merge branch 'patch-2' into 'master'
Update might_of_old_krosa.txt

See merge request core-developers/forge!1544
2019-04-17 01:43:08 +00:00
Sol
fa1c96ce7f Merge branch 'war-cards' into 'master'
Bontu, Ilharg, Saheeli

See merge request core-developers/forge!1543
2019-04-17 01:36:56 +00:00
Sol
9b16343e8f Update might_of_old_krosa.txt 2019-04-17 01:34:42 +00:00
swordshine
884d51f339 Merge branch 'fractured' into 'master'
Fix fractured identity controller

See merge request core-developers/forge!1541
2019-04-17 00:31:36 +00:00
adampantel
c9577ec780 Bontu, Ilharg, Saheeli 2019-04-16 17:04:19 -04:00
Adam Pantel
d75ce11ae0 Fix fractured identity 2019-04-16 15:58:19 -04:00
Adam Pantel
4821e50025 Allow TriggeredObject in filtering 2019-04-16 15:57:52 -04:00
austinio7116
de4e76f741 A few simple WAR spoilers 2019-04-16 06:54:38 +01:00
Michael Kamensky
22d308812d Merge branch 'tamiyo_discard' into 'master'
Tamiyo: new logic for Discard effects

See merge request core-developers/forge!1540
2019-04-16 05:05:13 +00:00
Hans Mackowiak
b6f023c57c - DiscardAi: find the first opponent that can discard to the effect, don't try to cast on players who have Tamiyo, Collector of Tales-like effect. 2019-04-16 05:05:13 +00:00
adampantel
72f75eb797 Remove extra println 2019-04-15 13:39:07 -04:00
austinio7116
5a0b104fb3 Fixed duplicate Svar 2019-04-15 14:47:06 +01:00
Sol
3a9eaf52c6 Merge branch 'wareditionsfile' into 'master'
Partial editions file for WAR

See merge request core-developers/forge!1539
2019-04-14 22:50:14 +00:00
maustin
9afb43d25a Merge remote-tracking branch 'Austin/wareditionsfile' into wareditionsfile
# Conflicts:
#	forge-gui/res/editions/War of the Spark.txt
2019-04-14 22:35:38 +01:00
austinio7116
974ce4c724 Partial editions file for WAR 2019-04-14 22:34:46 +01:00
austinio7116
5ccbbc559a Renambed the submarine and added a few more spoilers 2019-04-14 14:58:04 +01:00
austinio7116
a7d1bd7877 A couple of WAR script correcitons 2019-04-14 14:48:20 +01:00
austinio7116
bc78cb7e01 A couple of WAR script correcitons 2019-04-14 14:45:56 +01:00
austinio7116
cbf867106d Partial editions file for WAR 2019-04-14 14:16:09 +01:00
Sol
00b5561388 Merge branch '943-illegalargumentexception-no-element-named-battlefield-graveyard-in-enum-zone' into 'master'
Resolve "IllegalArgumentException: No element named Battlefield,Graveyard in enum Zone"

Closes #943

See merge request core-developers/forge!1538
2019-04-14 12:26:28 +00:00
Hans Mackowiak
01d1eacdce Resolve "IllegalArgumentException: No element named Battlefield,Graveyard in enum Zone" 2019-04-14 12:26:28 +00:00
Sol
108a31b692 Merge branch '942-nullpointerexception' into 'master'
Resolve "NullPointerException"

Closes #942

See merge request core-developers/forge!1536
2019-04-14 12:25:51 +00:00
Hans Mackowiak
b4294d39f5 Resolve "NullPointerException" 2019-04-14 12:25:51 +00:00
churrufli
b95022740b updating res files 2019-04-14 09:51:35 +02:00
Sol
3d2173f441 Merge branch 'war-cards' into 'master'
Fix Time Wipe, add Massacre Girl.

See merge request core-developers/forge!1525
2019-04-14 01:09:26 +00:00
Adam Pantel
8827e9723c Try to fix Grip of Chaos 2019-04-13 17:11:17 -04:00
Adam Pantel
d02ad1a294 Time Wipe fix 2019-04-13 16:12:16 -04:00
Adam Pantel
7c0b11d479 Massacre Girl 2019-04-13 16:06:31 -04:00
Sol
bfae7b8951 Merge branch 'patch' into 'master'
Fix Ral, Storm Conduit (SpellCopy trigger)

See merge request core-developers/forge!1524
2019-04-13 19:56:36 +00:00
Michael Kamensky
3d22299341 Merge branch 'fix-audit-tool' into 'master'
Fix audit tool

See merge request core-developers/forge!1534
2019-04-13 04:32:31 +00:00
Sol
13583d0aba Fix audit tool 2019-04-13 04:32:31 +00:00
swordshine
f2accc9b04 Merge branch 'patch-2' into 'master'
Update Ravnica Allegiance.txt tokens

See merge request core-developers/forge!1533
2019-04-12 01:24:25 +00:00
swordshine
24c9caf703 Merge branch 'war-blockdata' into 'master'
Added basic blockdata for WAR

See merge request core-developers/forge!1532
2019-04-12 01:24:06 +00:00
Sol
dfae9158c9 Update Ravnica Allegiance.txt tokens 2019-04-12 00:54:27 +00:00
Chris H
4d5ffe5230 Added basic blockdata for WAR 2019-04-11 19:09:51 -04:00
austinio7116
317920406c More spoilers from today added. 2019-04-11 17:12:13 +01:00
Sol
c298840489 Merge branch 'testcase_fixup' into 'master'
SimulationTestCase: fix Game init with Localizer

See merge request core-developers/forge!1531
2019-04-11 11:35:22 +00:00
Hans Mackowiak
4dd411d619 SimulationTestCase: fix Game init with Localizer 2019-04-11 11:35:22 +00:00
churrufli
e644ab4649 Merge remote-tracking branch 'origin/master' 2019-04-11 08:30:42 +02:00
churrufli
5dd8619663 updating res files 2019-04-11 08:29:41 +02:00
churrufli
3c1ccfef82 updating res files 2019-04-11 08:29:41 +02:00
churrufli
8d94663f4a Update language properties 2019-04-11 08:29:41 +02:00
swordshine
08d3015ed5 Merge branch 'patch-2' into 'master'
Update transmogrifying_wand.txt

See merge request core-developers/forge!1530
2019-04-11 04:07:18 +00:00
Sol
a85017b0b7 Update transmogrifying_wand.txt 2019-04-11 03:27:35 +00:00
swordshine
97e2d627f3 Merge branch 'krenko-tokenscript' into 'master'
Fix tokenscript in new Krenko

See merge request core-developers/forge!1529
2019-04-11 00:32:54 +00:00
adampantel
1a5362ab03 Krenko tokenscript 2019-04-10 13:48:05 -04:00
austinio7116
537fad612f More spoilers from WAR 2019-04-10 17:26:47 +01:00
Michael Kamensky
c0b76016f1 Merge branch 'master' into 'master'
Added puzzle PS_WAR0 (Possibility Storm - War of the Spark Card Preview Puzzle).

See merge request core-developers/forge!1526
2019-04-10 11:02:05 +00:00
Agetian
ff45188dff - Added puzzle PS_WAR0. 2019-04-10 14:01:16 +03:00
swordshine
257ba16c5b Merge branch 'war_proliferate' into 'master'
War: Proliferate: rework effect now put each counter type on it

Closes #930

See merge request core-developers/forge!1501
2019-04-10 10:23:00 +00:00
Hans Mackowiak
2617795e37 War: Proliferate: rework effect now put each counter type on it 2019-04-10 10:23:00 +00:00
swordshine
5c95216d9d Merge branch '929-war-amass-keyword-action' into 'master'
Resolve "WAR: Amass Keyword Action"

Closes #929

See merge request core-developers/forge!1495
2019-04-10 07:46:28 +00:00
Hanmac
e2c175439f Amass: more cards 2019-04-10 08:13:22 +02:00
Hanmac
94b2dfc282 Amass: better AI logic for token create 2019-04-10 08:13:22 +02:00
Agetian
d5c8aa765f - A little bit more AmassAi logic: check if the token will survive, also check if the counters will actually be placed on the Army. 2019-04-10 08:13:22 +02:00
Agetian
9d75d13be1 - AmassAi: check if a counter will be placed on the creature if the AI controls an Army. 2019-04-10 08:13:22 +02:00
Agetian
7025098797 - Use the newer checkApiLogic call for AmassAi, also override doTriggerAINoCost (basic for now, will always return true until checkApiLogic is improved). 2019-04-10 08:13:22 +02:00
Agetian
9157fa728b - Amass AI: basic implementation, currently just accepts and selects the best Army creature in play if available. To be improved. 2019-04-10 08:13:22 +02:00
Hanmac
64f17935e5 Amass: add new Keyword Action for War of the Spark 2019-04-10 08:13:22 +02:00
swordshine
765586b8b0 Fix Ral, Storm Conduit (SpellCopy trigger) 2019-04-10 10:32:30 +08:00
swordshine
d2143e2f2a Merge branch 'patch' into 'master'
Update scripts

See merge request core-developers/forge!1523
2019-04-10 01:09:03 +00:00
swordshine
a969d9d615 Update scripts 2019-04-10 09:08:00 +08:00
swordshine
2041b9da1a Merge branch 'master' into 'master'
Moving hard-coded text to en-US.properties file

See merge request core-developers/forge!1506
2019-04-10 01:01:58 +00:00
swordshine
1d6beb1085 Merge branch 'warcards2' into 'master'
Today's easy WAR spoilers, plus a couple of corrections from discord

See merge request core-developers/forge!1521
2019-04-10 01:00:49 +00:00
swordshine
16a662ab30 Merge branch 'patch-2' into 'master'
Fix Daxos' wb_x_x_e_spirit_experience.txt token

See merge request core-developers/forge!1522
2019-04-10 00:57:47 +00:00
Sol
d0c39e7b14 Fix Daxos' wb_x_x_e_spirit_experience.txt token 2019-04-10 00:14:17 +00:00
churrufli
fdf3d3588e updating res files 2019-04-10 00:44:52 +02:00
churrufli
da4f1ade9d Merge remote-tracking branch 'origin/master' 2019-04-10 00:21:04 +02:00
austinio7116
07e327828d Fixed various issues from MR comments
Added wizard tokenscript
2019-04-09 17:09:56 +01:00
Churrufli
2db2ba5375 Update en-US.properties 2019-04-09 12:34:32 +00:00
churrufli
b4448b9384 updating res files 2019-04-09 14:33:23 +02:00
churrufli
cc19b2b39e Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-04-09 14:21:03 +02:00
austinio7116
abea68241e Today's easy WAR spoilers, plus a couple of corrections from discord
(cherry picked from commit 0bc43de)
2019-04-09 06:58:36 +01:00
swordshine
64eacd07a1 Merge branch 'fix-counterbalance-crash' into 'master'
Fix counterbalance crashing on an empty library

See merge request core-developers/forge!1520
2019-04-09 02:30:43 +00:00
Chris H
e0101ebb7b Fix counterbalance crashing on an empty library 2019-04-08 20:58:47 -04:00
swordshine
cdc032b39f Merge branch 'guild-kits-2' into 'master'
GK2 decks

See merge request core-developers/forge!1518
2019-04-09 00:48:53 +00:00
swordshine
e48858b4ce Merge branch 'warcards' into 'master'
Warcards

See merge request core-developers/forge!1512
2019-04-09 00:46:44 +00:00
Michael Kamensky
ed7611a332 Merge branch 'master' into 'master'
Preparing Forge for Android publish v1.6.23.001 [incremental].

See merge request core-developers/forge!1519
2019-04-08 18:21:27 +00:00
Agetian
b97e6fa3e4 - Preparing Forge for Android publish v1.6.23.001 [incremental]. 2019-04-08 21:20:47 +03:00
austinio7116
aa677ca306 Corrected Tomik based on Swordshine's comments 2019-04-08 16:57:20 +01:00
Blacksmith
33fe26a892 Clear out release files in preparation for next release 2019-04-07 19:53:43 +00:00
Blacksmith
405cbd5ab3 [maven-release-plugin] prepare for next development iteration 2019-04-07 19:48:55 +00:00
Blacksmith
5b39be5fe9 [maven-release-plugin] prepare release forge-1.6.23 2019-04-07 19:48:50 +00:00
Blacksmith
f6b38bf9ee Update README.txt for release 2019-04-07 19:46:31 +00:00
Rob Schnautz
9812bbb0da Add 2nd batch of guild kits to quest shop. 2019-04-07 17:53:18 +00:00
swordshine
af7cb0ae30 Merge branch 'fix-card-auditer' into 'master'
Add variants for Card Auditer

See merge request core-developers/forge!1516
2019-04-07 03:51:01 +00:00
Chris H
38b183b795 Add variants for Card Auditer 2019-04-06 23:26:20 -04:00
Sol
06afb22fd7 Merge branch 'patch-2' into 'master'
Update ANNOUNCEMENTS.txt

See merge request core-developers/forge!1515
2019-04-07 03:10:04 +00:00
Sol
04cd2e8c45 Update ANNOUNCEMENTS.txt 2019-04-07 03:09:52 +00:00
Sol
6cf73e2a5d Merge branch 'patch' into 'master'
Update Typelists

See merge request core-developers/forge!1514
2019-04-07 02:13:37 +00:00
Sol
28ee9eb58d Merge branch 'Nigol-master-patch-38850' into 'master'
g_2_2_monkey PT should be 2/2 not 1/1

See merge request core-developers/forge!1513
2019-04-07 02:13:14 +00:00
churrufli
ada8d59b2c Update language properties 2019-04-06 22:53:38 +02:00
Marc-André
6a755db00d g_2_2_monkey PT should be 2/2 not 1/1 2019-04-06 07:35:01 +00:00
swordshine
2bd008328a Update Typelists 2019-04-06 15:33:39 +08:00
austinio7116
347266382f Removed incompleted Vivien 2019-04-06 06:58:32 +01:00
austinio7116
d087fac128 More WAR forgeScribed spoilers 2019-04-06 06:56:55 +01:00
Michael Kamensky
9feb583413 Merge branch 'sealed-mode-singleton-round-limits' into 'master'
Build up to 7 extra sealed pools, based on numbers

See merge request core-developers/forge!1509
2019-04-06 03:37:24 +00:00
Sol
6ee9f14e59 Merge branch 'Nigol-master-patch-52687' into 'master'
Update forge-gui/res/tokenscripts/r_0_1_elemental_rekindling_phoenix.txt

Closes #935

See merge request core-developers/forge!1511
2019-04-06 02:51:00 +00:00
Marc-André
2cf8ea8ae9 Update forge-gui/res/tokenscripts/r_0_1_elemental_rekindling_phoenix.txt 2019-04-06 01:14:17 +00:00
swordshine
687972782a Merge branch 'warcards' into 'master'
First batch of forgescribed WAR spoilers

See merge request core-developers/forge!1503
2019-04-05 03:46:18 +00:00
swordshine
c67ea9cb2b Merge branch 'patch-1' into 'master'
Patch 1

Closes #931

See merge request core-developers/forge!1510
2019-04-05 03:45:15 +00:00
Sol
1fec85b164 Update Duels of the Planeswalkers.txt 2019-04-05 03:05:33 +00:00
Sol
1bc3f9fc0e Update Ravnica_Allegiance_Guild_Kit.txt 2019-04-05 03:02:37 +00:00
Sol
743711634e Merge branch 'Nigol-master-patch-08546' into 'master'
Fixed Card not updating in the stack on mouseover when targeting arcs isn't on Mouseover

Closes #932

See merge request core-developers/forge!1508
2019-04-05 02:59:27 +00:00
Sol
5e28d2c975 Merge branch 'patch-1' into 'master'
Update Duel Decks Anthology Garruk vs. Liliana.txt

Closes #933

See merge request core-developers/forge!1507
2019-04-05 02:58:46 +00:00
Marc-André
9c578fb57c Fixed Card not updating in the stack on mouseover when targeting arcs isn't on Mouseover 2019-04-05 02:48:44 +00:00
Chris H
e7fbe25af2 Build up to 7 extra sealed pools, based on numbers 2019-04-04 22:48:13 -04:00
Sol
a52b39f8d3 Update Duel Decks Anthology Garruk vs. Liliana.txt 2019-04-05 00:49:43 +00:00
austinio7116
07093df56d Fixed issues raised in MR discussions 2019-04-04 22:59:46 +01:00
swordshine
49931297ac Merge branch 'finalrnadeckgen' into 'master'
Final RNA deckgen data

See merge request core-developers/forge!1502
2019-04-04 07:45:42 +00:00
austinio7116
15f3034ac0 First batch of forgescribed WAR spoilers 2019-04-04 08:03:40 +01:00
austinio7116
d36651a779 Final RNA deckgen data
(cherry picked from commit f526f96)
2019-04-04 07:21:18 +01:00
Michael Kamensky
245a95b336 Merge branch 'master' into 'master'
PS_RNAR: Added some cards to the human library.

See merge request core-developers/forge!1500
2019-04-04 05:01:51 +00:00
Agetian
22e2a42807 - PS_RNAR: Added some cards to the human library. 2019-04-04 08:01:13 +03:00
Michael Kamensky
1c1d91c149 Merge branch 'master' into 'master'
Added puzzle PS_RNAR (Possibility Storm - Ravnica Allegiance Preview Card Puzzle Revisited)

See merge request core-developers/forge!1499
2019-04-04 04:52:31 +00:00
Agetian
a8a2d7bbeb - Added puzzle PS_RNAR (Possibility Storm - Ravnica Allegiance Preview Card Puzzle Revisited) 2019-04-04 07:51:57 +03:00
Michael Kamensky
02064e05df Merge branch 'patch' into 'master'
Fixed All Hallow's Eve

See merge request core-developers/forge!1497
2019-04-04 03:57:49 +00:00
Michael Kamensky
c00add6050 Merge branch 'clear-image-cache' into 'master'
Token Viewer 1.0 + Clear Image Cache button

Closes #876

See merge request core-developers/forge!1496
2019-04-04 03:57:39 +00:00
Sol
04dfdac71c Merge branch 'patch-1' into 'master'
Update infernal_reckoning.txt

See merge request core-developers/forge!1498
2019-04-04 02:35:01 +00:00
Sol
8d4566af3e Update infernal_reckoning.txt 2019-04-04 01:56:37 +00:00
swordshine
3cc3ef0b13 Fixed All Hallow's Eve 2019-04-02 16:03:59 +08:00
Chris H
f5a4360339 TokenViewer doesn't crash now.. Just need it to display 2019-03-31 22:48:57 -04:00
Michael Kamensky
cb8ad8221e Merge branch 'master' into 'master'
Support for three color lands' sounds

See merge request core-developers/forge!1494
2019-03-31 05:25:19 +00:00
Chris H
a050f7c26c TokenViewer Deck "editor" 2019-03-30 22:09:16 -04:00
Alessandro Coli
0a709a6cf4 Support for three color lands 2019-03-30 15:59:44 +01:00
Alessandro Coli
a9124743ef Support for three color lands 2019-03-30 15:58:49 +01:00
Sol
42f6cdbb46 Merge branch 'patch-1' into 'master'
Fix elf knight token name

See merge request core-developers/forge!1493
2019-03-30 01:14:35 +00:00
Sol
17e7883996 Fix elf knight token name 2019-03-30 01:13:14 +00:00
Michael Kamensky
91a8d1761a Merge branch 'fix-spellskite' into 'master'
Spellskite should grab its magnet target from DefinedMagnet (fixes Spellskite not working)

Closes #925

See merge request core-developers/forge!1492
2019-03-28 16:41:32 +00:00
Agetian
9c39d159e9 - Spellskite should grab its magnet target from DefinedMagnet. 2019-03-28 17:34:53 +03:00
Michael Kamensky
59abbfd51f Merge branch 'patch-1' into 'master'
Update assemble_the_rank_and_vile.txt

Closes #917

See merge request core-developers/forge!1491
2019-03-28 11:28:33 +00:00
Hans Mackowiak
953de7d6f1 Update assemble_the_rank_and_vile.txt 2019-03-28 11:28:33 +00:00
Rob Schnautz
51e9e2b692 Merge branch 'patch-1' into 'master'
Update token-images.txt

See merge request core-developers/forge!1490
2019-03-27 13:24:54 +00:00
Hans Mackowiak
9447561d53 Update token-images.txt 2019-03-27 13:24:54 +00:00
Michael Kamensky
928f903028 Merge branch 'master' into 'master'
Added puzzle PS_RNA9 (Possibility Storm - Ravnica Allegiance 09).

See merge request core-developers/forge!1489
2019-03-27 06:12:42 +00:00
Agetian
bc4826ed77 - Added puzzle PS_RNA9. 2019-03-27 09:11:49 +03:00
Michael Kamensky
88a674240d Merge branch 'tokenscripts' into 'master'
resolve #926

Closes #926

See merge request core-developers/forge!1488
2019-03-27 04:02:20 +00:00
Michael Kamensky
1d4b9d68ed Merge branch 'deck-descriptions' into 'master'
Deck descriptions

See merge request core-developers/forge!1487
2019-03-27 04:02:08 +00:00
Adam Pantel
c1dfbc04e4 Fix missing type in tokenscripts 2019-03-26 19:22:27 -04:00
Rob Schnautz
fa80df585f Merge branch 'master' into 'deck-descriptions' 2019-03-26 15:33:03 +00:00
Rob Schnautz
2cfbf8df30 back matter 2019-03-26 15:25:45 +00:00
Rob Schnautz
ad6e9acbe1 back matter 2019-03-25 21:44:42 +00:00
Rob Schnautz
3f450e813d back matter 2019-03-25 19:51:29 +00:00
Rob Schnautz
9c62a0e2ab back matter 2019-03-25 19:37:08 +00:00
Rob Schnautz
5dc883e932 back matter 2019-03-25 18:52:34 +00:00
Rob Schnautz
94ab23f09f back matter 2019-03-25 18:46:25 +00:00
Rob Schnautz
286e5721f7 back matter 2019-03-25 18:35:24 +00:00
Rob Schnautz
eb5899ac15 back matter 2019-03-25 18:24:47 +00:00
Rob Schnautz
a1fca42b57 back matter 2019-03-25 17:53:53 +00:00
Rob Schnautz
16314d5ebc Merge branch 'MED-patch' into 'master'
Mythic Edition patch

See merge request core-developers/forge!1485
2019-03-25 16:53:08 +00:00
Rob Schnautz
d5fe891440 Fix MCI code and card numbers (MPS points to Kaladesh Inventions) 2019-03-25 16:50:28 +00:00
Rob Schnautz
13d99e209b Fix MCI code (MPS points to Kaladesh Inventions) 2019-03-25 16:48:26 +00:00
Rob Schnautz
9946155c71 Merge branch 'cherry-pick-ff7def5f' into 'master'
Amonkhet Invocations patch

See merge request core-developers/forge!1484
2019-03-25 16:43:49 +00:00
Rob Schnautz
6a6ca3f403 Fix MCI code (MPS points to Kaladesh Inventions)
(cherry picked from commit ff7def5f5afd7a07991caf2549f5fb92f9a85186)
2019-03-25 16:42:43 +00:00
Michael Kamensky
1c0d95b930 Merge branch 'draft-bugs' into 'master'
Resolve #921, #922

Closes #921 and #922

See merge request core-developers/forge!1478
2019-03-25 03:53:44 +00:00
Michael Kamensky
271b940723 Merge branch 'quest-pets-redux' into 'master'
Always create an empty map for tokenNormalized

See merge request core-developers/forge!1483
2019-03-25 03:52:52 +00:00
Michael Kamensky
8eecccff0b Merge branch 'aura-corner-case' into 'master'
resolve #923

Closes #923

See merge request core-developers/forge!1479
2019-03-25 03:52:43 +00:00
Adam Pantel
18f32a1657 Fix draft duplicates bug 2019-03-24 21:32:48 -04:00
Adam Pantel
5cd5020595 Fix draft bots running conspiracies 2019-03-24 21:32:14 -04:00
Chris H
5aee626661 Always create an empty map for tokenNormalized 2019-03-24 21:00:31 -04:00
Rob Schnautz
f2dae53c11 back matter, premium cards 2019-03-24 19:53:36 +00:00
Rob Schnautz
da93a734fb back matter, premium cards 2019-03-24 19:31:12 +00:00
Rob Schnautz
25042c9814 Back matter, premium cards 2019-03-24 18:20:02 +00:00
Rob Schnautz
a239dbfc01 More deck descriptions. 2019-03-24 17:24:53 +00:00
Rob Schnautz
1b1502af0d Merge branch 'master' into 'deck-descriptions'
Update from master

See merge request core-developers/forge!1482
2019-03-24 17:04:55 +00:00
Rob Schnautz
6ca034eab9 React to removal of Spike Weaver by using the effect if it's already planning to do later
Don't leave blockers if planning to use fog effect, except the card that will do so. (might need to tap to use it, or might get killed if attacking)
2019-03-24 17:04:53 +00:00
Hans Mackowiak
99456c7bbb Merge branch 'patch-2' into 'master'
Fix download URL for Afterlife spirit token images.

See merge request core-developers/forge!1481
2019-03-24 16:57:08 +00:00
Rob Schnautz
c0d87aecaa author @Hanmac Fix download URL for Afterlife spirit token images. 2019-03-24 16:53:42 +00:00
Michael Kamensky
1d691a5342 Merge branch 'patch-1' into 'master'
Quest pet tokens don't have editions.

See merge request core-developers/forge!1480
2019-03-24 04:07:21 +00:00
Sol
de719b9aa5 There's no such thing as "file1_set" its either "file_set" or "file2_set" 2019-03-24 01:43:16 +00:00
Sol
190a56181e Quest pet tokens don't have editions. 2019-03-24 00:55:24 +00:00
Adam Pantel
ae772e99a7 Enchant fix 2019-03-23 14:35:00 -04:00
Michael Kamensky
e13ddd9666 Merge branch 'master' into 'master'
Added puzzle PS_RNA8 (Possibility Storm - Ravnica Allegiance 08)

See merge request core-developers/forge!1476
2019-03-23 09:52:39 +00:00
Agetian
7890420fb0 - Added puzzle PS_RNA8. 2019-03-23 12:51:38 +03:00
Sol
8d056be356 Merge branch 'patch-1' into 'master'
Set default art index to 1 for tokens

See merge request core-developers/forge!1475
2019-03-22 15:00:21 +00:00
Sol
b594cf2324 Set default art index to 1 for tokens 2019-03-22 15:00:21 +00:00
Michael Kamensky
f048b04c2b Merge branch 'patch-1' into 'master'
Update beckon_apparition.txt

See merge request core-developers/forge!1474
2019-03-22 04:27:50 +00:00
Michael Kamensky
fd1e8c1e7e Merge branch 'token-multiple-art' into 'master'
Allow multiple art for tokens based on edition files

See merge request core-developers/forge!1473
2019-03-22 04:27:45 +00:00
Sol
af0d4b0c48 Update beckon_apparition.txt 2019-03-22 03:08:29 +00:00
Chris H
dc917643b5 Allow multiple art for tokens based on edition files 2019-03-21 20:58:46 -04:00
Sol
6f90d27f38 Merge branch '916-more-tokenscript-problems' into 'master'
Resolve "More tokenscript problems"

Closes #916

See merge request core-developers/forge!1472
2019-03-21 02:50:14 +00:00
Hanmac
80851d515a TokenScript: more fixes 2019-03-20 21:17:32 +01:00
Michael Kamensky
6dfca97bbb Merge branch '915-missing-tokenscript-r_1_1_elemental' into 'master'
Resolve "Missing tokenscript: r_1_1_elemental"

Closes #915

See merge request core-developers/forge!1471
2019-03-20 13:54:06 +00:00
Hans Mackowiak
2a10750fdb Add new file 2019-03-20 13:38:43 +00:00
Michael Kamensky
a1976653f8 Merge branch 'master' into 'master'
Replace RemRandomDeck with the new format.

See merge request core-developers/forge!1470
2019-03-20 12:20:50 +00:00
Agetian
3e2fa43abe - Replace RemRandomDeck with the new format. 2019-03-20 15:20:14 +03:00
Michael Kamensky
e3ae076ab7 Merge branch 'master' into 'master'
Fix Saheeli crashing the AI.

See merge request core-developers/forge!1469
2019-03-20 12:15:24 +00:00
Agetian
64e09020bd - Fix Saheeli crashing the AI. 2019-03-20 15:14:36 +03:00
Sol
cd033aa896 Merge branch '908-mindbreak-trap-exiles-itself' into 'master'
Resolve "Mindbreak Trap Exiles itself"

Closes #908

See merge request core-developers/forge!1467
2019-03-20 12:02:21 +00:00
Hans Mackowiak
0e2222f97c Merge branch 'patch-1' into 'master'
Update gold.txt

Closes #913

See merge request core-developers/forge!1468
2019-03-20 05:33:53 +00:00
Sol
7629144be1 Update gold.txt 2019-03-20 01:11:02 +00:00
Hanmac
dece031e13 SpellAbilityEffect: fix getCards when only spell is targeted 2019-03-19 08:23:09 +01:00
swordshine
611813c141 Merge branch 'patch-2' into 'master'
Update monastery_mentor.txt

Closes #912

See merge request core-developers/forge!1466
2019-03-19 03:58:57 +00:00
Sol
fdc9aea650 Update monastery_mentor.txt 2019-03-19 02:41:39 +00:00
Sol
ccba38d944 Merge branch 'master' into 'master'
Fix to have "old edition images" of the "Elves vs Goblins" duel deck searched in the right folder "DD1" and not "EVG" (which is for the Anthology edition version of the same duel deck)

See merge request core-developers/forge!1465
2019-03-18 12:44:27 +00:00
Sol
def94171af Merge branch 'token_missing' into 'master'
Token: add missing TokenScript

See merge request core-developers/forge!1464
2019-03-17 23:08:12 +00:00
Hans Mackowiak
33e172ec37 Token: add missing TokenScript 2019-03-17 23:08:12 +00:00
Alessandro Coli
4f20cc638d Fix to have "old edition images" of this duel deck searched in the
folder "DD1", differently from the "anthology edition images" which are
searched into folder "EVG".

Without this fix, both image sets are searched into the same folder
"EVG".
2019-03-17 12:07:01 +01:00
Hans Mackowiak
93873d9984 Merge branch 'patch-2' into 'master'
Update c_1_1_eldrazi_scion_sac.txt

See merge request core-developers/forge!1463
2019-03-16 19:06:23 +00:00
Sol
e99e389221 Update c_1_1_eldrazi_scion_sac.txt 2019-03-16 18:29:33 +00:00
Sol
cc1f9763a7 Merge branch 'tokenscript_pt' into 'master'
TokenInfo: add TokenPower & TokenToughness into token script

See merge request core-developers/forge!1462
2019-03-16 18:26:47 +00:00
Hans Mackowiak
255a07fa2e TokenInfo: add TokenPower & TokenToughness into token script 2019-03-16 18:26:47 +00:00
Sol
b23b12ba66 Merge branch 'token-work' into 'master'
Token work

See merge request core-developers/forge!1263
2019-03-16 13:52:26 +00:00
Michael Kamensky
7ff9329b56 Merge branch 'master' into 'master'
Land sounds whenever they enter the battlefield - not only if they are played by hand

See merge request core-developers/forge!1459
2019-03-16 11:35:06 +00:00
Michael Kamensky
76e0d3d62f Merge branch 'patch-2' into 'master'
Update mesmerizing_benthid.txt

See merge request core-developers/forge!1461
2019-03-16 11:25:30 +00:00
Hans Mackowiak
888ad500a0 Update mesmerizing_benthid.txt 2019-03-16 11:25:30 +00:00
Michael Kamensky
4f11fdc54f Merge branch 'limit-tap-own-turn-ai' into 'master'
Be more conservative when AI uses Tap Effects

See merge request core-developers/forge!1460
2019-03-16 05:30:28 +00:00
Chris H
6e9c35a978 Be more conservative when AI uses Tap Effects 2019-03-15 23:29:30 -04:00
Alessandro Coli
f4b31082b8 Land sounds when land cards enter battlefield - even if they are not
played by hand
2019-03-15 20:34:22 +01:00
Alessandro Coli
9be9abbdae Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-03-15 20:18:45 +01:00
swordshine
3b059f9879 Merge branch 'patch-2' into 'master'
Some Card patches

See merge request core-developers/forge!1458
2019-03-15 11:28:53 +00:00
Hans Mackowiak
1ac44351c6 Some Card patches 2019-03-15 11:28:53 +00:00
Michael Kamensky
a7cc01ba65 Merge branch 'fix-lifeloseai' into 'master'
Fix LifeLoseAI not targeting for subabilities like Revenge.

Closes #906

See merge request core-developers/forge!1457
2019-03-15 04:15:25 +00:00
Agetian
bc75331809 - sa.isMandatory(): always false for subabilities, no reason to check. 2019-03-14 18:32:25 +03:00
Agetian
1ebde0d976 - Fix LifeLoseAI not targeting for subabilities like Revenge. 2019-03-14 16:56:23 +03:00
Alessandro Coli
99a6ad7288 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-03-13 20:29:50 +01:00
Hanmac
56c1a0e6d1 CardFactoryUtil: TokenScript for Fabricate and Living Weapon 2019-03-13 20:04:42 +01:00
schnautzr
341e80361d Finish token scripting for existing sets 2019-03-13 20:04:42 +01:00
schnautzr
d4206445c6 Add Duel Decks Anthologies, remove YMC from MTGO format. 2019-03-13 20:02:46 +01:00
schnautzr
508ea4d3d5 Convert cards to use new tokenscript format, minor fixes 2019-03-13 20:02:46 +01:00
Rob Schnautz
751900b376 Relocate two files that were misplaced 2019-03-13 08:25:26 +01:00
schnautzr
c43542cbe4 Finalize STH 2019-03-13 08:25:26 +01:00
schnautzr
7a68cc871f Finalize TMP 2019-03-13 08:24:33 +01:00
schnautzr
53443855b1 Finalize WTH 2019-03-13 08:24:33 +01:00
schnautzr
1faea98708 Finalize VAN series 1 2019-03-13 08:24:33 +01:00
schnautzr
13057386c9 Finalize VIS 2019-03-13 08:24:33 +01:00
schnautzr
b914422546 Finalize MIR 2019-03-13 08:24:33 +01:00
schnautzr
4240953950 Finalize ALL (alliances) 2019-03-13 08:24:33 +01:00
schnautzr
a306611853 Finalize HML 2019-03-13 08:24:33 +01:00
schnautzr
40acdd7f2d Finalize ICE 2019-03-13 08:23:57 +01:00
schnautzr
4c90e4c5fa Finalize FEM 2019-03-13 08:23:56 +01:00
schnautzr
8c096d6cd1 Finalize LEG. 2019-03-13 08:21:34 +01:00
schnautzr
31e9eeca05 Finalize ATQ 2019-03-13 08:17:57 +01:00
schnautzr
7afa975cd9 Finalize LEA and ARN tokens. 2019-03-13 08:15:15 +01:00
Rob Schnautz
09d5050766 Second pass. Fix errors, add alt art prints. 2019-03-13 08:06:11 +01:00
Rob Schnautz
54b866c58e guilds of ravnica tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
3d6ac9f432 magic 2019 tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
f0320bd567 dominaria tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
801a999986 rivals of ixalan tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
178e4a771b ixalan tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
1cf8ccb843 amonkhet block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
007df1986d kaladesh block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
ad50390e38 innistrad part 2 block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
317634d0e7 zendikar part 2 block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
fb356f88bc tarkir block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
60275823fc theros block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
f52d525b18 ravnica part 2 block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
d10ce0b827 return to ravnica tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
3a6b925afd innistrad block tokens 2019-03-13 08:06:11 +01:00
Rob Schnautz
6f65baab38 mirrodin part two block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
7d294280a9 zendikar block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
d57100c888 alara block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
9d5d19f5c3 shards of alara tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
b6fe691a75 lorwyn block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
39b534ce2b time spiral block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
15b95ffc79 ravnica block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
c86307d44e kamigawa block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
4567c287d5 mirrodin block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
15032d7372 onslaught block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
7af24d52fd odyssey block tokens 2019-03-13 08:06:10 +01:00
Rob Schnautz
fac6e7b689 invasion block tokens 2019-03-13 08:06:09 +01:00
Rob Schnautz
ea33430706 masques block tokens 2019-03-13 08:06:09 +01:00
Rob Schnautz
5a5c7f96cb Urza's block tokens 2019-03-13 08:06:09 +01:00
Rob Schnautz
cbe8407b28 Tempest block tokens 2019-03-13 08:06:09 +01:00
Rob Schnautz
724f1ce10a Mirage block tokens 2019-03-13 08:06:09 +01:00
Rob Schnautz
e1ccedf881 pre-mirage tokens in edition files 2019-03-13 08:06:09 +01:00
Hans Mackowiak
cb7af23c13 Update khalni_garden.txt 2019-03-13 08:04:04 +01:00
Hans Mackowiak
e2c4c52bd7 Update kuldotha_rebirth.txt 2019-03-13 08:04:04 +01:00
Hans Mackowiak
305d7b69aa Update survey_the_wreckage.txt 2019-03-13 08:04:04 +01:00
schnautzr
bb10e6e604 delete duplicate scripts with wrong names 2019-03-13 08:04:04 +01:00
schnautzr
6ca9bd2926 Fix Ragavan 2019-03-13 08:04:04 +01:00
Rob Schnautz
29102dcab3 rest of urza's tokens 2019-03-13 07:43:58 +01:00
Rob Schnautz
73f8fa1ac8 urza's saga tokens 2019-03-13 07:43:58 +01:00
Rob Schnautz
3f75adcfae exodus tokens 2019-03-13 07:42:32 +01:00
Rob Schnautz
1707e34860 stronghold tokens 2019-03-13 07:41:37 +01:00
Rob Schnautz
a43019fcee tempest tokens 2019-03-13 07:38:44 +01:00
Rob Schnautz
812a5c873f weatherlight tokens 2019-03-13 07:37:43 +01:00
Rob Schnautz
73a4aa7461 visions tokens 2019-03-13 07:37:42 +01:00
Rob Schnautz
6a1dc16b52 mirage tokens 2019-03-13 07:36:59 +01:00
Rob Schnautz
409499d9d9 alliances tokens 2019-03-13 07:35:20 +01:00
Rob Schnautz
947ebb0f0b fallen empires tokens 2019-03-13 07:34:01 +01:00
Rob Schnautz
7baab5786b ice age tokens 2019-03-13 07:31:59 +01:00
Rob Schnautz
1dfd9ac340 fallen empires tokens 2019-03-13 07:31:58 +01:00
Rob Schnautz
c4fad2f2fa serpent generator 2019-03-13 07:30:44 +01:00
Rob Schnautz
ddcf0283a9 Legends tokens 2019-03-13 07:30:44 +01:00
Rob Schnautz
c0c2317adb tetravite 2019-03-13 07:30:43 +01:00
Rob Schnautz
f87107751f add Djinn token for Bottle of Suleiman 2019-03-13 07:29:56 +01:00
Rob Schnautz
a22fd58fbc token for Rukh Egg 2019-03-13 07:29:56 +01:00
Rob Schnautz
85b904ca65 add goblin and wasp to all editions that create em 2019-03-13 07:29:56 +01:00
Rob Schnautz
3258d9a5fa wasp: the original token 2019-03-13 07:29:56 +01:00
Rob Schnautz
846a30454d g_0_1_plant 2019-03-13 07:29:56 +01:00
Rob Schnautz
fbda01ef43 all the r_1_1_goblins 2019-03-13 07:28:19 +01:00
Michael Kamensky
586e502780 Merge branch 'master' into 'master'
Added puzzle PS_RNA7 (Possibility Storm - Ravnica Allegiance  07).

See merge request core-developers/forge!1456
2019-03-12 06:10:40 +00:00
Agetian
688f8599be - Added puzzle PS_RNA7. 2019-03-12 09:09:48 +03:00
Agetian
c161cdcf51 - Fix the name of MPS_RNA edition. 2019-03-12 09:00:01 +03:00
Michael Kamensky
2937041c63 Merge branch 'card-and-image-audit-menu' into 'master'
Card and image audit menu

See merge request core-developers/forge!1451
2019-03-12 05:51:21 +00:00
Tim Scott
eafa4418d6 Reduce the size of the font for the audit report.
Change up the scroll window to allow for horizontal movement.

Add code/code2 info for easier reference.
2019-03-10 15:39:10 -05:00
Michael Kamensky
2ff19e05a1 Merge branch 'master' into 'master'
Forge for Android v1.6.22.001

See merge request core-developers/forge!1455
2019-03-10 15:31:57 +00:00
Agetian
e23acfb5de - Preparing Forge for Android publish 1.6.22.001 [incremental]. 2019-03-10 18:29:36 +03:00
Agetian
255c30ce9c Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-03-10 17:54:00 +03:00
Blacksmith
49ba10d97b Clear out release files in preparation for next release 2019-03-10 14:02:21 +00:00
Blacksmith
c3346c737e [maven-release-plugin] prepare for next development iteration 2019-03-10 13:57:44 +00:00
Blacksmith
db3c4d2d2f [maven-release-plugin] prepare release forge-1.6.22 2019-03-10 13:57:39 +00:00
Blacksmith
c0c38dbef9 Update README.txt for release 2019-03-10 13:55:41 +00:00
Sol
5fb20c7eb9 Merge branch 'patch-3' into 'master'
Patch 3

See merge request core-developers/forge!1454
2019-03-10 13:54:14 +00:00
Sol
1791d96a78 Merge branch 'patch-2' into 'master'
Update dovin_architect_of_law.txt

See merge request core-developers/forge!1453
2019-03-10 13:54:01 +00:00
Tim Scott
89df7694d9 Correct copy to clipboard action. 2019-03-10 08:51:51 -05:00
Sol
c2690a80e2 Update ANNOUNCEMENTS.txt 2019-03-10 13:51:43 +00:00
Sol
b50779177e Update CHANGES.txt 2019-03-10 13:49:00 +00:00
Sol
b5fb772893 Update dovin_architect_of_law.txt 2019-03-10 13:35:05 +00:00
Michael Kamensky
341d882a93 Merge branch 'patch-1' into 'master'
Update domri_city_smasher.txt

See merge request core-developers/forge!1452
2019-03-10 08:36:40 +00:00
Sol
1ea8519be8 Update domri_city_smasher.txt 2019-03-10 04:06:42 +00:00
Tim Scott
02abe851c0 Organize images not found and cards not implemented into two separate lists for easier reference.
Add label to dialog after audit operation for easier reference.
2019-03-09 12:41:17 -06:00
Agetian
c73ed59a52 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-03-09 17:36:32 +03:00
Michael Kamensky
10b68ae716 Merge branch '897-mayplay-allows-facedown-land-even-it-shoudn-t' into 'master'
Resolve "MayPlay allows Facedown Land even it shoudn't"

Closes #897

See merge request core-developers/forge!1450
2019-03-09 14:36:01 +00:00
Agetian
e99a507744 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-03-09 16:50:21 +03:00
Hanmac
393207c9d8 Card: fixed LandAbility + FaceDown + MayPlay 2019-03-09 13:59:21 +01:00
Alessandro Coli
facb85f74f Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-03-09 13:34:44 +01:00
Michael Kamensky
c0103815be Merge branch 'clash-log-post-action' into 'master'
Log after clashing so players know what happened to top of library

See merge request core-developers/forge!1449
2019-03-09 03:53:17 +00:00
tehdiplomat
f7d40687b6 Log after clashing so players know what happened to top of library 2019-03-08 10:11:15 -05:00
Michael Kamensky
a24a844078 Merge branch 'master' into 'master'
Fix the AI not considering Adapt P/T bonus correctly on attack

Closes #892

See merge request core-developers/forge!1448
2019-03-08 09:52:13 +00:00
Michael Kamensky
a820ba35f7 Fix the AI not considering Adapt P/T bonus correctly on attack 2019-03-08 09:52:13 +00:00
Agetian
e4bd18e25c - Additional fix for the other stat. 2019-03-08 12:50:15 +03:00
Agetian
efd9b6a0fc - Fix a bug with the AI not considering Adapt correctly during attack. 2019-03-08 12:49:06 +03:00
Sol
baa4f8cd74 Merge branch '894-dies-leaves-triggers-don-t-work-on-copied-permanents' into 'master'
Resolve "Dies/Leaves triggers don't work on copied permanents"

Closes #894

See merge request core-developers/forge!1447
2019-03-08 02:32:58 +00:00
Hanmac
9067d676eb GameAction: register from LKI to fix leave the battlefield 2019-03-07 20:34:32 +01:00
Michael Kamensky
4b6cf610a7 Merge branch 'master' into 'master'
Added puzzle PS_RNA6 (Possibility Storm - Ravnica Allegiance 06)

See merge request core-developers/forge!1446
2019-03-06 17:58:41 +00:00
Agetian
12ee419158 - Fix PS_RNA6. 2019-03-06 20:57:52 +03:00
Michael Kamensky
53075e5099 Merge branch 'master' into 'master'
Sound support for multicolor lands

See merge request core-developers/forge!1445
2019-03-06 17:56:56 +00:00
Agetian
33ee5a0a17 - Added puzzle PS_RNA6. 2019-03-06 20:54:06 +03:00
Alessandro Coli
0bd29eb1e7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-03-05 22:52:20 +01:00
Alessandro Coli
c4d859cb03 Sound support for multicolor lands 2019-03-05 19:17:48 +01:00
Michael Kamensky
0cbd22ae69 Merge branch 'estrid-fix' into 'master'
Fix Estrid, the Masked -1 ability

See merge request core-developers/forge!1443
2019-03-05 11:56:51 +00:00
Michael Kamensky
05ecffcbd1 Merge branch 'master' into 'master'
Forge for Android 1.6.21.003

See merge request core-developers/forge!1444
2019-03-05 06:13:19 +00:00
Agetian
3f15be2732 - Fix inverse logic in TokenEffect (fixes e.g. Estrid, the Masked -1 ability) 2019-03-05 09:10:48 +03:00
Agetian
cc13020b4b - Preparing Forge for Android publish 1.6.21.003 [hotfix]. 2019-03-05 08:35:36 +03:00
Agetian
1a27142f1f Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-03-05 08:02:13 +03:00
Sol
89348173a5 Merge branch 'revert-fc987a81' into 'master'
Revert "Merge branch 'fix-bad-art-deck-art-corruption' into 'master'"

See merge request core-developers/forge!1442
2019-03-04 15:58:17 +00:00
Sol
8a9c27f9ae Revert "Merge branch 'fix-bad-art-deck-art-corruption' into 'master'"
This reverts merge request !1440
2019-03-04 15:58:06 +00:00
Agetian
7da2316c0a - Preparing Forge for Android publish 1.6.21.002 [incremental]. 2019-03-04 16:34:33 +03:00
Michael Kamensky
6807257630 Merge branch 'custom-pool-options' into 'master'
Swanky new Choose Sets Dialog randomizer

See merge request core-developers/forge!1431
2019-03-04 13:13:50 +00:00
Michael Kamensky
223136dd6f Merge branch 'android-max-size-image-cache' into 'master'
Android max size image cache

See merge request core-developers/forge!1432
2019-03-04 13:13:35 +00:00
Sol
0b997a2937 Android max size image cache 2019-03-04 13:13:35 +00:00
Michael Kamensky
66debd6806 Merge branch 'master' into 'master'
Added puzzle PS_RNA5 (Possibility Storm - Ravnica Allegiance 05)

See merge request core-developers/forge!1441
2019-03-04 13:13:10 +00:00
Agetian
063ebf2f70 - Added puzzle PS_RNA5. 2019-03-04 15:04:21 +03:00
Michael Kamensky
940cd71d34 Merge branch 'master' into 'master'
ManaBurn sound working again + Edition files for Mythic Edition of Guild of Ravnica and Ravnica Allegiance

See merge request core-developers/forge!1437
2019-03-04 03:22:56 +00:00
Michael Kamensky
fc987a81a0 Merge branch 'fix-bad-art-deck-art-corruption' into 'master'
If a DeckList references a bogus card set/art combo ignore parts of it until it works

Closes #132

See merge request core-developers/forge!1440
2019-03-04 03:22:44 +00:00
Chris H
888f5953b1 If a DeckList references a bogus card set/art combo ignore parts of it until it works 2019-03-03 21:47:28 -05:00
Sol
c30086390d Merge branch 'master' into 'master'
Moving hard-coded text to en-US.properties file

See merge request core-developers/forge!1413
2019-03-03 20:44:33 +00:00
Sol
37207559e6 Merge branch 'patch-2' into 'master'
Update Bug.md

See merge request core-developers/forge!1439
2019-03-03 17:47:25 +00:00
Sol
93bd90f139 Update Bug.md 2019-03-03 17:47:01 +00:00
Tim Scott
e67b55d3cf Add ability to audit cards and card image data.
README version info fixup.
2019-03-03 10:00:10 -06:00
Alessandro Coli
df55bc5d34 Fixing of tabs as required 2019-03-03 10:13:22 +01:00
Sol
ce7b66652c Merge branch 'add-gitlab-templates' into 'master'
Add gitlab templates

See merge request core-developers/forge!1438
2019-03-03 02:23:03 +00:00
Chris H
c091eefc84 Add gitlab templates 2019-03-02 21:20:47 -05:00
Alessandro
b7508b8c3a ManaBurn sound working again 2019-03-02 16:10:13 +01:00
Alessandro
b5a0e15327 Merge remote-tracking branch 'upstream/master' 2019-03-02 13:14:33 +01:00
Alessandro
d29ed9a5fe New editions files for "Mythic editions" of Guilds of Ravnica and
Ravnica Allegiance
2019-03-02 12:45:15 +01:00
Michael Kamensky
62cf8533e0 Merge branch 'ai-damage-crash' into 'master'
Ai damage crash

See merge request core-developers/forge!1434
2019-03-01 18:59:07 +00:00
Chris H
7a96ff2d4b Verify AI divided damage always fills out divided hash with proper values 2019-02-28 22:16:44 -05:00
Rob Schnautz
730fa75ed2 unused import 2019-02-28 04:06:08 +00:00
Rob Schnautz
cb69f06a4b unused imports 2019-02-28 04:01:21 +00:00
Rob Schnautz
03e33fcc17 unused imports 2019-02-28 03:45:10 +00:00
Sol
cafd7d9c64 Merge branch 'quest-load-npe-fix' into 'master'
Fix NPE when no quests are available to load

See merge request core-developers/forge!1433
2019-02-28 02:52:49 +00:00
KrazyTheFox
5377376585 Fix NPE when no quests are available to load 2019-02-27 21:49:31 -05:00
Chris H
69661cab63 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-27 21:36:32 -05:00
Chris H
15520fcc67 Merge branch 'master' of https://git.cardforge.org/friarsol/forge 2019-02-27 21:35:55 -05:00
KrazyTheFox
eedbdeca99 Add release notes 2019-02-27 20:55:37 -05:00
Rob Schnautz
ea55fa676f Merge branch 'master' into 'deprecation-cleanup'
Master

See merge request core-developers/forge!1430
2019-02-28 01:06:47 +00:00
Rob Schnautz
ed2afd9460 Unused import 2019-02-28 01:04:40 +00:00
Churrufli
34380befaf Update AddBasicLandsDialog.java 2019-02-27 19:36:16 +00:00
churrufli
da5b1a18bf Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-27 20:13:44 +01:00
churrufli
a546339ea2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-27 19:58:25 +01:00
churrufli
558442a6bb Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-27 17:35:06 +01:00
Michael Kamensky
16c9cc7eac Merge branch 'lq-image-download-tweak' into 'master'
Update server download URL parsing

Closes #858

See merge request core-developers/forge!1421
2019-02-27 12:22:14 +00:00
Michael Kamensky
71da9ca610 Merge branch 'patch-1' into 'master'
Remove unnecessary RNA token image URLs

See merge request core-developers/forge!1427
2019-02-27 12:21:46 +00:00
Michael Kamensky
d54ca72994 Merge branch 'deck-editor-filtering-tweaks' into 'master'
Fix deck editor Set/Format edit problems.

Closes #863 and #855

See merge request core-developers/forge!1420
2019-02-27 12:21:29 +00:00
Michael Kamensky
79ce24b682 Merge branch 'patch' into 'master'
Update Lavinia, Azorius Renegade for multiplayer

See merge request core-developers/forge!1422
2019-02-27 12:21:17 +00:00
Michael Kamensky
0662dc5964 Merge branch 'set-max-size-for-image-cache' into 'master'
Set max size for image cache (Reduces memory footprint)

See merge request core-developers/forge!1423
2019-02-27 12:19:52 +00:00
Sol
e7f7e62cbf Remove unnecessary RNA token image URLs 2019-02-27 02:48:05 +00:00
KrazyTheFox
17c280f052 Merge branch 'master' of git.cardforge.org:core-developers/forge into custom-pool-options 2019-02-26 21:17:10 -05:00
swordshine
8d3fe2088a Merge branch 'gk2' into 'master'
GK2 edition

See merge request core-developers/forge!1424
2019-02-27 01:21:20 +00:00
swordshine
a87adfaf16 Merge branch 'type-grouping-patch' into 'master'
Sort Sorcery // Instant as an instant in Type sort.

See merge request core-developers/forge!1426
2019-02-27 01:20:45 +00:00
swordshine
ed895a5248 Merge branch 'oracle-nonfunctional' into 'master'
Oracle nonfunctional

See merge request core-developers/forge!1425
2019-02-27 01:19:51 +00:00
Rob Schnautz
143a254189 Sort Sorcery // Instant as an instant in Type sort. 2019-02-27 00:31:05 +00:00
Rob Schnautz
25a3367d74 Let's do the Wurm Warp 2019-02-27 00:01:12 +00:00
Rob Schnautz
400c7d366b any time 2019-02-26 23:58:20 +00:00
Rob Schnautz
43cdbbdbee Trample reminder text. 2019-02-26 23:48:51 +00:00
Rob Schnautz
bddba4c6dc Update trample reminder text 2019-02-26 23:43:14 +00:00
Rob Schnautz
4ab79ce75d fix date 2019-02-26 22:57:38 +00:00
Rob Schnautz
42eba01a76 GK2 edition 2019-02-26 22:45:23 +00:00
tehdiplomat
f0efc2089c Ad LRU to ImageCache to get a handle on memory bloat 2019-02-26 15:40:36 -05:00
tehdiplomat
3095c25f6d Merge branch 'master' of https://git.cardforge.org/friarsol/forge 2019-02-26 15:40:16 -05:00
swordshine
f38ec8d4a0 - Update Lavinia, Azorius Renegade for multiplayer 2019-02-26 16:59:25 +08:00
churrufli
56b3f04120 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-25 11:36:50 +01:00
Michael Kamensky
e35978594a Merge branch 'mobile-gui-zoom-update' into 'master'
Mobile gui zoom update

Closes #845

See merge request core-developers/forge!1418
2019-02-25 10:25:57 +00:00
Tim Scott
99aab2e716 Correct typo.
Add SNAPSHOT build info for Eclipse.
2019-02-24 22:31:59 -06:00
Tim Scott
17df25399f Use pattern matching to capture directory listing from the server URL string.
Add fallback to PNG for download if JPG is not found.

Correct quest-opponent-icons.txt.  Space reference should be "%20".
2019-02-24 17:22:28 -06:00
churrufli
405e07a78e Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-25 00:02:01 +01:00
Tim Scott
b090cdfa41 Fix deck editor Set/Format edit problems.
Add code to respect the "allow reprints" option on the Formats dialog.  Default it to 'true'.  Also add code to be able to initialize the sate of  that same checkbox.

Change format and set edits to refresh the item manager list so edits are realized.

Change wording of set "allow reprints" checkbox to remove confusion / conflict with the format "allow reprints" checkbox.

Add constructor so a whole format list can simply be added at once rather than iterating and creating multiple filter objects for each format.  (Net result is the same in either case.)

Change text of filter drop down to indicate things are being added or edited vs just added.
2019-02-24 12:33:58 -06:00
Michael Kamensky
8c810a120e Merge branch 'fixTriggerStatic' into 'master'
Fix trigger static

See merge request core-developers/forge!1417
2019-02-24 15:11:05 +00:00
Hanmac
fe4ce14a4b TriggerChangesZone: this check only for nonStatic Trigger 2019-02-24 15:59:36 +01:00
schnautzr
eb86945d84 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-23 21:02:22 -06:00
schnautzr
59214fe332 Code cleanup - deprecations 2019-02-23 20:59:19 -06:00
Tim Scott
ae8271de01 Add missing Eclipse steps to README for building for Android target. 2019-02-23 16:42:27 -06:00
Tim Scott
22aa98bf92 Add logic to prevent overzoom of rotated split cards for forge-gui-mobile. 2019-02-23 16:31:08 -06:00
Sol
f5f164af93 Merge branch 'unmappable-characters' into 'master'
Replace unmappable characters.

See merge request core-developers/forge!1416
2019-02-23 21:04:11 +00:00
churrufli
48216f95e1 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-23 20:25:57 +01:00
churrufli
6ef9f4bc7b undo translation in AddBasicLandsDialog.java 2019-02-23 19:47:52 +01:00
schnautzr
4ddf811118 Replace unmappable characters. 2019-02-23 11:37:28 -06:00
Michael Kamensky
3cf8b956e4 Merge branch '846-transform-with-die-trigger' into 'master'
Resolve "Transform with die trigger"

Closes #846

See merge request core-developers/forge!1408
2019-02-23 15:14:43 +00:00
Hanmac
9bf908ccb4 GameAction: fix die trigger for non-Original
TriggerChangesZone: fix leave battlefield on hidden
2019-02-23 14:50:08 +01:00
Michael Kamensky
38d3f76bb5 Merge branch 'fixTokenScriptAgain' into 'master'
TokenInfo: fix if script is null

See merge request core-developers/forge!1415
2019-02-23 13:44:07 +00:00
Hanmac
0c2cfdce34 TokenInfo: fix if script is null 2019-02-23 13:47:40 +01:00
Michael Kamensky
ea2b61cf5b Merge branch 'fix-ai-attack-token-round2' into 'master'
Fix ai attack token round2

See merge request core-developers/forge!1414
2019-02-23 05:07:11 +00:00
Chris H
ffda74101f Actually fix the crash in TokenAI.spawnToken for Attacking tokens 2019-02-22 21:50:35 -05:00
Chris H
08f47d58a1 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-22 19:55:26 -05:00
churrufli
f87f6bdebe undo translation in AddBasicLandsDialog.java 2019-02-22 17:35:37 +01:00
churrufli
2e70ab329e undo translation in AddBasicLandsDialog.java 2019-02-22 17:26:44 +01:00
churrufli
73749f28da Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-22 17:23:31 +01:00
churrufli
f7134f0a54 Translating hard-coded text to res en-US.properties 2019-02-22 16:53:57 +01:00
churrufli
231b2da573 Translating hard-coded text to res en-US.properties 2019-02-22 15:28:02 +01:00
churrufli
bf5c319bfe Merge remote-tracking branch 'origin/master' 2019-02-22 15:11:44 +01:00
churrufli
d781b6ba61 Translating hard-coded text to res en-US.properties 2019-02-22 15:10:54 +01:00
Michael Kamensky
98282acc60 Merge branch 'forums-bug-fix-attach-ai' into 'master'
Fix the thing Sol told me to

See merge request core-developers/forge!1412
2019-02-22 13:06:33 +00:00
Sol
d2917f0e43 Merge branch '850-untilyournextturn-incorrectly-ends-during-your-next-cleanup-phase' into 'master'
Resolve "UntilYourNextTurn incorrectly ends during your next cleanup phase"

Closes #850

See merge request core-developers/forge!1409
2019-02-22 12:58:14 +00:00
swordshine
919aecd9a1 Merge branch 'timmermac-sting-easy' into 'master'
Add Sting deck by timmermac

See merge request core-developers/forge!1345
2019-02-22 12:39:32 +00:00
swordshine
3c17b22a95 Merge branch 'cherry-pick-7d6a2618' into 'master'
Make sure Token AI loads TokenScript params before doing things with hte token

See merge request core-developers/forge!1411
2019-02-22 12:38:20 +00:00
Churrufli
da9373a0df Merge branch 'master' into 'master'
Translating hard-coded text to res en-US.properties

See merge request core-developers/forge!1410
2019-02-22 06:51:50 +00:00
Churrufli
3631b8be75 Update en-US.properties 2019-02-22 06:46:32 +00:00
KrazyTheFox
63ec3aae87 Fix the thing Sol told me to 2019-02-21 23:48:38 -05:00
Chris H
46670d50f3 Make sure Token AI loads TokenScript params before doing things with hte token
(cherry picked from commit 7d6a26184b4f852442730237826c94a16d739e5b)
2019-02-22 04:19:55 +00:00
KrazyTheFox
1416b668a3 Add Sting deck description 2019-02-21 21:12:38 -05:00
Krazy
893cc3b08f Merge branch 'eclipse-cleanup' into 'master'
Eclipse cleanup

Closes #844

See merge request core-developers/forge!1399
2019-02-22 02:09:05 +00:00
churrufli
25858f625b Translating hard-coded text to res en-US.properties 2019-02-22 00:30:48 +01:00
Hanmac
9e6d9e8e30 PumpEffect: fixed Until Parameter for Player 2019-02-21 16:19:12 +01:00
Michael Kamensky
1244ac89fd Merge branch 'master' into 'master'
Added puzzle PS_RNA4 - Possibility Storm: Ravnica Allegiance 04

See merge request core-developers/forge!1407
2019-02-20 05:01:53 +00:00
Agetian
facf22c092 - Added puzzle PS_RNA4. 2019-02-20 08:01:02 +03:00
Michael Kamensky
d1895ef97e Merge branch 'patch-1' into 'master'
Add m19 gift pack to Standard formats

See merge request core-developers/forge!1403
2019-02-20 03:50:43 +00:00
Michael Kamensky
0575cd98d9 Merge branch 'patch-2' into 'master'
Fix NPE in QuestController.java

See merge request core-developers/forge!1406
2019-02-20 03:50:32 +00:00
Sol
2f466834f9 Update QuestController.java 2019-02-20 01:56:13 +00:00
Sol
3282ccf6b1 Fix NPE in QuestController.java 2019-02-20 01:49:59 +00:00
Sol
6ae7cddcb9 Merge branch 'master' into 'master'
fix crash when showing uninitialized zone

See merge request core-developers/forge!1405
2019-02-19 16:10:52 +00:00
Peter F. Patel-Schneider
0d79a84b9f tiny optimization 2019-02-19 10:51:41 -05:00
Peter F. Patel-Schneider
6fcb996938 fix crash when showing uninitialized zone 2019-02-19 08:10:09 -05:00
Sol
27651313a7 Update Modern.txt 2019-02-19 00:33:57 +00:00
Sol
9d762b5740 Merge branch 'master' into 'master'
Update consecrate_consume.txt

See merge request core-developers/forge!1404
2019-02-19 00:32:24 +00:00
T.J. Tillman
e51afbc21c Update consecrate_consume.txt 2019-02-19 00:06:21 +00:00
Chris H
0ca3378901 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-18 13:52:06 -05:00
Sol
b544718140 Merge branch 'master' into 'master'
Use PeekAndReveal for Sunbird's Invocation

Closes #841

See merge request core-developers/forge!1395
2019-02-18 16:47:42 +00:00
Sol
dc4b65593e Update Brawl.txt 2019-02-18 16:00:23 +00:00
Sol
5f5b34478d Update Standard.txt 2019-02-18 15:59:02 +00:00
Sol
64e7aa902b Update M19 Gift Pack.txt 2019-02-18 15:58:32 +00:00
tehdiplomat
f6f36b75d9 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-17 22:43:39 -05:00
Chris H
99b761082e Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-17 21:33:58 -05:00
Sol
29d917d8f5 Merge branch 'master' into 'master'
preparing android build

See merge request core-developers/forge!1402
2019-02-17 23:52:10 +00:00
Jamin W. Collins
63abdd6d00 preparing android build
Signed-off-by: Jamin W. Collins <jamin.collins@gmail.com>
2019-02-17 14:09:54 -07:00
Blacksmith
e4d41001db Clear out release files in preparation for next release 2019-02-17 19:56:08 +00:00
Blacksmith
4ed17e1e16 [maven-release-plugin] prepare for next development iteration 2019-02-17 19:51:17 +00:00
Blacksmith
a70136c98c [maven-release-plugin] prepare release forge-1.6.21 2019-02-17 19:51:13 +00:00
Blacksmith
e42f3f3369 Update README.txt for release 2019-02-17 19:48:59 +00:00
Hans Mackowiak
6fc53b8fe4 Merge branch 'fix-token-images' into 'master'
Fix token images

See merge request core-developers/forge!1401
2019-02-16 14:04:45 +00:00
Sol
557be177d8 Fix token images 2019-02-16 14:04:45 +00:00
Hans Mackowiak
3fab25ab8c Merge branch 'master' into 'master'
Clarify Target Prompts for Applied Biomancy and Swirling Torrent

See merge request core-developers/forge!1398
2019-02-16 13:13:09 +00:00
Tim Scott
3be4c7e379 Update README.md with corrections regarding Eclipse build steps. 2019-02-15 21:12:29 -06:00
T.J. Tillman
452a47e573 Update swirling_torrent.txt 2019-02-16 02:42:27 +00:00
T.J. Tillman
d002ddaa5d Update applied_biomancy.txt 2019-02-16 02:42:06 +00:00
Sol
95a69f053b Merge branch 'deckconstructionrules-null-check' into 'master'
Add null check for getDeckConstructionRules()

See merge request core-developers/forge!1397
2019-02-16 01:37:35 +00:00
Chris H
f2c48a386b Add null check for getDeckConstructionRules() 2019-02-15 20:28:40 -05:00
Sol
7db1b4a106 Merge branch 'master' into 'master'
Update flames_of_the_raze_boar.txt

See merge request core-developers/forge!1396
2019-02-16 01:26:52 +00:00
T.J. Tillman
8b186bb890 Update flames_of_the_raze_boar.txt 2019-02-15 19:45:35 +00:00
Peter F. Patel-Schneider
2b0fc5a00a generalize card showing in PlayEffect 2019-02-15 10:59:12 -05:00
Peter F. Patel-Schneider
f63e59fbda PlayEffect has ShowRemembered parameter which shows remembered cards if playing cards selected from a zone 2019-02-15 08:49:16 -05:00
Tim Scott
cd044f1532 Update README with Eclipse setup and build info. 2019-02-14 22:20:47 -06:00
Tim Scott
7f16a3dce2 Remove Eclipse-specific files and directories. Maven-based build configurations can be easily imported by (at least) Eclipse 2018-12. Hint: File > Import > Maven > Existing Maven Projects > Navigate to root forge folder.
Tweak base pom.xml to allow for error-free Eclipse compilation.
2019-02-14 21:26:23 -06:00
Peter F. Patel-Schneider
3d3f1b08e4 prevent shuffling during resolution of Sunbird's Invocation and Aetherworks Marvel 2019-02-14 19:24:55 -05:00
Peter F. Patel-Schneider
f4c326826e Use PeekAndReveal for Sunbird's Invocation 2019-02-14 16:07:40 -05:00
Michael Kamensky
bf0e0a94e4 Merge branch 'master' into 'master'
fix digging with change number of 0

See merge request core-developers/forge!1394
2019-02-14 16:32:22 +00:00
Peter F. Patel-Schneider
3a71e2e948 fix digging with change number of 0 2019-02-14 11:04:11 -05:00
Sol
a739492591 Merge branch 'master' into 'master'
Update lavinia_azorius_renegade.txt

See merge request core-developers/forge!1393
2019-02-14 04:04:10 +00:00
T.J. Tillman
7a14109abc Update lavinia_azorius_renegade.txt 2019-02-14 01:15:58 +00:00
Michael Kamensky
708886e8cf Merge branch 'master' into 'master'
Add several APIs to the timestamp check in Wrapped Ability, fixes e.g. Toothy LTB trigger.

Closes #839

See merge request core-developers/forge!1392
2019-02-13 07:05:46 +00:00
Agetian
ab56e1f7d4 - Add several APIs to the timestamp check in Wrapped Ability, fixes e.g. Toothy LTB trigger. 2019-02-13 10:05:05 +03:00
swordshine
038bc27074 Merge branch 'patch-1' into 'master'
Update ragavan.txt

See merge request core-developers/forge!1391
2019-02-13 02:42:06 +00:00
Sol
4cc397baa4 Update ragavan.txt 2019-02-13 02:11:13 +00:00
Michael Kamensky
398b2ee324 Merge branch 'splitcmc' into 'master'
Fix for CMC of split cards on the stack

Closes #538

See merge request core-developers/forge!1318
2019-02-12 03:59:07 +00:00
Evan Murawski
6f85b09ee4 Fix for CMC of split cards on the stack 2019-02-12 03:59:07 +00:00
Michael Kamensky
00f6445049 Merge branch 'master' into 'master'
Added puzzle PS_RNA3.

See merge request core-developers/forge!1390
2019-02-12 03:53:34 +00:00
Agetian
24d857f269 - Added puzzle PS_RNA3. 2019-02-12 06:52:48 +03:00
Michael Kamensky
cb13f0a685 Merge branch 'master' into 'master'
allow floating zones to be sorted by the name of the card

See merge request core-developers/forge!1387
2019-02-12 03:35:49 +00:00
Peter F. Patel-Schneider
e8f14d5a6c describe change in CHANGES.txt; comment cleanup 2019-02-11 08:04:36 -05:00
Michael Kamensky
64c9f7ffb3 Merge branch '832-state-based-actions-check-conflict-with-upkeep-trigger' into 'master'
Resolve "State Based Actions check conflict with Upkeep trigger"

Closes #832

See merge request core-developers/forge!1380
2019-02-11 13:00:14 +00:00
Michael Kamensky
899532666e Merge branch 'master' into 'master'
Resolve Angel of Grace's Graveyard Ability crash

Closes #838

See merge request core-developers/forge!1388
2019-02-11 12:35:57 +00:00
Michael Kamensky
d76cd0e37d Merge branch '836-epochrasite' into 'master'
Resolve "Epochrasite"

Closes #836

See merge request core-developers/forge!1384
2019-02-11 12:35:18 +00:00
Michael Kamensky
749dc79775 Merge branch '837-rakdos-roustabout-doesn-t-deal-damage-from-his-trigger' into 'master'
Resolve "Rakdos Roustabout doesn't deal damage from his trigger"

Closes #837

See merge request core-developers/forge!1385
2019-02-11 12:35:05 +00:00
T.J. Tillman
eb17f4972a Update angel_of_grace.txt 2019-02-10 19:06:10 +00:00
Peter F. Patel-Schneider
c9f9fd93cd allow floating zones to be sorted by the name of the card 2019-02-10 13:28:52 -05:00
Hans Mackowiak
e83c78e2b4 Epochrasite: the LKI thing there is wrong 2019-02-10 11:31:50 +01:00
Michael Kamensky
bf7f07b432 Merge branch 'master' into 'master'
Fix for Clear the Stage

See merge request core-developers/forge!1386
2019-02-10 10:22:24 +00:00
T.J. Tillman
245994d094 Update clear_the_stage.txt 2019-02-10 09:40:13 +00:00
Michael Kamensky
c055e4d89c Merge branch 'patch-4' into 'master'
Update angelic_exaltation.txt

See merge request core-developers/forge!1383
2019-02-10 07:00:12 +00:00
Hanmac
fcdf49bafd TriggerAttackerBlocked: add TriggeredDefender 2019-02-10 07:42:18 +01:00
T.J. Tillman
b56472555a Revert "Update TriggerAttackerBlocked.java"
This reverts commit 06df7cb036
2019-02-10 05:53:23 +00:00
T.J. Tillman
06df7cb036 Update TriggerAttackerBlocked.java 2019-02-10 05:51:08 +00:00
Sol
d6b011fd72 Update angelic_exaltation.txt 2019-02-10 03:11:26 +00:00
Michael Kamensky
b853f34c9e Merge branch 'auraswapKeyword' into 'master'
CardFactoryUtil: Aura swap as Keyword

See merge request core-developers/forge!1382
2019-02-09 17:48:52 +00:00
Hanmac
4da05f03dc CardFactoryUtil: Aura swap as Keyword 2019-02-09 17:53:05 +01:00
Michael Kamensky
52cc02a316 Merge branch 'mayPlayFix' into 'master'
Spell: Fixed MayPlay, getRestrictions.canPlay need originalHost

Closes #827

See merge request core-developers/forge!1381
2019-02-09 14:09:52 +00:00
Hanmac
d188708028 Spell: Fixed MayPlay, getRestrictions.canPlay need originalHost 2019-02-09 09:29:32 +01:00
Michael Kamensky
1e39137ab5 Merge branch 'patch-1' into 'master'
Deputy of Detention: need Condition like Bishop of Binding

See merge request core-developers/forge!1376
2019-02-09 03:59:13 +00:00
Hanmac
47c89fb0ae PhaseHandler: fix executeUntil needs to be done after checkStateEffects 2019-02-08 19:51:51 +01:00
Michael Kamensky
cf57832970 Merge branch 'patch-3' into 'master'
Update Modern.txt

See merge request core-developers/forge!1379
2019-02-08 18:12:22 +00:00
Michael Kamensky
6c1487a491 Merge branch 'patch-2' into 'master'
Update Brawl.txt

See merge request core-developers/forge!1378
2019-02-08 18:12:08 +00:00
Michael Kamensky
6f26becf5c Merge branch 'ai-combat-adapt' into 'master'
Implement a simple combat Adapt logic.

Closes #831

See merge request core-developers/forge!1377
2019-02-08 17:33:31 +00:00
Agetian
0a543ba35e - Don't try the Adapt logic if the card can't receive +1/+1 counters. 2019-02-08 20:17:36 +03:00
Sol
09f90bfe35 Update Modern.txt 2019-02-08 16:13:58 +00:00
Sol
0c06346ca0 Update Brawl.txt 2019-02-08 16:12:15 +00:00
Agetian
1df44f8166 - Implement a simple combat Adapt logic. 2019-02-08 18:05:54 +03:00
Michael Kamensky
0d67c0fb9e Merge branch 'android-npe-fix' into 'master'
Add test for model being null.  This will occur upon deleting a deck. ...

See merge request core-developers/forge!1375
2019-02-08 11:47:03 +00:00
Hans Mackowiak
5885c37a0f Deputy of Detention: need Condition like Bishop of Binding 2019-02-08 08:17:01 +00:00
Michael Kamensky
189514f37c Merge branch 'master' into 'master'
Update amplifire.txt

See merge request core-developers/forge!1374
2019-02-08 03:37:12 +00:00
Tim Scott
ee8a45b012 Add test for model being null. This will occur upon deleting a deck. Addresses NPE encountered when a deck is deleted. 2019-02-07 19:05:13 -06:00
T.J. Tillman
983eaaff3c Update amplifire.txt 2019-02-07 20:56:54 +00:00
Michael Kamensky
9d79959b87 Merge branch 'master' into 'master'
Fix Arrester's Zeal

See merge request core-developers/forge!1372
2019-02-07 15:12:04 +00:00
T.J. Tillman
a3d75035b9 Update arresters_zeal.txt 2019-02-07 15:08:26 +00:00
Michael Kamensky
941adbbc68 Merge branch 'patch-3' into 'master'
Knight of the last Breath: fix Sac Description

See merge request core-developers/forge!1373
2019-02-07 09:10:10 +00:00
Hans Mackowiak
67167c29fc Knight of the last Breath: fix Sac Description 2019-02-07 08:41:02 +00:00
T.J. Tillman
d763e3a1db Update arresters_zeal.txt 2019-02-07 06:42:14 +00:00
T.J. Tillman
ebddcb3210 Update spear_spewer.txt 2019-02-07 06:40:11 +00:00
T.J. Tillman
526104104c Merge branch 'forPushing' into 'master'
For pushing

See merge request tjtillmancoag/forge!5
2019-02-07 06:35:27 +00:00
T.J. Tillman
ebd5e7b419 Merge branch 'SpearSpewerFix' into 'master'
Spear spewer fix et all

See merge request tjtillmancoag/forge!4
2019-02-07 06:14:18 +00:00
Michael Kamensky
d491972995 Merge branch 'master' into 'master'
Translating hard-coded text to res en-US.properties

See merge request core-developers/forge!1283
2019-02-07 05:54:47 +00:00
Michael Kamensky
60c68b10d9 Merge branch 'master' into 'master'
Guardian Project fix by friarsol: patch and integrate

See merge request core-developers/forge!1371
2019-02-07 05:05:44 +00:00
Agetian
471fcaa938 - Revert an accidental change in CardProperty. 2019-02-07 08:05:06 +03:00
Agetian
7111c3f3aa Merge branch 'fix-guardian-project' of https://git.cardforge.org/friarsol/forge into agetian-master 2019-02-07 08:04:27 +03:00
Michael Kamensky
384b5c2c5b Merge branch 'SpearSpewerFix' into 'master'
Several RNA fixes

See merge request core-developers/forge!1369
2019-02-07 04:20:13 +00:00
Sol
84a2fed516 Update guardian_project.txt 2019-02-07 03:42:23 +00:00
Chris H
a1c137a86b Fix Guardian Project 2019-02-06 22:04:31 -05:00
T.J. Tillman
87359257fd Update end_raze_forerunners.txt 2019-02-07 02:06:54 +00:00
T.J. Tillman
4e8c18b232 Update angel_of_grace.txt 2019-02-07 01:42:51 +00:00
T.J. Tillman
95f46dfde3 Update smothering_tithe.txt 2019-02-07 01:01:59 +00:00
T.J. Tillman
20c978a64f Revert "Update spear_spewer.txt"
This reverts commit c7d8a112d0
2019-02-06 21:39:56 +00:00
T.J. Tillman
bb57cb1e1b Update kaya_orzhov_usurper.txt 2019-02-06 20:28:43 +00:00
T.J. Tillman
29b0c6eb69 Update kaya_orzhov_usurper.txt 2019-02-06 20:17:25 +00:00
T.J. Tillman
76b929b814 Revert "Update arresters_zeal.txt"
This reverts commit fbde2483e4
2019-02-06 18:47:19 +00:00
T.J. Tillman
fbde2483e4 Update arresters_zeal.txt 2019-02-06 18:41:40 +00:00
T.J. Tillman
55ccd88790 Update descriptions on swirling_torrent.txt 2019-02-06 18:38:32 +00:00
T.J. Tillman
5b9e121674 Update Contamination.dck 2019-02-06 18:29:37 +00:00
T.J. Tillman
d86e04222d Revert "Update Contamination.dck"
This reverts commit 5b10cb0e26
2019-02-06 18:29:08 +00:00
T.J. Tillman
5b10cb0e26 Update Contamination.dck 2019-02-06 18:28:41 +00:00
T.J. Tillman
5d99a0e918 Update pestilent_spirit.txt 2019-02-06 18:21:31 +00:00
T.J. Tillman
8385e80fd3 Revert guardian_project.txt for this branch 2019-02-06 18:00:09 +00:00
T.J. Tillman
c7d8a112d0 Update spear_spewer.txt 2019-02-06 17:56:56 +00:00
Sol
6a715bdab7 Merge branch 'patch-1' into 'master'
Update imperiosaur: fix P/T

See merge request core-developers/forge!1367
2019-02-06 14:22:08 +00:00
Hans Mackowiak
2284964c88 Update imperiosaur: fix P7T 2019-02-06 12:20:37 +00:00
Michael Kamensky
bd83fc675c Merge branch 'lumberingFix' into 'master'
Lumbering Battlement fix using Hidden

See merge request core-developers/forge!1366
2019-02-06 07:07:06 +00:00
Hanmac
7ea81fce8b cards: add missing empty Oracle 2019-02-06 07:28:13 +01:00
Hanmac
519b05fcc1 Lumbering Battlement: use Hidden for ChangeType 2019-02-06 07:25:02 +01:00
Michael Kamensky
8ab3a00a3a Merge branch 'addendumFix' into 'master'
Addendum fix

See merge request core-developers/forge!1362
2019-02-06 05:08:17 +00:00
Hans Mackowiak
544327330d Addendum fix 2019-02-06 05:08:17 +00:00
T.J. Tillman
c3e895936e WIP - Guardian Project
- Works for Nth copy on the Battlefield
- Does NOT work for any copies in the graveyard
- Does not work for flickering the 1st copy on the battlefield (incorrectly draws), need a way to count all the cards on the BF except the triggered card
2019-02-05 22:11:47 +00:00
tehdiplomat
d223089c05 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-02-05 16:20:07 -05:00
Michael Kamensky
f5725766c0 Merge branch 'master' into 'master'
Added puzzle PS_RNA2.

See merge request core-developers/forge!1364
2019-02-05 19:59:28 +00:00
Agetian
585f0299b2 - Revert an accidental debug change commit. 2019-02-05 22:58:39 +03:00
Agetian
3a8c07d9c1 - Added puzzle PS_RNA2. 2019-02-05 22:57:00 +03:00
Agetian
30109aaeba - Added puzzle PS_RNA2. 2019-02-05 22:49:56 +03:00
Michael Kamensky
c02f4cf081 Merge branch 'master' into 'master'
Update dovin_grand_arbiter.txt

See merge request core-developers/forge!1363
2019-02-05 19:26:20 +00:00
T.J. Tillman
2c0ec81812 Update dovin_grand_arbiter.txt 2019-02-05 17:47:34 +00:00
Michael Kamensky
2d8286adf1 Merge branch 'cst' into 'master'
Add "Coldsnap Theme Decks" edition.

See merge request core-developers/forge!1314
2019-02-05 04:33:41 +00:00
Michael Kamensky
95cb17849e Merge branch 'master' into 'master'
"ANA" / Arena New Experience cards added, other card script updates

See merge request core-developers/forge!1299
2019-02-05 04:33:30 +00:00
Michael Kamensky
e42608f856 Merge branch 'master' into 'master'
Update unbreakable_formation.txt (Addendum)

See merge request core-developers/forge!1361
2019-02-05 04:31:52 +00:00
Michael Kamensky
cdb47e0e10 Merge branch 'optimize' into 'master'
optimize redisplay of floating card areas

See merge request core-developers/forge!1337
2019-02-04 20:34:45 +00:00
Michael Kamensky
b008a75043 Merge branch 'bugfix' into 'master'
fix crash when hiding temporarily shown zones

See merge request core-developers/forge!1360
2019-02-04 20:32:39 +00:00
T.J. Tillman
81d3ab86f9 Update unbreakable_formation.txt 2019-02-04 20:23:03 +00:00
Peter F. Patel-Schneider
efe71e8384 fix crash when hiding temporarily shown zones 2019-02-04 14:24:34 -05:00
Sol
cb494280a9 Merge branch 'master' into 'master'
Update kayas_wrath.txt

See merge request core-developers/forge!1359
2019-02-04 13:35:15 +00:00
T.J. Tillman
ba587ea702 Update kayas_wrath.txt 2019-02-04 06:14:39 +00:00
Michael Kamensky
4b00795f3d Merge branch 'transfigureKeyword' into 'master'
CardFactoryUtil: Transfigure as Keyword

See merge request core-developers/forge!1358
2019-02-04 03:36:11 +00:00
Hanmac
faca59beb0 CardFactoryUtil: Transfigure as Keyword 2019-02-03 18:18:06 +01:00
Michael Kamensky
41593d0060 Merge branch 'meldFix' into 'master'
MeldEffect: some fixes

See merge request core-developers/forge!1356
2019-02-03 16:33:07 +00:00
Michael Kamensky
ce865da924 Merge branch 'master' into 'master'
Added puzzle PS_RNA1. Enabled RNA in Planar Conquest.

See merge request core-developers/forge!1357
2019-02-03 16:25:37 +00:00
Agetian
1300194e3a - Added puzzle PS_RNA1.
- Enabled RNA for the Ravnica plane in Planar Conquest (no event updates yet).
2019-02-03 19:24:50 +03:00
Hanmac
903c708e1f MeldEffect: some fixes 2019-02-03 16:37:49 +01:00
Michael Kamensky
b5d97dc256 Merge branch 'surgeFix' into 'master'
SpellAbility: fixed Surge for Crush of Tentacles

See merge request core-developers/forge!1355
2019-02-03 14:56:54 +00:00
Peter F. Patel-Schneider
33c398fcb6 add newline to separate functions 2019-02-03 08:51:32 -05:00
Michael Kamensky
3fc37c735e Merge branch 'master' into 'master'
RNA fixes (Awaken the Erstwhile and Skarrgan Hellkite)

Closes #824

See merge request core-developers/forge!1354
2019-02-03 10:13:16 +00:00
Hanmac
1b44c953fc SpellAbility: fixed Surge for Crush of Tentacles 2019-02-03 08:39:30 +01:00
T.J. Tillman
816d136350 Update awaken_the_erstwhile.txt 2019-02-03 05:47:52 +00:00
T.J. Tillman
cd1bfc6b08 Update awaken_the_erstwhile.txt 2019-02-03 05:46:09 +00:00
T.J. Tillman
e72879d173 Update skarrgan_hellkite.txt 2019-02-03 05:34:42 +00:00
Michael Kamensky
d18ef04536 Merge branch 'master' into 'master'
Fix formatting in Jhoira fix and integrate it

See merge request core-developers/forge!1353
2019-02-03 05:21:01 +00:00
Agetian
426c0ca4c8 - Formatting fix. 2019-02-03 08:20:13 +03:00
Agetian
7b521919fb Merge branch 'fix_jhoira_avatar' of https://git.cardforge.org/friarsol/forge into agetian-master 2019-02-03 08:18:28 +03:00
Michael Kamensky
5b547d509b Merge branch 'master' into 'master'
RNA updates

See merge request core-developers/forge!1351
2019-02-03 05:18:05 +00:00
Chris H
98830dde13 Fix Jhoira Avatar crashing since it copies cards into no zone 2019-02-02 23:23:17 -05:00
Sol
1a5fa823e5 Merge branch 'patch-3' into 'master'
Fix: c_a_treasure_sac

Closes #825

See merge request core-developers/forge!1350
2019-02-03 04:22:50 +00:00
T.J. Tillman
c769aa07dd Update consecrate_consume.txt 2019-02-03 03:06:24 +00:00
T.J. Tillman
10745eb9c7 Update consecrate_consume.txt 2019-02-03 02:34:59 +00:00
T.J. Tillman
18934c7f9f Update revival_revenge.txt 2019-02-03 02:25:36 +00:00
T.J. Tillman
c54682850b Update theater_of_horrors.txt 2019-02-03 00:33:59 +00:00
T.J. Tillman
f241a62d95 Update clear_the_stage.txt 2019-02-03 00:15:59 +00:00
Peter F. Patel-Schneider
31bca6c614 try to do fewer layout calculations when moving cards 2019-02-02 16:46:23 -05:00
Hans Mackowiak
567aab0c43 Fix: c_a_treasure_sac 2019-02-02 21:04:01 +00:00
Michael Kamensky
ef1f1c33cf Merge branch 'giantbaiting-patch' into 'master'
Bug fix: Giantbaiting

See merge request core-developers/forge!1349
2019-02-02 16:42:53 +00:00
Rob Schnautz
a18d98c231 Token script had typo in name. 2019-02-02 16:39:51 +00:00
Michael Kamensky
66b97d5d8e Merge branch 'fix-sarkhan-dragonsoul' into 'master'
Fix Sarkhan, Dragonsoul (ultimate ability) and Kaya, Orzhov Usurper (costs).

Closes #823

See merge request core-developers/forge!1347
2019-02-02 13:24:28 +00:00
Michael Kamensky
3c83b62d98 Merge branch 'landwalkFix' into 'master'
CombatUtil: fix Basic Landwalk abilities

See merge request core-developers/forge!1348
2019-02-02 13:24:17 +00:00
Hanmac
0569a0b36d CombatUtil: fix Basic Landwalk abilities 2019-02-02 14:07:48 +01:00
Agetian
a8abbadec4 - Fix Kaya, Orzhov Usurper ability costs. 2019-02-02 13:58:13 +03:00
Agetian
6235b42c31 - Limit the search to Dragon creature cards. 2019-02-02 13:54:23 +03:00
Agetian
1d41f1b330 - Fix Sarkhan, Dragonsoul. 2019-02-02 13:51:18 +03:00
Michael Kamensky
ad8778d397 Merge branch 'master' into 'master'
Preparing Forge for Android publish 1.6.20.001 [incremental].

See merge request core-developers/forge!1346
2019-02-02 05:56:08 +00:00
Agetian
e38bd51193 - Preparing Forge for Android publish 1.6.20.001 [incremental]. 2019-02-02 08:49:31 +03:00
KrazyTheFox
92ba90bc9e Add Sting deck by timmermac 2019-02-01 23:22:39 -05:00
Blacksmith
e5584ea065 Clear out release files in preparation for next release 2019-02-02 02:05:37 +00:00
Blacksmith
17dedb4bf4 [maven-release-plugin] prepare for next development iteration 2019-02-02 02:00:32 +00:00
Blacksmith
eb3fb9e1ce [maven-release-plugin] prepare release forge-1.6.20 2019-02-02 02:00:28 +00:00
Blacksmith
b27f49c4ff Update README.txt for release 2019-02-02 01:58:00 +00:00
KrazyTheFox
8d4854bd5d Saving progress 2019-02-01 20:39:57 -05:00
Sol
1c33e3b039 Merge branch 'master' into 'master'
Update rakdos_the_showstopper.txt using DestroyAll

See merge request core-developers/forge!1344
2019-02-02 01:35:24 +00:00
T.J. Tillman
eda0a49097 Update token image parameter for Domri, Chaos Bringer 2019-02-02 00:14:16 +00:00
T.J. Tillman
ea8c6630e0 Update cry_of_the_carnarium.txt 2019-02-01 23:31:09 +00:00
T.J. Tillman
0d4310382e Update rakdos_the_showstopper.txt using DestroyAll 2019-02-01 20:10:21 +00:00
Sol
4ae1547384 Merge branch 'patch-3' into 'master'
Update carnival_carnage.txt

See merge request core-developers/forge!1343
2019-02-01 19:11:38 +00:00
Sol
4192195579 Update carnival_carnage.txt 2019-02-01 19:11:15 +00:00
Sol
0d11e28c11 Merge branch 'master' into 'master'
Update Captive Audience to Functional plus a few others

See merge request core-developers/forge!1342
2019-02-01 19:10:41 +00:00
T.J. Tillman
9cf78d0eb4 Update deputy_of_detention.txt 2019-02-01 18:18:04 +00:00
T.J. Tillman
7843004c40 Fixed Ferocious condition 2019-02-01 18:12:25 +00:00
T.J. Tillman
4c7c2ee1b5 User reported Locust God's return trigger wasn't working on Resolution, but that it does work for Scarab God. Changed one word in Locust God's trigger to match Scarab God's 2019-02-01 17:20:23 +00:00
T.J. Tillman
05538bfba2 Update captive_audience.txt 2019-02-01 17:10:37 +00:00
Michael Kamensky
6fe6d6ecfd Merge branch 'master' into 'master'
A few more RNA card script updates

See merge request core-developers/forge!1339
2019-02-01 16:56:41 +00:00
Michael Kamensky
34a8184cc7 Merge branch 'patch-3' into 'master'
Light up the stage: Fix script with Commune with Lava

See merge request core-developers/forge!1341
2019-02-01 16:55:39 +00:00
Hans Mackowiak
5d9f86bf20 Light up the stage: Fix script with Commune with Lava 2019-02-01 16:34:43 +00:00
Michael Kamensky
661555551d Merge branch 'rnabuild' into 'master'
RNA LDA deck generation data

See merge request core-developers/forge!1340
2019-02-01 14:35:40 +00:00
austinio7116
02e118b2e2 RNA deckgen data
(cherry picked from commit eb7a6da)

(cherry picked from commit 32e02e7)
2019-02-01 08:02:02 +00:00
maustin
b59fbe43f0 Merge branch 'coremaster' into rnabuild 2019-02-01 08:01:34 +00:00
T.J. Tillman
ac51d4170f Update rumbling_ruin.txt 2019-02-01 07:37:01 +00:00
Sol
dc91df0e19 Merge branch 'patch-2' into 'master'
Update plaza_of_harmony.txt

See merge request core-developers/forge!1338
2019-02-01 04:20:07 +00:00
Sol
5bce464268 Update plaza_of_harmony.txt 2019-02-01 04:19:56 +00:00
T.J. Tillman
60d5afe9a2 Update eyes_everywhere.txt 2019-02-01 04:02:15 +00:00
T.J. Tillman
ef6e09d4c4 Update fireblade_artist.txt 2019-02-01 03:12:45 +00:00
tehdiplomat
e330cabc64 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-31 20:56:32 -05:00
Sol
76324bc6db Merge branch 'master' into 'master'
Fixed Rakdos, the Showstopper

See merge request core-developers/forge!1336
2019-02-01 01:08:25 +00:00
Peter F. Patel-Schneider
30607291fc optimize redisplay of floating card areas 2019-01-31 19:53:05 -05:00
T.J. Tillman
bee8348b67 Update cosmotronic_wave.txt to reflect ruling that this is a continuous effect. 2019-01-31 22:12:14 +00:00
T.J. Tillman
51fb900eb5 Revert "Update rumbling_ruin.txt"
This reverts commit 8b902671d6
2019-01-31 22:06:31 +00:00
T.J. Tillman
8b902671d6 Update rumbling_ruin.txt 2019-01-31 22:02:53 +00:00
T.J. Tillman
7dbbf0a554 Update rakdos_the_showstopper.txt 2019-01-31 19:22:12 +00:00
T.J. Tillman
e75b15b7cb Update rakdos_the_showstopper.txt 2019-01-31 19:20:09 +00:00
tehdiplomat
b2063433c1 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-31 12:17:51 -05:00
Michael Kamensky
43cca9b635 Merge branch 'master' into 'master'
Check for alternative additional costs in the AI routines.

Closes #813 and #820

See merge request core-developers/forge!1334
2019-01-31 13:43:48 +00:00
Agetian
b29f390b62 - Fix the AI activating player setup for additional costs.
- Fix Thrilling Encore.
2019-01-31 16:39:49 +03:00
Michael Kamensky
f83a97bedd Merge branch '819-spectra-ward-broken' into 'master'
Resolve "Spectra Ward broken"

Closes #819

See merge request core-developers/forge!1335
2019-01-31 13:24:19 +00:00
Agetian
c58690dd96 Merge branch 'master' of git.cardforge.org:core-developers/forge into agetian-master 2019-01-31 09:34:27 +03:00
Hans Mackowiak
3402cddd1d GameAction: fix Spectral Ward #819 2019-01-31 06:25:06 +00:00
Agetian
3956a5b558 - Check for alternative additional costs in the AI routines (fixes AI not paying those costs for Final Payment and other cards). 2019-01-31 08:45:53 +03:00
Sol
72b60c91f5 Merge branch 'master' into 'master'
Fix Deputy of Detention

See merge request core-developers/forge!1333
2019-01-31 04:28:00 +00:00
T.J. Tillman
d063e98e33 Update deputy_of_detention.txt 2019-01-31 04:11:09 +00:00
Sol
8743cba5d7 Merge branch 'rna-rankings' into 'master'
Add RNA rankings

See merge request core-developers/forge!1332
2019-01-31 01:25:37 +00:00
Chris H
1d2bbe4923 Add RNA rankings 2019-01-30 20:24:30 -05:00
Michael Kamensky
58311e5265 Merge branch 'fix-gurzigost' into 'master'
Fix Gurzigost.

Closes #817

See merge request core-developers/forge!1331
2019-01-30 16:04:16 +00:00
Agetian
8c020c7c8c - Generic check. 2019-01-30 18:54:15 +03:00
Agetian
ba25696ea7 - Fix Gurzigost. 2019-01-30 18:30:07 +03:00
Michael Kamensky
68359097df Merge branch 'patch-2' into 'master'
CardState: this catch the Exception in case it crash in Keyword.initialize

See merge request core-developers/forge!1330
2019-01-30 15:17:47 +00:00
Hans Mackowiak
4b882ad215 CardState: this catch the Exception in case it crash in Keyword.initialize 2019-01-30 10:22:43 +00:00
Michael Kamensky
ee6806b36a Merge branch 'patch-1' into 'master'
Send SpellAbility into getDefinedPlayers of greatestPower

See merge request core-developers/forge!1329
2019-01-30 04:48:01 +00:00
Sol
343723e529 Send SpellAbility into getDefinedPlayers of greatestPower 2019-01-30 01:34:05 +00:00
Sol
15bf426386 Merge branch 'master' into 'master'
Couple RNA fixes

See merge request core-developers/forge!1328
2019-01-30 01:19:19 +00:00
T.J. Tillman
77184dc930 Update consecrate_consume.txt 2019-01-30 00:13:01 +00:00
T.J. Tillman
5f11897d11 Update consecrate_consume.txt 2019-01-29 23:43:22 +00:00
T.J. Tillman
40764691fd Update code_of_constraint.txt - Doesn't untap only true for Addendum case 2019-01-29 23:38:51 +00:00
T.J. Tillman
210cc6164d Update consecrate_consume.txt 2019-01-29 22:45:38 +00:00
T.J. Tillman
11f597bb23 Fix Consume so that target player will sacrifice its greatest power creature. Not very clean, but used a workaround mimicking Crackling Doom to get it to work. 2019-01-29 22:43:12 +00:00
T.J. Tillman
015623a122 Fix Dovin, Grand Arbiter's +1 ability 2019-01-29 19:57:56 +00:00
T.J. Tillman
b04e16d1ca Update mirror_march.txt 2019-01-29 17:50:02 +00:00
Michael Kamensky
e3f24dccd4 Merge branch 'master' into 'master'
Added RNA achievements (by Marek14).

See merge request core-developers/forge!1327
2019-01-29 14:32:42 +00:00
Agetian
2e0812dd6a - Added RNA achievements (by Marek14). 2019-01-29 17:31:50 +03:00
T.J. Tillman
9deeec7b14 Merge branch 'fixDeputyOfDetention' into 'master'
Fix Deputy of Detention

See merge request tjtillmancoag/forge!3
2019-01-29 08:57:28 +00:00
T.J. Tillman
b58b2b93e2 Fix Deputy of Detention (now exiles other cards of the same name, and also now returns those cards to the BF when it leaves the BF) 2019-01-29 07:37:06 +00:00
Michael Kamensky
2697f5f404 Merge branch 'master' into 'master'
Fixed Sentinel's Mark Lifelink trigger

See merge request core-developers/forge!1325
2019-01-29 05:46:50 +00:00
T.J. Tillman
78db487e8d Merge branch 'sentinelsMarkTrigger' into 'master'
Fix lifelink trigger on Sentinel's Mark

See merge request tjtillmancoag/forge!2
2019-01-29 05:32:53 +00:00
T.J. Tillman
1ecd1a8340 Fix lifelink trigger on Sentinel's Mark 2019-01-29 05:31:58 +00:00
Michael Kamensky
c7539de77d Merge branch 'master' into 'master'
RNA Planeswalker Deck Precons

See merge request core-developers/forge!1324
2019-01-29 05:12:28 +00:00
Agetian
b0ee2cedff - Added RNA planeswalker decks to quest mode precons. 2019-01-29 08:11:50 +03:00
Sol
7a0453390a Merge branch 'migrate-upcoming' into 'master'
Migrate upcoming

See merge request core-developers/forge!1323
2019-01-29 04:13:50 +00:00
Chris H
1b47a2df87 Migrate RNA to alpha folders 2019-01-28 22:58:33 -05:00
Chris H
fd54606277 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-28 22:44:44 -05:00
Chris H
25b02141bd Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-28 22:43:07 -05:00
Sol
bcc4158956 Merge branch 'someRNAFixes' into 'master'
Fix Spectacle cost for Blade Juggler

See merge request core-developers/forge!1322
2019-01-29 03:42:37 +00:00
T.J. Tillman
fc5b76fbb4 Fix cast cost of Colossus 2019-01-29 03:41:59 +00:00
T.J. Tillman
38ddca0acd Fix Spectacle cost 2019-01-29 03:37:10 +00:00
Sol
7ed935c43c Merge branch 'someRNAFixes' into 'master'
Fix Sphinx of Foresight opening scry timing

See merge request core-developers/forge!1321
2019-01-29 03:32:52 +00:00
T.J. Tillman
14629715a2 Fix cost of spirit-making ability on Ethereal Absolution 2019-01-29 03:22:44 +00:00
T.J. Tillman
e71ff26b81 Update forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt 2019-01-29 00:35:26 +00:00
Sol
7d6dec773a Merge branch 'someRNAFixes' into 'master'
New Cards: RNA Domri planeswalkers

See merge request core-developers/forge!1320
2019-01-28 23:35:33 +00:00
T.J. Tillman
e52bcc6cdc Update forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt 2019-01-28 22:26:02 +00:00
T.J. Tillman
b3e1d96aff Upload New File 2019-01-28 22:06:12 +00:00
T.J. Tillman
e13880c87e Domri, City Smasher 2019-01-28 20:18:07 +00:00
Chris H
0b14efebb8 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-28 15:15:06 -05:00
Sol
18a3bfe0b8 Merge branch 'someRNAFixes' into 'master'
A Few RNA card script fixes

See merge request core-developers/forge!1316
2019-01-28 20:08:56 +00:00
T.J. Tillman
d8da15d8ae Update forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt 2019-01-28 19:58:23 +00:00
T.J. Tillman
5bd9f324e0 Update forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt 2019-01-28 18:09:35 +00:00
T.J. Tillman
e0b463c6ea Update forge-gui/res/cardsfolder/upcoming/cindervines.txt 2019-01-28 18:03:00 +00:00
Michael Kamensky
01742f06f6 Merge branch 'highlight' into 'master'
Darken non-selectable cards in Desktop GUI

See merge request core-developers/forge!1317
2019-01-28 17:55:36 +00:00
T.J. Tillman
dbe212065d Update forge-gui/res/cardsfolder/r/raid_bombardment.txt 2019-01-28 17:44:21 +00:00
T.J. Tillman
4b8584376d Update forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt 2019-01-28 17:27:48 +00:00
Michael Kamensky
6cf7d3ae80 Merge branch 'master' into 'master'
Added puzzle PS_RNA0a (RNA Prerelease Puzzle)

See merge request core-developers/forge!1319
2019-01-28 12:22:42 +00:00
Agetian
104aaa1255 - Added puzzle PS_RNA0a (RNA Prerelease Puzzle) 2019-01-28 15:22:06 +03:00
Peter F. Patel-Schneider
1ba1226661 refresh hand floating zone when hand is updated 2019-01-28 05:53:38 -05:00
T.J. Tillman
f8bf8c7f28 Update forge-gui/res/cardsfolder/upcoming/cindervines.txt 2019-01-28 08:41:26 +00:00
T.J. Tillman
763cb3d08e Update forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt 2019-01-28 08:30:23 +00:00
T.J. Tillman
5e94c6c8d3 Update forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt 2019-01-28 08:27:47 +00:00
T.J. Tillman
b08ce49057 Update forge-gui/res/cardsfolder/upcoming/senate_griffin.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt files 2019-01-28 08:07:43 +00:00
T.J. Tillman
7c98ed75be Update forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/senate_griffin.txt files 2019-01-28 08:02:07 +00:00
T.J. Tillman
1c9a515bb3 Update forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt 2019-01-28 07:47:55 +00:00
T.J. Tillman
a462d34249 Update forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt, forge-gui/res/cardsfolder/upcoming/cindervines.txt files 2019-01-28 07:38:32 +00:00
T.J. Tillman
e1ceed159f Update forge-gui/res/cardsfolder/upcoming/elite_arrester.txt, forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt files 2019-01-28 07:08:05 +00:00
T.J. Tillman
89757b9677 Update forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt 2019-01-28 07:04:13 +00:00
T.J. Tillman
01c52667ad Update forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt, forge-gui/res/cardsfolder/r/raid_bombardment.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/get_the_point.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt, forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt, forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt, forge-gui/res/cardsfolder/upcoming/screaming_shield.txt, forge-gui/res/cardsfolder/upcoming/scuttlegator.txt, forge-gui/res/cardsfolder/upcoming/senate_griffin.txt, forge-gui/res/cardsfolder/upcoming/summary_judgment.txt, forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt files 2019-01-28 07:01:43 +00:00
Peter F. Patel-Schneider
25003aa74e better way to schedule visual updates to non-selectable cards 2019-01-27 21:09:52 -05:00
T.J. Tillman
766277673d Update simic_locket.txt 2019-01-27 23:45:21 +00:00
T.J. Tillman
a1ad2208c8 Update rix_maadi_reveler.txt 2019-01-27 23:01:06 +00:00
T.J. Tillman
0bfdfb78d3 Update ill_gotten_inheritance.txt 2019-01-27 22:43:34 +00:00
T.J. Tillman
b23425ea9a Update bloodmist_infiltrator.txt 2019-01-27 22:37:18 +00:00
T.J. Tillman
8b7ace6d1c Added TrigChangeZone to bounce it back, and CheckSVar to check if instant cast in Main Phase 2019-01-27 21:45:52 +00:00
T.J. Tillman
1dc8ef5244 Fixed problem with self-exiling after trigger resolution (Hanmac) 2019-01-27 20:34:35 +00:00
T.J. Tillman
625585f005 Fixed Scry 3 2019-01-27 20:15:05 +00:00
T.J. Tillman
acdee9ff0c Update fireblade_artist.txt 2019-01-27 19:43:56 +00:00
T.J. Tillman
54c5d3f344 Fix Fireblade Artist to reflect "when you" sacrifice trigger (similar to Heart-Piercer Manticore) 2019-01-27 19:25:20 +00:00
T.J. Tillman
4fa8fa3993 Update sentinels_mark.txt 2019-01-27 18:04:06 +00:00
T.J. Tillman
3b21b2a610 Fix fireblade_artist dealing damage on sacrifice 2019-01-27 17:58:28 +00:00
T.J. Tillman
07324f63d9 Update spawn_of_mayhem.txt 2019-01-27 17:56:47 +00:00
T.J. Tillman
79c3570bcc Update gutterbones.txt 2019-01-27 17:55:48 +00:00
T.J. Tillman
d9400fe069 Update rix_maadi_reveler.txt 2019-01-27 17:55:04 +00:00
Peter F. Patel-Schneider
70f0f1108b darken non-selectable cards during paintChildren 2019-01-27 08:22:50 -05:00
Peter F. Patel-Schneider
62316abf38 darken non-selectable cards when selecting (needs work) 2019-01-27 07:16:54 -05:00
Peter F. Patel-Schneider
e2ddcdda4d stronger highlighting for selectable cards 2019-01-27 07:16:54 -05:00
T.J. Tillman
e604d9d0cb Update consecrate_consume.txt to add Cleanup Remembered 2019-01-27 05:18:49 +00:00
tjtillmancoag
ed218b6e4c Fixed Amplifire (properly changes Power & Toughness),
Consume (of Consecrate // Consume, works now),
Final Payment (allows sacrifice of enchantment/creature as payment),
Incongruity (fixed A:AB$ to A:SP$),
Sentinel's Mark (gives Lifelink on Main phase trigger)
Silhana Wayfinder (triggers on ETB)
Smelt Ward Ignus (loses control of creature at EoT)
Undercity's Embrace (no life amount in gainlife ability was causing crash on cast)
2019-01-26 19:39:04 -08:00
Michael Kamensky
866c959036 Merge branch 'spellControllerFix' into 'master'
Spell: fix casting opponent spells

Closes #811

See merge request core-developers/forge!1315
2019-01-26 14:31:12 +00:00
Hanmac
b2616860c0 Spell: fix casting opponent spells 2019-01-26 13:28:55 +01:00
Hans Mackowiak
0ceb882ab0 Merge branch 'charmRework' into 'master'
Charm rework

Closes #806

See merge request core-developers/forge!1312
2019-01-26 09:24:25 +00:00
Hans Mackowiak
560dc572c2 Charm rework 2019-01-26 09:24:25 +00:00
Rob Schnautz
e891e0d31d Add "Coldsnap Theme Decks" edition. 2019-01-26 03:05:49 +00:00
Tim Scott
3c1b106837 Add balance of ANA cards as found at https://scryfall.com/sets/ana 2019-01-25 19:37:19 -06:00
Tim Scott
eefa4e46d1 Correct Druid of Horns so SpellAbility now generates a 3/3 beast. An aura targeting the Druid is supposed to do this. 2019-01-25 17:11:27 -06:00
tehdiplomat
581ef20405 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-25 13:01:27 -05:00
Michael Kamensky
27bae4a72b Merge branch 'fix-rna-sealed' into 'master'
Fix up the RNA printsheets a little bit (wrong card names, wrong set IDs)

See merge request core-developers/forge!1313
2019-01-25 15:02:16 +00:00
Agetian
6686937742 - Fix up the RNA printsheets a little bit (wrong card names, wrong set IDs) 2019-01-25 18:01:24 +03:00
Michael Kamensky
d6a466df11 Merge branch 'fix-rna-sealed' into 'master'
Fix AI sealed booster generation for Ravnica Allegiance

Closes #801

See merge request core-developers/forge!1311
2019-01-25 14:27:08 +00:00
Agetian
7eedd04aa1 - Add basic lands definitions to Ravnica Allegiance.
- Revert blocks.txt to use RNA for the land set.
2019-01-25 17:21:21 +03:00
Agetian
e3c9a40a17 - Use M19 lands as the default basic lands for GRN and RNA sealed/draft, since neither set has basic lands of its own in actual booster packs. 2019-01-25 17:17:40 +03:00
Agetian
76ebfa9460 - Fix AI sealed booster generation for Ravnica Allegiance (use GRN basic lands). 2019-01-25 17:04:09 +03:00
tehdiplomat
6cdae2e5ff Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-25 08:53:40 -05:00
Michael Kamensky
e0fd812590 Merge branch 'patch-teysa' into 'master'
TriggerHandler: Only real die can look back

Closes #797

See merge request core-developers/forge!1298
2019-01-25 04:55:39 +00:00
Michael Kamensky
2c2104dfe6 Merge branch 'deckimport' into 'master'
DeckRecognizer: Recognize split card names with single slash

See merge request core-developers/forge!1304
2019-01-25 04:53:36 +00:00
Evan Murawski
4661a19982 DeckRecognizer: Recognize split card names with single slash 2019-01-25 04:53:36 +00:00
Hans Mackowiak
9778f9e3a0 Teysa and Gitrog fixes 2019-01-24 21:26:17 +01:00
Hanmac
b6019c6308 GameSimulatorTest: second test for Teysa 2019-01-24 07:45:36 +01:00
Hans Mackowiak
7006c548a5 GameSimulatorTest: Teysa Karlov and Xathrid Necromancer 2019-01-24 07:45:36 +01:00
Hans Mackowiak
2eae26cefb TriggerHandler: Only real die can look back
Rework Panharmonicon
2019-01-24 07:43:14 +01:00
Michael Kamensky
ccd1117762 Merge branch 'riotDouble' into 'master'
Riot: Make Riot Enchantment look into the future

See merge request core-developers/forge!1303
2019-01-24 06:42:11 +00:00
Hanmac
1917871b98 GameSimulatorTest: assert check for DoubleRiot 2019-01-24 07:28:14 +01:00
Hanmac
96e6111400 Riot: Make Riot Enchantment look into the future 2019-01-24 07:27:22 +01:00
Michael Kamensky
f8d360f25f Merge branch 'master' into 'master'
Restore AI SVars for a couple cards.

See merge request core-developers/forge!1310
2019-01-24 05:38:38 +00:00
Agetian
5901c6b66b - Restore AI SVars. 2019-01-24 08:38:11 +03:00
Michael Kamensky
b9782f9790 Merge branch 'master' into 'master'
Integrate Schnautzr's token updates and fix merge conflicts.

See merge request core-developers/forge!1309
2019-01-24 05:37:17 +00:00
Agetian
74c69f0d37 - Integrate Schnautzr's token updates and fix merge conflicts. 2019-01-24 08:36:35 +03:00
Michael Kamensky
5a81cdc40d Merge branch 'master' into 'master'
Added more AI SVars for RNA, fixed Dross Scorpion trigger description. Labeled some buggy RNA scripts.

See merge request core-developers/forge!1308
2019-01-24 05:28:34 +00:00
Agetian
7ebe97f802 - Added TODO labels. 2019-01-24 08:27:54 +03:00
Agetian
956ab8e96e - Added more AI SVars for RNA.
- Added some comments for the needed script fixes.
- Fixed Dross Scorpion trigger description.
2019-01-24 08:08:52 +03:00
Rob Schnautz
b821ec7af5 Add token scripts and download URLs. 2019-01-24 04:57:54 +00:00
Chris H
6a92f68602 Merge branch 'master' of https://git.cardforge.org/core-developers/forge 2019-01-23 22:23:47 -05:00
Sol
d0c5bcf053 Merge branch 'patch-2' into 'master'
Update Ravnica Allegiance.txt

See merge request core-developers/forge!1306
2019-01-24 02:55:00 +00:00
Sol
4069b603c2 Update Ravnica Allegiance.txt 2019-01-24 02:54:49 +00:00
Sol
0813f9bc66 Merge branch 'more-rna' into 'master'
More rna

See merge request core-developers/forge!1305
2019-01-24 02:52:52 +00:00
Sol
0687fc2a31 More rna 2019-01-24 02:52:52 +00:00
Chris H
3f52a8c4f5 Merge remote-tracking branch 'origin/master' 2019-01-23 21:10:33 -05:00
Sol
82e276c661 Merge branch 'more-rna' into 'master'
RNA Templates

See merge request core-developers/forge!1291
2019-01-24 01:48:54 +00:00
Michael Kamensky
195fe58dcb Merge branch 'master' into 'master'
fix bug in min number of cards to select in digs

See merge request core-developers/forge!1302
2019-01-23 09:38:00 +00:00
Peter F. Patel-Schneider
afd1070850 fix bug in min number of cards to select in digs 2019-01-23 03:42:45 -05:00
Chris H
8580d585df Fix Mirror March 2019-01-22 21:42:46 -05:00
maustin
090d6ad9fb Merge branch 'more-rna' of https://git.cardforge.org/friarsol/forge into rnabuild 2019-01-22 06:47:12 +00:00
Michael Kamensky
8ed1ad4afc Merge branch 'master' into 'master'
remember old location and size of pop-up card list window

See merge request core-developers/forge!1300
2019-01-22 04:18:38 +00:00
Chris H
bc854f4d42 RNA Blockdata 2019-01-21 22:23:45 -05:00
Chris H
d8585fd925 Kaya 2019-01-21 22:23:15 -05:00
Chris H
5ae5fef43e Fix more splits 2019-01-21 21:54:51 -05:00
Chris H
48a0ac6039 missing split for Depose//Deploy 2019-01-21 21:53:26 -05:00
Chris H
57a3462623 Cleanup weird Light up the Stage 2019-01-21 21:18:22 -05:00
Chris H
929b5fbcfe Fix some more broken cards 2019-01-21 21:08:36 -05:00
Chris H
56fda56807 Fixes 2019-01-21 21:08:35 -05:00
Chris H
872defd992 Fix Bedazzle 2019-01-21 21:08:30 -05:00
Chris H
e78202e432 Incubation // Incongruity 2019-01-21 21:08:28 -05:00
Chris H
657d85530a Repudiate//replicate 2019-01-21 21:08:27 -05:00
Chris H
a6e0f9b472 Warrant/Warden 2019-01-21 21:08:25 -05:00
Chris H
86abb0d1d5 Fixing more broken RNA cards 2019-01-21 21:08:24 -05:00
Chris H
28a5bd109e Move broken to upcoming 2019-01-21 21:08:22 -05:00
Chris H
b357096da2 Depost deploy 2019-01-21 21:08:21 -05:00
Chris H
d1d1df27bc Consecrate Consume 2019-01-21 21:08:20 -05:00
Chris H
d7ebafe883 Collision Colossus 2019-01-21 21:08:19 -05:00
Chris H
f09130eb86 Carnival Carnage 2019-01-21 21:08:18 -05:00
Chris H
50e6a06478 Fix split cards 2019-01-21 21:08:17 -05:00
Chris H
65fc4a4371 RNA Templates 2019-01-21 21:08:16 -05:00
churrufli
84ef513489 New 5 Gauntlet Contest - Starting Magic Core Set 2019 Welcome Decks 2019-01-22 00:35:42 +01:00
Peter F. Patel-Schneider
67ca319674 remove debugging print in manipulateCardList 2019-01-21 18:10:30 -05:00
Peter F. Patel-Schneider
1f4142e368 remember old location and size of pop-up card list window 2019-01-21 18:05:19 -05:00
Tim Scott
29fd940a3d Add Arena NPE decks.
Correct typo in README.md.
2019-01-21 15:21:35 -06:00
Tim Scott
480792966b Add Arena New Player Experience cards.
Update README with minor card scripting info.
2019-01-21 12:08:01 -06:00
Michael Kamensky
b8147a2e58 Merge branch 'master' into 'master'
use multi-select for dig

Closes #799

See merge request core-developers/forge!1296
2019-01-21 14:47:08 +00:00
Michael Kamensky
2b8a756932 Merge branch 'schnautzr-master-patch-51486' into 'master'
Collector Number Sort update for RNA

See merge request core-developers/forge!1297
2019-01-21 05:06:20 +00:00
Rob Schnautz
f78bfce802 RNA looks at artifact casting cost only 2019-01-21 03:31:16 +00:00
Peter F. Patel-Schneider
ebcb4e28de Add desktop GUI and Dig changes to CHANGES.txt 2019-01-20 21:23:16 -05:00
Peter F. Patel-Schneider
f0c45cf814 Add visual chooser for two lists and use it for and/or dig 2019-01-20 21:23:16 -05:00
Peter F. Patel-Schneider
aff8d5ce01 Use chooseEntitiesForEffect for dig (except and/or dig) 2019-01-20 21:23:16 -05:00
Peter F. Patel-Schneider
94064a2a13 Fix bug in chooseEntitiesforEffect in Mobile GUI 2019-01-20 21:16:34 -05:00
Sol
6359021370 Merge branch 'master' into 'master'
Fix for Invalid Deck or Proxy File Names

Closes #560

See merge request core-developers/forge!1279
2019-01-21 00:55:35 +00:00
Evan Murawski
6090bc8117 Fix for Invalid Deck or Proxy File Names 2019-01-21 00:55:35 +00:00
churrufli
8bf2bd6ddc Translating hard-coded text to res en-US.properties 2019-01-21 00:43:16 +01:00
Peter F. Patel-Schneider
264744645e Merge branch 'highlighting' 2019-01-20 16:41:50 -05:00
Michael Kamensky
ab1e1d2386 Merge branch 'master' into 'master'
put a cyan border on valid cards when selecting targets and costs (desktop UI only)

See merge request core-developers/forge!1281
2019-01-20 19:27:11 +00:00
Hans Mackowiak
87ad257c46 Merge branch 'damageMapClear' into 'master'
DamageMap: add clear after being triggered

See merge request core-developers/forge!1290
2019-01-20 09:12:04 +00:00
Sol
bc5e7f07ae Merge branch 'gift-pack-edition' into 'master'
M19 Gift Pack edition file

See merge request core-developers/forge!1293
2019-01-20 02:59:39 +00:00
Chris H
f18651be7a M19 Gift Pack edition file 2019-01-19 21:02:24 -05:00
Chris H
9921f58155 M19 Gift Pack edition file 2019-01-19 20:58:35 -05:00
Sol
3ade967f85 Merge branch 'patch-1' into 'master'
Update skitter_eel.txt

See merge request core-developers/forge!1292
2019-01-20 01:44:01 +00:00
Sol
243c90ced9 Update skitter_eel.txt 2019-01-20 01:43:46 +00:00
Hanmac
c1c421fff0 DamageMap: add clear after being triggered 2019-01-19 18:11:55 +01:00
Michael Kamensky
bf6f8048d6 Merge branch 'spellCostReduceTarget' into 'master'
CostAdjustment: use Relative for Amount that depends on the SpellAbility

See merge request core-developers/forge!1289
2019-01-19 12:52:12 +00:00
Hanmac
f26935f37f CostAdjustment: use Relative for Amount that depends on the SpellAbility, only works for Self 2019-01-19 13:27:19 +01:00
Michael Kamensky
f3f7700ba9 Merge branch 'patch-1' into 'master'
Update sharktocrab.txt

See merge request core-developers/forge!1288
2019-01-19 10:41:41 +00:00
Hans Mackowiak
2817c4ef61 Update sharktocrab.txt 2019-01-19 10:28:33 +00:00
Michael Kamensky
166700b573 Merge branch 'master' into 'master'
Added puzzle PS_RNA0 (Ravnica Allegiance Card Preview Puzzle).

See merge request core-developers/forge!1287
2019-01-19 10:14:20 +00:00
Agetian
6edb5ad591 - Added puzzle PS_RNA0 (Ravnica Allegiance Card Preview Puzzle). 2019-01-19 13:13:41 +03:00
Hans Mackowiak
66f2ab4e91 Merge branch 'patch-1' into 'master'
Update sharktocrab

See merge request core-developers/forge!1286
2019-01-19 10:11:43 +00:00
Hans Mackowiak
1f211e6ed5 Update sharktocrab 2019-01-19 10:11:15 +00:00
Michael Kamensky
41093c2f7f Merge branch 'ai-hints-rna' into 'master'
First pass of AI hints for RNA.

See merge request core-developers/forge!1284
2019-01-19 10:02:13 +00:00
Agetian
f4df89dca8 Merge remote-tracking branch 'origin/ai-hints-rna' into ai-hints-rna
# Conflicts:
#	forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt
#	forge-gui/res/cardsfolder/upcoming/watchful_giant.txt
2019-01-19 10:27:27 +03:00
Agetian
ffabf14192 - AI hints for RNA. 2019-01-19 10:25:43 +03:00
Michael Kamensky
5ce9db0b08 Merge branch 'upcomingFix20190119' into 'master'
Fix for upcoming cards

Closes #798

See merge request core-developers/forge!1285
2019-01-19 07:23:14 +00:00
Hanmac
5165c16233 Fix for upcoming cards 2019-01-19 07:57:08 +01:00
Agetian
1e34fd27fe - AI hints for RNA. 2019-01-19 09:34:58 +03:00
Sol
12b464dbcb Merge branch 'Austin/forge-ravnicaallegiance' into 'master'
Austin/forge ravnicaallegiance

See merge request core-developers/forge!1275
2019-01-19 02:53:56 +00:00
Chris H
76e3f0305b Do Type changes affect Svar keys? That sounds bad 2019-01-18 21:29:24 -05:00
Chris H
bb57003518 Biogenic Ooze -> TokenScripts 2019-01-18 21:26:47 -05:00
Chris H
dfbfcf0a11 Hero of Precinct One -> TokenScripts 2019-01-18 21:24:29 -05:00
Chris H
c4c061d669 Fix Rampage of the Clans 2019-01-18 21:23:05 -05:00
Chris H
e76db8e7ff Fix Gruul Spellbreaker affected 2019-01-18 21:15:23 -05:00
Chris H
9c4fd8b570 Fix Spectacle 2019-01-18 21:02:36 -05:00
Chris H
5d2e7a16d3 Fix Afterlife crashes 2019-01-18 21:02:36 -05:00
Chris H
cf3a28b120 Remove bogus card 2019-01-18 21:02:35 -05:00
austinio7116
10f8616e37 First pass of remaining spoilers, commiting and fixing up those that forgescribe got close 2019-01-18 21:02:32 -05:00
maustin
1bade895e1 Complete Ravnica Allegiance editions file 2019-01-18 21:00:53 -05:00
austinio7116
1940bca932 More straightforward RNA cards 2019-01-18 21:00:46 -05:00
austinio7116
620c27a117 Attempts to fix comments in MR - correct RemAI, fix combine guildname move counters and add X Svar to electrodominance 2019-01-18 21:00:43 -05:00
austinio7116
3071f1f74b First batch of easy forgescribe cleanups with editions file 2019-01-18 21:00:42 -05:00
churrufli
07c2065917 Translating hard-coded text to res en-US.properties 2019-01-18 08:20:02 +01:00
Michael Kamensky
0f44b644c1 Merge branch 'bugfix' into 'master'
fix crash when selecting players

See merge request core-developers/forge!1282
2019-01-18 05:08:51 +00:00
Peter F. Patel-Schneider
427b2973b8 Merge branch 'bugfix' 2019-01-17 16:09:50 -05:00
Peter F. Patel-Schneider
25d1d2bb20 Merge branch 'bugfix' into highlighting
Bring bug fix into highlight code
2019-01-17 16:07:49 -05:00
Peter F. Patel-Schneider
8f2123f183 add fix to crash when selecting targets 2019-01-17 16:02:22 -05:00
Peter F. Patel-Schneider
595fbae34f Fix crash when selecting a player 2019-01-17 15:37:59 -05:00
Peter F. Patel-Schneider
3fd842c1e4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge
Bactrack to upstream master to fix bug
2019-01-17 15:30:09 -05:00
Peter F. Patel-Schneider
11f9520c1e Highlight sa targets in Desktop GUI 2019-01-17 09:35:52 -05:00
Michael Kamensky
40c64a943a Merge branch 'patch-1' into 'master'
FIX Protean Raider

See merge request core-developers/forge!1280
2019-01-17 06:01:13 +00:00
Hans Mackowiak
4f953bf2e1 FIX Protean Raider 2019-01-17 05:42:10 +00:00
Peter F. Patel-Schneider
c7d9646f7f adjust highlighting for new manipulation interface 2019-01-16 13:10:56 -05:00
Peter F. Patel-Schneider
d4b4dc5ba0 Remove debugging print 2019-01-16 12:09:13 -05:00
Peter F. Patel-Schneider
2cd86bfe1e put yellow border on selectable cards 2019-01-16 12:09:13 -05:00
Peter F. Patel-Schneider
2f9fb96d29 use Iterators instead of Lists where possible in manipulateCardList 2019-01-16 12:06:21 -05:00
Michael Kamensky
39204513fb Merge branch 'master' into 'master'
Added puzzle PS_CFB (Possibility Storm: How Much Fireball Can You Channel).

See merge request core-developers/forge!1278
2019-01-16 07:17:02 +00:00
Agetian
ebaa96004f - Added puzzle PS_CFB (How Much Fireball Can You Channel). 2019-01-16 10:16:20 +03:00
Michael Kamensky
d381251472 Merge branch 'master' into 'master'
code cleanup for moveable card displays; add movement by clicking to display-based scry

See merge request core-developers/forge!1276
2019-01-16 07:07:16 +00:00
Michael Kamensky
f00e759a93 Merge branch 'removeCountersAnyNumber' into 'master'
CountersRemoveEffect: add ValidSource and CounterNum$ Any

See merge request core-developers/forge!1277
2019-01-16 07:05:06 +00:00
Hanmac
aab63e2029 CountersRemoveEffect: add ValidSource and CounterNum$ Any 2019-01-16 07:30:24 +01:00
Peter F. Patel-Schneider
3749f2a5de fix bug in computing manipulable card views 2019-01-15 22:10:05 -05:00
Peter F. Patel-Schneider
aa7ad578d5 change manipulateCardList to CardView 2019-01-15 06:24:11 -05:00
Peter F. Patel-Schneider
fb80dece04 ListCardArea augment clicking 2019-01-15 06:24:11 -05:00
Peter F. Patel-Schneider
482ab4b87c Add left-click to top and right-click to bottom for ListCardArea 2019-01-15 06:24:11 -05:00
Peter F. Patel-Schneider
f3f9a915d5 Base FloatingZone on FloatingCardArea 2019-01-15 06:24:11 -05:00
Peter F. Patel-Schneider
52184e24ce Add intermediate FloatingCardArea to hold commonalities between FloatingZone and ListCardArea 2019-01-15 06:24:11 -05:00
Michael Kamensky
b6dbfcee96 Merge branch 'master' into 'master'
fixes for multi-player scry; fix bug when human player scrying entire library

See merge request core-developers/forge!1271
2019-01-15 10:59:30 +00:00
Peter F. Patel-Schneider
e07be68786 Remove unused import in GameAction 2019-01-14 07:40:50 -05:00
Peter Patel-Schneider
9c3ae840b8 Merge branch 'pfps_master' into 'master'
GameAction: add PlayerController:confirmMulliganScry

See merge request pfps/forge!1
2019-01-14 01:43:38 +00:00
Hanmac
20eba0fbd7 GameAction: add PlayerController:confirmMulliganScry 2019-01-13 22:01:22 +01:00
Peter F. Patel-Schneider
735516e6d5 Fix bug in scry when scrying entire library 2019-01-13 10:25:35 -05:00
Peter F. Patel-Schneider
087495f5a0 Force AI to accept mulligan scry (otherwise there is a crash) 2019-01-13 10:24:40 -05:00
Peter F. Patel-Schneider
b94ec24948 Changes to do parts of multi-player scry in correct order 2019-01-13 10:08:29 -05:00
Michael Kamensky
e3257e025d Merge branch 'sunburst' into 'master'
Sunburst: rewrite using ETB counter

See merge request core-developers/forge!1269
2019-01-13 14:10:44 +00:00
Hans Mackowiak
2640a509f9 Sunburst: rewrite using ETB counter 2019-01-13 14:10:44 +00:00
Michael Kamensky
e2eb957af9 Merge branch 'sentry2019Breadcrumbs' into 'master'
Sentry: add more Breadcumbs

See merge request core-developers/forge!1274
2019-01-13 09:44:15 +00:00
Hans Mackowiak
81f07cb8a3 Sentry: add more Breadcumbs 2019-01-13 09:44:15 +00:00
Michael Kamensky
1e3cb2e66c Merge branch 'multiplayer-mulligan' into 'master'
Remove partial paris mulligan

See merge request core-developers/forge!1273
2019-01-13 09:17:00 +00:00
Michael Kamensky
76da5b0cac Merge branch 'token_asterisk_replacement' into 'master'
Replace asterisks with x's for token filenames

See merge request core-developers/forge!1272
2019-01-13 09:15:53 +00:00
Chris H
fdc1c32287 Remove partial paris mulligan 2019-01-12 23:49:09 -05:00
Chris H
3b38547fc9 Replace asterisks with x's for token filenames 2019-01-12 22:55:23 -05:00
Michael Kamensky
53d1716255 Merge branch 'deckAnyNumber' into 'master'
DeckFormat: A deck can have any number of cards named CARDNAME.

See merge request core-developers/forge!1270
2019-01-12 16:13:00 +00:00
Hans Mackowiak
0606a00942 DeckFormat: A deck can have any number of cards named CARDNAME. 2019-01-12 16:13:00 +00:00
swordshine
af3c645521 Merge branch 'adaptReduceCost' into 'master'
Adapt: add ReduceCost for Pteramander

See merge request core-developers/forge!1267
2019-01-12 07:49:50 +00:00
swordshine
e5093c6d2f Merge branch 'patch-2' into 'master'
Fix vicious_rumors.txt not discarding

See merge request core-developers/forge!1268
2019-01-12 07:48:49 +00:00
Sol
59102b0e08 Update vicious_rumors.txt 2019-01-12 01:36:29 +00:00
Hanmac
17cff99c2b Adapt: add ReduceCost for Pteramander 2019-01-11 21:15:27 +01:00
Michael Kamensky
7d0dbff8bc Merge branch 'master' into 'master'
Select cards from any Zone that can be shown and do arrangeForScry by popping up library and moving cards (in desktop GUI); Pass min/max card selections through to GUI

See merge request core-developers/forge!1260
2019-01-11 17:08:50 +00:00
Sol
6974e2de27 Merge branch 'patch-2' into 'master'
CostPayLife: fix unused import

See merge request core-developers/forge!1266
2019-01-11 13:27:37 +00:00
Hans Mackowiak
770ed4524a CostPayLife: fix unused import 2019-01-11 13:24:33 +00:00
Hans Mackowiak
7f4dc85554 Merge branch '793-new-feature-paylife-trigger' into 'master'
New Feature: PayLife Trigger

Closes #793

See merge request core-developers/forge!1265
2019-01-11 13:01:08 +00:00
Hans Mackowiak
005fa3d732 Font of Agonies: use new PayLife trigger 2019-01-11 10:28:27 +00:00
Hans Mackowiak
bbe8d79400 Player: add PayLife Trigger 2019-01-11 10:16:29 +00:00
Hans Mackowiak
edaab9d7de TriggerType: add PayLife 2019-01-11 09:38:02 +00:00
Hans Mackowiak
842c6e681d TriggerPayLife: add new Trigger 2019-01-11 09:33:56 +00:00
Hans Mackowiak
05be8406cc Update TriggerLifeGained: better format 2019-01-11 09:31:53 +00:00
Hans Mackowiak
7aa879fb8e Update CostDraw: fix Description 2019-01-11 09:19:12 +00:00
Hans Mackowiak
1e6a9b8c26 Update CostDamage, fix Description 2019-01-11 09:17:55 +00:00
Hans Mackowiak
b2e9c88f62 CostPayLife: refund never called and doesn't work
negative amount can't be paid in the function
2019-01-11 09:16:50 +00:00
Peter F. Patel-Schneider
3609ff9eff only use new input methods if in desktop GUI; remove debugging prints 2019-01-11 03:48:42 -05:00
Peter F. Patel-Schneider
09fc3ae60c add new GUI interface allowing cards to be moved around in a list and use for arrangeForScry if preference UI_SELECT_FROM_CARD_DISPLAYS is set 2019-01-09 21:13:09 -05:00
Michael Kamensky
948c13dd15 Merge branch 'deckicons' into 'master'
Add icons to duels and challenges in LEB and ARN worlds

See merge request core-developers/forge!1262
2019-01-09 06:04:07 +00:00
Rob Schnautz
b8f7d08fae Remove extraneous line 2019-01-09 05:50:07 +00:00
Rob Schnautz
576b7e2dd3 fix kane 2019-01-09 04:35:52 +00:00
Rob Schnautz
024b2e1a01 Add new quest opponent avatars to the downloader. 2019-01-09 04:23:24 +00:00
Rob Schnautz
daf4b9d974 ARN icons and some flavor text. 2019-01-08 03:25:43 +00:00
Rob Schnautz
36b3431975 rest of the LEB world icons 2019-01-08 02:54:36 +00:00
Rob Schnautz
3ded3926f4 Remove placeholder icons for shiny new icons. 2019-01-08 02:50:58 +00:00
Peter F. Patel-Schneider
69502dd97b Pass min/max through choice code so that user can't choose too many cards 2019-01-06 12:07:19 -05:00
Peter F. Patel-Schneider
234304f9ec Add option to select cards from any Zone that can be shown (implemented in desktop GUI only for now) 2019-01-06 10:47:20 -05:00
Michael Kamensky
193a1cc255 Merge branch 'teysaKarlov' into 'master'
Teysa Karlov: add Dieharmonicon to TriggerHandler

See merge request core-developers/forge!1259
2019-01-06 11:12:38 +00:00
Hanmac
d0b569a07f Teysa Karlov: add Dieharmonicon to TriggerHandler 2019-01-06 11:38:58 +01:00
Michael Kamensky
b17edd31ac Merge branch 'tapAttacker' into 'master'
Taps Trigger now flag for being used as Attacker

See merge request core-developers/forge!1258
2019-01-06 05:34:09 +00:00
Hanmac
891f61701c Taps Trigger now flag for being used as Attacker 2019-01-05 20:52:40 +01:00
Hans Mackowiak
e35f5098b9 Merge branch 'charmNone' into 'master'
CharmEffect: now allows zero choices

See merge request core-developers/forge!1257
2019-01-05 12:01:30 +00:00
Hans Mackowiak
55da7435f8 CharmEffect: now allows zero choices 2019-01-05 12:01:30 +00:00
Michael Kamensky
f0a561b1ee Merge branch 'adaptBio' into 'master'
Adapt changes for Biomancer's Familiar

See merge request core-developers/forge!1256
2019-01-04 19:38:37 +00:00
Hans Mackowiak
bbd48d1033 Adapt changes for Biomancer's Familiar 2019-01-04 19:38:37 +00:00
Hans Mackowiak
847013c6c7 Merge branch 'morphSimFix' into 'master'
fixes for game sim

See merge request core-developers/forge!1255
2019-01-04 09:23:47 +00:00
Hanmac
61aa144631 fixes for game sim 2019-01-03 21:44:18 +01:00
Michael Kamensky
dd87f74eb4 Merge branch 'atEOTSvar' into 'master'
At eot svar

See merge request core-developers/forge!1254
2019-01-03 17:47:16 +00:00
Hanmac
95dbc5333e updated card scripts, remove EndOfTurnLeavePlay, add tokenscripts 2019-01-03 16:02:04 +01:00
Hanmac
0d2114416c extend AtEOT, fix resetTurnActivations 2019-01-03 15:54:53 +01:00
Michael Kamensky
215808b011 Merge branch 'facedown-reveal-fix' into 'master'
Fixed the reveal for face-down cards leaving battlefield/stack not working anymore.

See merge request core-developers/forge!1253
2018-12-30 10:43:37 +00:00
Agetian
1ced8bba7d - Style fix. Added a comment. 2018-12-30 08:26:34 +03:00
Agetian
468ff7fc50 - Fixed the reveal for face-down cards leaving battlefield/stack not working anymore. 2018-12-30 08:19:29 +03:00
Hans Mackowiak
0eed2c67d1 Merge branch 'morphRework' into 'master'
Morph and Manifest are not to facedown anymore

See merge request core-developers/forge!1252
2018-12-29 19:18:35 +00:00
Hanmac
4168ef0b0d Morph and Manifest are not to facedown anymore 2018-12-29 15:45:20 +01:00
Michael Kamensky
bf59d932f4 Merge branch 'master' into 'master'
XMage cube ports update

See merge request core-developers/forge!1251
2018-12-27 18:21:14 +00:00
Agetian
765b0e4625 - XMage cube ports update (2 new cubes). 2018-12-27 21:19:45 +03:00
Michael Kamensky
16058bbea2 Merge branch 'tweak-target-overlay' into 'master'
Tweak target overlay

See merge request core-developers/forge!1248
2018-12-27 18:09:24 +00:00
Michael Kamensky
f47f95cd2e Merge branch 'seanceCopyFix' into 'master'
Seance: use AddTypes and AtEOT instead of extra Clones defined

See merge request core-developers/forge!1249
2018-12-27 18:09:00 +00:00
Hanmac
7f0f62abb6 Seance: use AddTypes and AtEOT instead of extra Clones defined 2018-12-27 17:31:34 +01:00
Hans Mackowiak
22627b57f0 Merge branch 'patch-2' into 'master'
Update growth_spiral.txt

Closes #792

See merge request core-developers/forge!1250
2018-12-27 16:23:02 +00:00
Hans Mackowiak
5a81cace02 Update growth_spiral.txt 2018-12-27 16:21:28 +00:00
Tim Scott
3f172e6872 Merge remote-tracking branch 'remotes/upstream-forge/master' into tweak-target-overlay 2018-12-27 08:08:00 -06:00
Michael Kamensky
52dcdaa47d Merge branch 'master' into 'master'
AI damage chaining: Eliminated a redundant call to canPlay (already tested at this point).

See merge request core-developers/forge!1247
2018-12-27 10:18:41 +00:00
Agetian
d4476cbd2b - Eliminated a redundant call to canPlay (already tested above). 2018-12-27 13:17:49 +03:00
Michael Kamensky
d2c4ab28c2 Merge branch 'master' into 'master'
Fixed the AI misplaying with Chamber Sentry.

Closes #791

See merge request core-developers/forge!1246
2018-12-27 05:23:31 +00:00
Agetian
23d67ab0cf - Fixed the AI misplaying with Chamber Sentry. 2018-12-27 08:21:28 +03:00
Tim Scott
3f55b9f503 Flesh out README. 2018-12-26 10:18:40 -06:00
Tim Scott
e222444809 Update readme with build info. 2018-12-26 09:32:22 -06:00
Tim Scott
83ed648966 Merge remote-tracking branch 'remotes/upstream-forge/master' into tweak-target-overlay 2018-12-26 08:44:28 -06:00
Hans Mackowiak
a5c1d88460 Merge branch 'putLandOptionalFix' into 'master'
Fix 'You may put' 'land card from your hand onto the battlefield' cards

See merge request core-developers/forge!1245
2018-12-26 10:28:58 +00:00
Hanmac
fee83e0db4 Fix 'You may put' 'land card from your hand onto the battlefield' cards 2018-12-26 11:19:23 +01:00
Tim Scott
dadf1b12d3 Add README file. 2018-12-25 10:55:00 -06:00
Tim Scott
5ff8298b62 Fix issue with missing foe blocking arcs for a foe that is targeted by friendly enchantment and arcs are set to "ON" (vs MOUSEOVER). 2018-12-25 10:04:19 -06:00
Tim Scott
44e181981d Update targeting overlay to draw target arrow for stack top when "On" (no initial mouse over required).
Prevent identical target arrows from being added to the arc lists which was causing a minor graphics glitch.
2018-12-24 16:44:01 -06:00
KrazyTheFox
52b659e902 Implement initial version of random edition selection 2018-10-17 20:40:01 -04:00
Rob Schnautz
458ccd5ce0 Stealing Dreams 2018-09-23 16:10:57 +00:00
Rob Schnautz
bdcb9693be Tempting Offers (M19) 2018-09-23 16:08:16 +00:00
Rob Schnautz
075efd3eb6 Increase Reduce Cardname (M19) 2018-09-23 15:56:15 +00:00
Rob Schnautz
ac763262d9 Copy standardization (M19) 2018-09-22 18:21:15 +00:00
Rob Schnautz
f755186aee Merge branch 'master' into 'oracle-updates-nonfunctional'
update nonfunctional changes branch

See merge request core-developers/forge!937
2018-09-22 17:51:07 +00:00
Rob Schnautz
fb8bfdc449 back matter, premium Dread Defiler 2018-04-28 00:31:30 +00:00
Rob Schnautz
06c164a013 back matter, premium Markov Dreadknight 2018-04-28 00:27:00 +00:00
Rob Schnautz
fe481d40e2 back matter, premium Soul Swallower 2018-04-28 00:24:42 +00:00
Rob Schnautz
abc42d5a32 back matter, premium Drogskol Cavalry 2018-04-28 00:22:37 +00:00
Rob Schnautz
308f525803 back matter, premium Flameblade Angel 2018-04-28 00:20:54 +00:00
Rob Schnautz
f673397c77 back matter 2018-04-28 00:13:10 +00:00
Rob Schnautz
cd6831eb2d back matter 2018-04-28 00:10:48 +00:00
Rob Schnautz
dde09633d9 back matter, premium Ivorytusk Fortress 2018-04-28 00:08:20 +00:00
Rob Schnautz
af94d5e9ce back matter, premium Sage of the Inward Eye 2018-04-28 00:06:45 +00:00
Rob Schnautz
3d33192efa back matter, premium Ankle Shanker 2018-04-28 00:01:28 +00:00
Rob Schnautz
371e083a0e back matter, premium Shipbreaker Kraken 2018-04-27 23:58:24 +00:00
Rob Schnautz
08bb85d58f back matter, premium Galvanoth 2018-04-27 23:56:14 +00:00
Rob Schnautz
a67c34d36d back matter, premium Krenko, Mob Boss 2018-04-27 23:53:42 +00:00
Rob Schnautz
a8dd39c5b3 back matter 2018-04-27 23:50:09 +00:00
Rob Schnautz
815f989310 back matter, premium Flayer of the Hatebound 2018-04-27 23:46:35 +00:00
Rob Schnautz
2cda73ad77 back matter 2018-04-27 23:44:11 +00:00
Rob Schnautz
bf290a84bd back matter and premium Dawnbringer Charioteers 2018-04-27 23:41:02 +00:00
6683 changed files with 181320 additions and 30656 deletions

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

5
.gitignore vendored
View File

@@ -231,3 +231,8 @@ forge-gui/tools/oracleScript.log
/release.properties
/target
/test-output
.settings
.classpath
.project
.vscode/settings.json
.vscode/launch.json

View File

@@ -0,0 +1,33 @@
Summary
(Summarize the bug encountered concisely)
Steps to reproduce
(How one can reproduce the issue - this is very important. Specific cards and specific actions especially)
Which version of Forge are you on (Release, Snapshot? Desktop, Android?)
What is the current bug behavior?
(What actually happens)
What is the expected correct behavior?
(What you should see instead)
Relevant logs and/or screenshots
(Paste/Attach your game.log from the crash - please use code blocks (```)) Also, provide screenshots of the current state.
Possible fixes
(If you can, link to the line of code that might be responsible for the problem)
/label ~needs-investigation

View File

@@ -0,0 +1,15 @@
Summary
(Summarize the feature you wish concisely)
Example screenshots
(If this is a UI change, please provide an example screenshot of how this feature might work)
Feature type
(Where in Forge does this belong? e.g. Quest Mode, Deck Editor, Limited, Constructed, etc.)
/label ~feature request

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>forge</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@@ -1,7 +0,0 @@
add_header=true
add_todo=false
eclipse.preferences.version=1
header_text=/*\n * Forge\: Play Magic\: the Gathering.\n * Copyright (C) 2011 Forge Team\n *\n * This program is free software\: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http\://www.gnu.org/licenses/>.\n */
project_specific_settings=true
replacements=<?xml version\="1.0" standalone\="yes"?>\n\n<replacements>\n<replacement key\="get" scope\="1" mode\="0">Gets the</replacement>\n<replacement key\="set" scope\="1" mode\="0">Sets the</replacement>\n<replacement key\="add" scope\="1" mode\="0">Adds the</replacement>\n<replacement key\="edit" scope\="1" mode\="0">Edits the</replacement>\n<replacement key\="remove" scope\="1" mode\="0">Removes the</replacement>\n<replacement key\="init" scope\="1" mode\="0">Inits the</replacement>\n<replacement key\="parse" scope\="1" mode\="0">Parses the</replacement>\n<replacement key\="create" scope\="1" mode\="0">Creates the</replacement>\n<replacement key\="build" scope\="1" mode\="0">Builds the</replacement>\n<replacement key\="is" scope\="1" mode\="0">Checks if is</replacement>\n<replacement key\="print" scope\="1" mode\="0">Prints the</replacement>\n<replacement key\="has" scope\="1" mode\="0">Checks for</replacement>\n</replacements>\n\n
visibility_private=false

View File

@@ -1,2 +0,0 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@@ -1,284 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=0
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
org.eclipse.jdt.core.formatter.comment.format_block_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.join_lines_in_comments=true
org.eclipse.jdt.core.formatter.join_wrapped_lines=true
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=120
org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=space
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true
org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +0,0 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

230
README.md Normal file
View File

@@ -0,0 +1,230 @@
# Forge
Gitlab repo is found [here](https://git.cardforge.org/core-developers/forge).
Dev instructions here: [Getting Started](https://www.slightlymagic.net/wiki/Forge:How_to_Get_Started_Developing_Forge) (Somewhat outdated)
Discord channel [here](https://discordapp.com/channels/267367946135928833/267742313390931968)
# Requirements / Tools
- Java IDE such as IntelliJ or Eclipse
- Java JDK 8 or later
- Git
- Git client (optional)
- Maven
- Gitlab account
- Libgdx (optional: familiarity with this library is helpful for mobile platform development)
- Android SDK (optional: for Android releases)
- RoboVM (optional: for iOS releases) (TBD: Current status of support by libgdx)
# Project Quick Setup
- Log in to gitlab with your user account and fork the project.
- Clone your forked project to your local machine
- Go to the project location on your machine. Run Maven to download all dependencies and build a snapshot. Example for Windows & Linux: `mvn -U -B clean -P windows-linux install`
# Eclipse
Eclipse includes Maven integration so a separate install is not necessary. For other IDEs, your mileage may vary.
## Project Setup
- Follow the instructions for cloning from Gitlab. You'll need a Gitlab account setup and an SSH key defined.
If you are on a Windows machine you can use Putty with TortoiseGit for SSH keys. Run puttygen.exe to generate the key -- save the private key and export
the OpenSSH public key. If you just leave the dialog open, you can copy and paste the key from it to your Gitlab profile under
"SSH keys". Run pageant.exe and add the private key generated earlier. TortoiseGit will use this for accessing Gitlab.
- Fork the Forge git repo to your Gitlab account.
- Clone your forked repo to your local machine.
- Make sure the Java SDK is installed -- not just the JRE. Java 8 or newer required. If you execute `java -version` at the shell or command prompt, it should report version 1.8 or later.
- Install Eclipse 2018-12 or later for Java. Launch it.
- Create a workspace. Go to the workbench. Right-click inside of Package Explorer > Import... > Maven > Existing Maven Projects > Navigate to root path of the local forge repo and
ensure everything is checked > Finish.
- Let Eclipse run through building the project. You may be prompted for resolving any missing Maven plugins -- accept the ones offered. You may see errors appear in the "Problems" tab. These should
be automatically resolved as plug-ins are installed and Eclipse continues the build process. If this is the first time for some plug-in installs, Eclipse may prompt you to restart. Do so. Be patient
for this first time through.
- Once everything builds, all errors should disappear. You can now advance to Project launch.
## Project Launch
### Desktop
This is the standard configuration used for releasing to Windows / Linux / MacOS.
- Right-click on forge-gui-desktop > Run As... > Java Application > "Main - forge.view" > Ok
- The familiar Forge splash screen, etc. should appear. Enjoy!
### Mobile (Desktop dev)
This is the configuration used for doing mobile development using the Windows / Linux / MacOS front-end. Knowledge of libgdx is helpful here.
- Right-click on forge-gui-mobile-dev > Run As... > Java Application > "Main - forge.app" > Ok.
- A view similar to a mobile phone should appear. Enjoy!
## Eclipse / Android SDK Integration
Google no longer supports Android SDK releases for Eclipse. That said, it is still possible to build and debug Android platforms.
### Android SDK
Reference SO for obtaining a specific release: https://stackoverflow.com/questions/27043522/where-can-i-download-an-older-version-of-the-android-sdk
#### Windows
Download the following archived version of the Android SDK: http://dl-ssl.google.com/android/repository/tools_r25.2.3-windows.zip. Install it somewhere on your machine. This is referenced
in the following instructions as your 'Android SDK Install' path.
#### Linux / Mac OSX
TBD
### Android Plugin for Eclipse
Google's last plugin release does not work completely with target's running Android 7.0 or later. Download the ADT-24.2.0-20160729.zip plugin
from: https://github.com/khaledev/ADT/releases
In Eclipse go to: Help > Install New Software... > Add > Name: ADT Update, Click on the "Archive:" button and navigate to the downloaded ADT-24.2.0-20160729.zip file > Add. Install all "Developer Tools". Eclipse
should restart and prompt you to run the SDK Manager. Launch it and continue to the next steps below.
### Android Platform
In Eclipse, if the SDK Manager is not already running, go to Window > Android SDK Manager. Install the following options / versions:
- Android SDK Build-tools 26.0.1
- Android 7.1.1 (API 25) SDK Platform
- Google USB Driver 11
Note that this will populate additional tools in the Android SDK install path extracted above.
### Proguard update
The Proguard included with the Android SDK Build-tools is outdated and does not work with Java 1.8. Download Proguard 6.0.3 from https://sourceforge.net/projects/proguard/files/proguard/6.0/.
- Go to the Android SDK install path. Rename the tools/proguard/ path to tools/proguard4.7/.
- Extract Proguard 6.0.3 to the Android SDK install path under tools/. You will need to rename the dir proguard6.0.3/ to proguard/.
### Android Build
The Eclipse plug-ins do NOT support building things for Android. They do however allow you to use the debugger so you can still set breakpoints and trace
things out. The steps below show how to generate a debug Android build.
1) Create a Maven build for the forge top-level project. Right-click on the forge project. Run as.. > Maven build...
- On the Main tab, set Goals: clean install
2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View.
3) Right-click on the forge-gui-android project. Run as.. > Maven build...
- On the Main tab, set Goals: install, Profiles: android-debug
- On the Environment tab, you may need to define the variable ANDROID_HOME with the value containing the path to your Android SDK installation. For example, Variable: ANDROID_HOME, Value: Your Android SDK install path here.
4) Run the forge-gui-android Maven build. This may take a few minutes. If everything worked, you should see "BUILD SUCCESS" in the Console View.
Assuming you got this far, you should have an Android forge-android-[version].apk in the forge-gui-android/target path.
### Android Deploy
You'll need to have the Android SDK install path platform-tools/ path in your command search path to easily deploy builds.
- Open a command prompt. Navigate to the forge-gui-android/target/ path.
- Connect your Android device to your dev machine.
- Ensure the device is visible using `adb devices`
- Remove the old Forge install if present: `adb uninstall forge.app`
- Install the new apk: `adb install forge-android-[version].apk`
### Android Debugging
Assuming the apk is installed, launch it from the device.
In Eclipse, launch the DDMS. Window > Perspective > Open Perspective > Other... > DDMS. You should see the forge app in the list. Highlight the app, click on the green debug button and a
green debug button should appear next to the app's name. You can now set breakpoints and step through the source code.
## Windows / Linux SNAPSHOT build
SNAPSHOT builds can be built via the Maven integration in Eclipse.
1) Create a Maven build for the forge top-level project. Right-click on the forge project. Run as.. > Maven build...
- On the Main tab, set Goals: clean install, set Profiles: windows-linux
2) Run forge Maven build. If everything built, you should see "BUILD SUCCESS" in the Console View.
The resulting snapshot will be found at: forge-gui-desktop/target/forge-gui-desktop-[version]-SNAPSHOT
# IntelliJ
Quick start guide for [setting up the Forge project within IntelliJ](https://git.cardforge.org/core-developers/forge/wikis/intellij-setup).
# Card Scripting
Visit [this page](https://www.slightlymagic.net/wiki/Forge_API) for information on scripting.
Card scripting resources are found in the forge-gui/res/ path.
# General Notes
## Project Hierarchy
Forge is divided into 4 primary projects with additional projects that target specific platform releases. The primary projects are:
- forge-ai
- forge-core
- forge-game
- forge-gui
The platform-specific projects are:
- forge-gui-android
- forge-gui-desktop
- forge-gui-ios
- forge-gui-mobile
- forge-gui-mobile-dev
### forge-ai
### forge-core
### forge-game
### forge-gui
The forge-gui project includes the scripting resource definitions in the res/ path.
### forge-gui-android
Libgdx-based backend targeting Android. Requires Android SDK and relies on forge-gui-mobile for GUI logic.
### forge-gui-desktop
Java Swing based GUI targeting desktop machines.
Screen layout and game logic revolving around the GUI is found here. For example, the overlay arrows (when enabled) that indicate attackers and blockers, or the targets of the stack are defined and drawn by this.
### forge-gui-ios
Libgdx-based backend targeting iOS. Relies on forge-gui-mobile for GUI logic.
### forge-gui-mobile
Mobile GUI game logic utilizing [libgdx](https://libgdx.badlogicgames.com/) library. Screen layout and game logic revolving around the GUI for the mobile platforms is found here.
### forge-gui-mobile-dev
Libgdx backend for desktop development for mobile backends. Utilizes LWJGL. Relies on forge-gui-mobile for GUI logic.

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java"/>
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="con" path="org.testng.TESTNG_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/forge-core"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>forge-ai</name>
<comment></comment>
<projects>
<project>forge-game</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@@ -1,3 +0,0 @@
eclipse.preferences.version=1
encoding//src/main/java=ISO-8859-1
encoding/<project>=UTF-8

View File

@@ -1,5 +0,0 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7

View File

@@ -1,4 +0,0 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.20-SNAPSHOT</version>
<version>1.6.35</version>
</parent>
<artifactId>forge-ai</artifactId>

View File

@@ -1,5 +1,5 @@
package forge.ai;
public enum AIOption {
USE_SIMULATION;
USE_SIMULATION
}

View File

@@ -24,6 +24,7 @@ import forge.ai.ability.AnimateAi;
import forge.card.CardTypeView;
import forge.game.GameEntity;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.ProtectEffect;
import forge.game.card.*;
@@ -81,7 +82,7 @@ public class AiAttackController {
this.defendingOpponent = choosePreferredDefenderPlayer();
this.oppList = getOpponentCreatures(this.defendingOpponent);
this.myList = ai.getCreaturesInPlay();
this.attackers = new ArrayList<Card>();
this.attackers = new ArrayList<>();
for (Card c : myList) {
if (CombatUtil.canAttack(c, this.defendingOpponent)) {
attackers.add(c);
@@ -95,7 +96,7 @@ public class AiAttackController {
this.defendingOpponent = choosePreferredDefenderPlayer();
this.oppList = getOpponentCreatures(this.defendingOpponent);
this.myList = ai.getCreaturesInPlay();
this.attackers = new ArrayList<Card>();
this.attackers = new ArrayList<>();
if (CombatUtil.canAttack(attacker, this.defendingOpponent)) {
attackers.add(attacker);
}
@@ -103,8 +104,7 @@ public class AiAttackController {
} // overloaded constructor to evaluate single specified attacker
public static List<Card> getOpponentCreatures(final Player defender) {
List<Card> defenders = new ArrayList<Card>();
defenders.addAll(defender.getCreaturesInPlay());
List<Card> defenders = new ArrayList<>(defender.getCreaturesInPlay());
Predicate<Card> canAnimate = new Predicate<Card>() {
@Override
public boolean apply(Card c) {
@@ -151,7 +151,7 @@ public class AiAttackController {
*
*/
public final static List<Card> sortAttackers(final List<Card> in) {
final List<Card> list = new ArrayList<Card>();
final List<Card> list = new ArrayList<>();
// Cards with triggers should come first (for Battle Cry)
for (final Card attacker : in) {
@@ -190,15 +190,49 @@ public class AiAttackController {
if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) {
return false;
}
// the attacker will die to a triggered ability (e.g. Sarkhan the Masterless)
for (Card c : ai.getOpponents().getCardsIn(ZoneType.Battlefield)) {
for (Trigger t : c.getTriggers()) {
if (t.getMode() == TriggerType.Attacks) {
SpellAbility sa = t.getOverridingAbility();
if (sa == null && t.hasParam("Execute")) {
sa = AbilityFactory.getAbility(c, t.getParam("Execute"));
}
if (sa != null && sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("DefinedPlayers"))) {
List<Card> valid = CardLists.getValidCards(c.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), c.getController(), c, sa);
// TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine
// how much damage is dealt by each of the creatures in the valid list.
if (attacker.getNetToughness() <= valid.size()) {
return false;
}
}
}
}
}
if ("TRUE".equals(attacker.getSVar("HasAttackEffect"))) {
return true;
}
final Player opp = this.defendingOpponent;
if (ComputerUtilCombat.damageIfUnblocked(attacker, opp, combat, true) > 0) {
return true;
// Damage opponent if unblocked
final int dmgIfUnblocked = ComputerUtilCombat.damageIfUnblocked(attacker, opp, combat, true);
if (dmgIfUnblocked > 0) {
boolean onlyIfExalted = false;
if (combat.getAttackers().isEmpty() && ai.countExaltedBonus() > 0
&& dmgIfUnblocked - ai.countExaltedBonus() == 0) {
// Make sure we're not counting on the Exalted bonus when the AI is planning to attack with more than one creature
onlyIfExalted = true;
}
if (!onlyIfExalted || this.attackers.size() == 1 || this.aiAggression == 6 /* 6 is Exalted attack */) {
return true;
}
}
// Poison opponent if unblocked
if (ComputerUtilCombat.poisonIfUnblocked(attacker, opp) > 0) {
return true;
}
@@ -213,7 +247,7 @@ public class AiAttackController {
final CardCollectionView controlledByCompy = ai.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES);
for (final Card c : controlledByCompy) {
for (final Trigger trigger : c.getTriggers()) {
if (ComputerUtilCombat.combatTriggerWillTrigger(attacker, null, trigger, combat)) {
if (ComputerUtilCombat.combatTriggerWillTrigger(attacker, null, trigger, combat, this.attackers)) {
return true;
}
}
@@ -222,7 +256,7 @@ public class AiAttackController {
}
public final static List<Card> getPossibleBlockers(final List<Card> blockers, final List<Card> attackers) {
List<Card> possibleBlockers = new ArrayList<Card>(blockers);
List<Card> possibleBlockers = new ArrayList<>(blockers);
possibleBlockers = CardLists.filter(possibleBlockers, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
@@ -233,7 +267,7 @@ public class AiAttackController {
}
public final static boolean canBlockAnAttacker(final Card c, final List<Card> attackers, final boolean nextTurn) {
final List<Card> attackerList = new ArrayList<Card>(attackers);
final List<Card> attackerList = new ArrayList<>(attackers);
if (!c.isCreature()) {
return false;
}
@@ -246,7 +280,7 @@ public class AiAttackController {
}
public final static Card getCardCanBlockAnAttacker(final Card c, final List<Card> attackers, final boolean nextTurn) {
final List<Card> attackerList = new ArrayList<Card>(attackers);
final List<Card> attackerList = new ArrayList<>(attackers);
if (!c.isCreature()) {
return null;
}
@@ -261,9 +295,9 @@ public class AiAttackController {
// this checks to make sure that the computer player doesn't lose when the human player attacks
// this method is used by getAttackers()
public final List<Card> notNeededAsBlockers(final Player ai, final List<Card> attackers) {
final List<Card> notNeededAsBlockers = new ArrayList<Card>(attackers);
final List<Card> notNeededAsBlockers = new ArrayList<>(attackers);
int fixedBlockers = 0;
final List<Card> vigilantes = new ArrayList<Card>();
final List<Card> vigilantes = new ArrayList<>();
//check for time walks
if (ai.getGame().getPhaseHandler().getNextTurn().equals(ai)) {
return attackers;
@@ -302,7 +336,7 @@ public class AiAttackController {
}
}
List<Card> opponentsAttackers = new ArrayList<Card>(oppList);
List<Card> opponentsAttackers = new ArrayList<>(oppList);
opponentsAttackers = CardLists.filter(opponentsAttackers, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
@@ -431,7 +465,7 @@ public class AiAttackController {
final CardCollectionView beastions = ai.getCardsIn(ZoneType.Battlefield, "Beastmaster Ascension");
int minCreatures = 7;
for (final Card beastion : beastions) {
final int counters = beastion.getCounters(CounterType.QUEST);
final int counters = beastion.getCounters(CounterEnumType.QUEST);
minCreatures = Math.min(minCreatures, 7 - counters);
}
if (this.attackers.size() >= minCreatures) {
@@ -514,8 +548,7 @@ public class AiAttackController {
remainingAttackers.removeAll(unblockedAttackers);
for (Card blocker : this.blockers) {
if (blocker.hasKeyword("CARDNAME can block any number of creatures.")
|| blocker.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) {
if (blocker.canBlockAny()) {
for (Card attacker : this.attackers) {
if (CombatUtil.canBlock(attacker, blocker)) {
remainingAttackers.remove(attacker);
@@ -531,14 +564,19 @@ public class AiAttackController {
if (remainingAttackers.isEmpty() || maxBlockersAfterCrew == 0) {
break;
}
if (blocker.hasKeyword("CARDNAME can block an additional creature each combat.")) {
blockedAttackers.add(remainingAttackers.get(0));
remainingAttackers.remove(0);
maxBlockersAfterCrew--;
if (remainingAttackers.isEmpty()) {
break;
int numExtraBlocks = blocker.canBlockAdditional();
if (numExtraBlocks > 0) {
while (numExtraBlocks-- > 0 && !remainingAttackers.isEmpty()) {
blockedAttackers.add(remainingAttackers.get(0));
remainingAttackers.remove(0);
maxBlockersAfterCrew--;
}
}
if (remainingAttackers.isEmpty()) {
break;
}
blockedAttackers.add(remainingAttackers.get(0));
remainingAttackers.remove(0);
maxBlockersAfterCrew--;
@@ -647,7 +685,7 @@ public class AiAttackController {
// Determine who will be attacked
GameEntity defender = this.chooseDefender(combat, bAssault);
List<Card> attackersLeft = new ArrayList<Card>(this.attackers);
List<Card> attackersLeft = new ArrayList<>(this.attackers);
// TODO probably use AttackConstraints instead of only GlobalAttackRestrictions?
GlobalAttackRestrictions restrict = GlobalAttackRestrictions.getGlobalRestrictions(ai, combat.getDefenders());
@@ -787,12 +825,12 @@ public class AiAttackController {
int humanForcesForAttritionalAttack = 0;
// examine the potential forces
final List<Card> nextTurnAttackers = new ArrayList<Card>();
final List<Card> nextTurnAttackers = new ArrayList<>();
int candidateCounterAttackDamage = 0;
final Player opp = this.defendingOpponent;
// get the potential damage and strength of the AI forces
final List<Card> candidateAttackers = new ArrayList<Card>();
final List<Card> candidateAttackers = new ArrayList<>();
int candidateUnblockedDamage = 0;
for (final Card pCard : this.myList) {
// if the creature can attack then it's a potential attacker this
@@ -851,7 +889,7 @@ public class AiAttackController {
final int outNumber = computerForces - humanForces;
for (Card blocker : this.blockers) {
if (blocker.hasKeyword("CARDNAME can block any number of creatures.")) {
if (blocker.canBlockAny()) {
aiLifeToPlayerDamageRatio--;
}
}
@@ -874,7 +912,7 @@ public class AiAttackController {
// get player life total
int humanLife = opp.getLife();
// get the list of attackers up to the first blocked one
final List<Card> attritionalAttackers = new ArrayList<Card>();
final List<Card> attritionalAttackers = new ArrayList<>();
for (int x = 0; x < (this.attackers.size() - humanForces); x++) {
attritionalAttackers.add(this.attackers.get(x));
}
@@ -987,7 +1025,7 @@ public class AiAttackController {
} // stay at home to block
if ( LOG_AI_ATTACKS )
System.out.println(String.valueOf(this.aiAggression) + " = ai aggression");
System.out.println(this.aiAggression + " = ai aggression");
// ****************
// Evaluation the end
@@ -1028,7 +1066,7 @@ public class AiAttackController {
}
}
// if enough damage: switch to next planeswalker or player
if (damage >= pw.getCounters(CounterType.LOYALTY)) {
if (damage >= pw.getCounters(CounterEnumType.LOYALTY)) {
List<Card> pwDefending = combat.getDefendingPlaneswalkers();
boolean found = false;
// look for next planeswalker
@@ -1098,7 +1136,6 @@ public class AiAttackController {
// TODO Somehow subtract expected damage of other attacking creatures from enemy life total (how? other attackers not yet declared? Can the AI guesstimate which of their creatures will not get blocked?)
if (attacker.getCurrentPower() * Integer.parseInt(attacker.getSVar("NonCombatPriority")) < ai.getOpponentsSmallestLifeTotal()) {
// Check if the card actually has an ability the AI can and wants to play, if not, attacking is fine!
boolean wantability = false;
for (SpellAbility sa : attacker.getSpellAbilities()) {
// Do not attack if we can afford using the ability.
if (sa.isAbility()) {
@@ -1119,8 +1156,21 @@ public class AiAttackController {
// is there a gain in attacking even when the blocker is not killed (Lifelink, Wither,...)
boolean hasCombatEffect = attacker.getSVar("HasCombatEffect").equals("TRUE")
|| "Blocked".equals(attacker.getSVar("HasAttackEffect"));
// contains only the defender's blockers that can actually block the attacker
CardCollection validBlockers = CardLists.filter(defenders, new Predicate<Card>() {
@Override
public boolean apply(Card defender) {
return CombatUtil.canBlock(attacker, defender);
}
});
// used to check that CanKillAllDangerous check makes sense in context where creatures with dangerous abilities are present
boolean dangerousBlockersPresent = !CardLists.filter(validBlockers, Predicates.or(
CardPredicates.hasKeyword(Keyword.WITHER), CardPredicates.hasKeyword(Keyword.INFECT),
CardPredicates.hasKeyword(Keyword.LIFELINK))).isEmpty();
// total power of the defending creatures, used in predicting whether a gang block can kill the attacker
int defPower = CardLists.getTotalPower(defenders, true);
int defPower = CardLists.getTotalPower(validBlockers, true);
if (!hasCombatEffect) {
for (KeywordInterface inst : attacker.getKeywords()) {
@@ -1137,13 +1187,12 @@ public class AiAttackController {
// number of factors about the attacking
// context that will be relevant to the attackers decision according to
// the selected strategy
for (final Card defender : defenders) {
for (final Card defender : validBlockers) {
// if both isWorthLessThanAllKillers and canKillAllDangerous are false there's nothing more to check
if ((isWorthLessThanAllKillers || canKillAllDangerous || numberOfPossibleBlockers < 2)
&& CombatUtil.canBlock(attacker, defender)) {
if (isWorthLessThanAllKillers || canKillAllDangerous || numberOfPossibleBlockers < 2) {
numberOfPossibleBlockers += 1;
if (isWorthLessThanAllKillers && ComputerUtilCombat.canDestroyAttacker(ai, attacker, defender, combat, false)
&& !(attacker.hasKeyword(Keyword.UNDYING) && attacker.getCounters(CounterType.P1P1) == 0)) {
&& !(attacker.hasKeyword(Keyword.UNDYING) && attacker.getCounters(CounterEnumType.P1P1) == 0)) {
canBeKilledByOne = true; // there is a single creature on the battlefield that can kill the creature
// see if the defending creature is of higher or lower
// value. We don't want to attack only to lose value
@@ -1178,7 +1227,7 @@ public class AiAttackController {
// - our creature will die for sure (chump attack)
// - our attack will not do anything special (no attack/combat effect to proc)
// - we can't deal damage to our opponent with sheer number of attackers and/or our attacker's power is 0 or less
if (attackerWillDie || (avoidAttackingIntoBlock && (uselessAttack || noContributionToAttack))) {
if (attackerWillDie || (avoidAttackingIntoBlock && uselessAttack && noContributionToAttack)) {
canKillAllDangerous = false;
}
}
@@ -1227,8 +1276,9 @@ public class AiAttackController {
if (LOG_AI_ATTACKS)
System.out.println(attacker.getName() + " = all out attacking");
return true;
case 4: // expecting to at least trade with something
if (canKillAll || (canKillAllDangerous && !canBeKilledByOne) || !canBeBlocked) {
case 4: // expecting to at least trade with something, or can attack "for free", expecting no counterattack
if (canKillAll || (dangerousBlockersPresent && canKillAllDangerous && !canBeKilledByOne) || !canBeBlocked
|| (defPower == 0 && !ComputerUtilCombat.lifeInDanger(ai, combat))) {
if (LOG_AI_ATTACKS)
System.out.println(attacker.getName() + " = attacking expecting to at least trade with something");
return true;
@@ -1236,7 +1286,7 @@ public class AiAttackController {
break;
case 3: // expecting to at least kill a creature of equal value or not be blocked
if ((canKillAll && isWorthLessThanAllKillers)
|| ((canKillAllDangerous || hasAttackEffect || hasCombatEffect) && !canBeKilledByOne)
|| (((dangerousBlockersPresent && canKillAllDangerous) || hasAttackEffect || hasCombatEffect) && !canBeKilledByOne)
|| !canBeBlocked) {
if (LOG_AI_ATTACKS)
System.out.println(attacker.getName() + " = attacking expecting to kill creature or cause damage, or is unblockable");
@@ -1245,7 +1295,7 @@ public class AiAttackController {
break;
case 2: // attack expecting to attract a group block or destroying a single blocker and surviving
if (!canBeBlocked || ((canKillAll || hasAttackEffect || hasCombatEffect) && !canBeKilledByOne &&
(canKillAllDangerous || !canBeKilled))) {
((dangerousBlockersPresent && canKillAllDangerous) || !canBeKilled))) {
if (LOG_AI_ATTACKS)
System.out.println(attacker.getName() + " = attacking expecting to survive or attract group block");
return true;
@@ -1315,21 +1365,12 @@ public class AiAttackController {
if (c.hasSVar("AIExertCondition")) {
if (!c.getSVar("AIExertCondition").isEmpty()) {
final String needsToExert = c.getSVar("AIExertCondition");
int x = 0;
int y = 0;
String sVar = needsToExert.split(" ")[0];
String comparator = needsToExert.split(" ")[1];
String compareTo = comparator.substring(2);
try {
x = Integer.parseInt(sVar);
} catch (final NumberFormatException e) {
x = CardFactoryUtil.xCount(c, c.getSVar(sVar));
}
try {
y = Integer.parseInt(compareTo);
} catch (final NumberFormatException e) {
y = CardFactoryUtil.xCount(c, c.getSVar(compareTo));
}
int x = AbilityUtils.calculateAmount(c, sVar, null);
int y = AbilityUtils.calculateAmount(c, compareTo, null);
if (Expressions.compare(x, comparator, y)) {
shouldExert = true;
}
@@ -1410,7 +1451,7 @@ public class AiAttackController {
if (artifact != null) {
return artifact;
}
return null; //should never get here
return null;//should never get here
}
private void doLightmineFieldAttackLogic(List<Card> attackersLeft, int numForcedAttackers, boolean playAggro) {

View File

@@ -22,7 +22,6 @@ import com.google.common.base.Predicates;
import forge.card.CardStateName;
import forge.game.CardTraitBase;
import forge.game.GameEntity;
import forge.game.GlobalRuleChange;
import forge.game.card.*;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
@@ -148,9 +147,7 @@ public class AiBlockController {
final CardCollection attackers = combat.getAttackersOf(defender);
// Begin with the attackers that pose the biggest threat
CardLists.sortByPowerDesc(attackers);
for (final Card c : attackers) {
sortedAttackers.add(c);
}
sortedAttackers.addAll(attackers);
} else if (defender instanceof Player && defender.equals(ai)) {
firstAttacker = combat.getAttackersOf(defender);
}
@@ -163,9 +160,7 @@ public class AiBlockController {
}
} else {
// add creatures attacking the Player to the back of the list
for (final Card c : firstAttacker) {
sortedAttackers.add(c);
}
sortedAttackers.addAll(firstAttacker);
}
return sortedAttackers;
}
@@ -233,9 +228,9 @@ public class AiBlockController {
// 3.Blockers that can destroy the attacker and have an upside when dying
killingBlockers = getKillingBlockers(combat, attacker, blockers);
for (Card b : killingBlockers) {
if ((b.hasKeyword(Keyword.UNDYING) && b.getCounters(CounterType.P1P1) == 0) || b.hasSVar("SacMe")
|| (b.hasKeyword(Keyword.VANISHING) && b.getCounters(CounterType.TIME) == 1)
|| (b.hasKeyword(Keyword.FADING) && b.getCounters(CounterType.FADE) == 0)
if ((b.hasKeyword(Keyword.UNDYING) && b.getCounters(CounterEnumType.P1P1) == 0) || b.hasSVar("SacMe")
|| (b.hasKeyword(Keyword.VANISHING) && b.getCounters(CounterEnumType.TIME) == 1)
|| (b.hasKeyword(Keyword.FADING) && b.getCounters(CounterEnumType.FADE) == 0)
|| b.hasSVar("EndOfTurnLeavePlay")) {
blocker = b;
break;
@@ -304,8 +299,8 @@ public class AiBlockController {
final List<Card> blockers = getPossibleBlockers(combat, attacker, blockersLeft, true);
for (Card b : blockers) {
if ((b.hasKeyword(Keyword.VANISHING) && b.getCounters(CounterType.TIME) == 1)
|| (b.hasKeyword(Keyword.FADING) && b.getCounters(CounterType.FADE) == 0)
if ((b.hasKeyword(Keyword.VANISHING) && b.getCounters(CounterEnumType.TIME) == 1)
|| (b.hasKeyword(Keyword.FADING) && b.getCounters(CounterEnumType.FADE) == 0)
|| b.hasSVar("EndOfTurnLeavePlay")) {
blocker = b;
if (!ComputerUtilCombat.canDestroyAttacker(ai, attacker, blocker, combat, false)) {
@@ -481,8 +476,7 @@ public class AiBlockController {
final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker)
+ ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, secondBlocker, combat, false);
List<Card> usableBlockersAsThird = new ArrayList<>();
usableBlockersAsThird.addAll(usableBlockers);
List<Card> usableBlockersAsThird = new ArrayList<>(usableBlockers);
usableBlockersAsThird.remove(secondBlocker);
// loop over the remaining blockers in search of a good third blocker candidate
@@ -773,14 +767,12 @@ public class AiBlockController {
blockers.removeAll(combat.getBlockers(attacker));
// Don't add any blockers that won't kill the attacker because the damage would be prevented by a static effect
if (!ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) {
blockers = CardLists.filter(blockers, new Predicate<Card>() {
@Override
public boolean apply(Card blocker) {
return !ComputerUtilCombat.isCombatDamagePrevented(blocker, attacker, blocker.getNetCombatDamage());
}
});
}
blockers = CardLists.filter(blockers, new Predicate<Card>() {
@Override
public boolean apply(Card blocker) {
return !ComputerUtilCombat.isCombatDamagePrevented(blocker, attacker, blocker.getNetCombatDamage());
}
});
// Try to use safe blockers first
if (blockers.size() > 0) {
@@ -859,7 +851,7 @@ public class AiBlockController {
damageToPW += ComputerUtilCombat.predictDamageTo((Card) def, pwatkr.getNetCombatDamage(), pwatkr, true);
}
}
if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= ((Card) def).getCounters(CounterType.LOYALTY)) {
if ((!onlyIfLethal && damageToPW > 0) || damageToPW >= def.getCounters(CounterEnumType.LOYALTY)) {
threatenedPWs.add((Card) def);
}
}
@@ -879,7 +871,7 @@ public class AiBlockController {
if (!chumpPWDefenders.isEmpty()) {
for (final Card attacker : attackers) {
GameEntity def = combat.getDefenderByAttacker(attacker);
if (def instanceof Card && threatenedPWs.contains((Card) def)) {
if (def instanceof Card && threatenedPWs.contains(def)) {
if (attacker.hasKeyword(Keyword.TRAMPLE)) {
// don't bother trying to chump a trampling creature
continue;
@@ -914,10 +906,10 @@ public class AiBlockController {
pwDefenders.addAll(combat.getBlockers(pwAtk));
} else {
isFullyBlocked = false;
damageToPW += ComputerUtilCombat.predictDamageTo((Card) pw, pwAtk.getNetCombatDamage(), pwAtk, true);
damageToPW += ComputerUtilCombat.predictDamageTo(pw, pwAtk.getNetCombatDamage(), pwAtk, true);
}
}
if (!isFullyBlocked && damageToPW >= pw.getCounters(CounterType.LOYALTY)) {
if (!isFullyBlocked && damageToPW >= pw.getCounters(CounterEnumType.LOYALTY)) {
for (Card chump : pwDefenders) {
if (chosenChumpBlockers.contains(chump)) {
combat.removeFromCombat(chump);
@@ -1289,7 +1281,8 @@ public class AiBlockController {
oppCreatureCount = ComputerUtil.countUsefulCreatures(attackersLeft.get(0).getController());
}
if (attacker.getOwner().equals(ai) && "6".equals(attacker.getSVar("SacMe"))) {
if (attacker != null && attacker.getOwner() != null)
if (attacker.getOwner().equals(ai) && "6".equals(attacker.getSVar("SacMe"))) {
// Temporarily controlled object - don't trade with it
// TODO: find a more reliable way to figure out that control will be reestablished next turn
return false;
@@ -1329,13 +1322,9 @@ public class AiBlockController {
&& ((Card) combat.getDefenderByAttacker(attacker)).isPlaneswalker();
boolean wantToTradeDownToSavePW = chanceToTradeDownToSaveWalker > 0;
if (((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped.
return ((evalBlk <= evalAtk + 1) || (wantToSavePlaneswalker && wantToTradeDownToSavePW)) // "1" accounts for tapped.
&& powerParityOrHigher
&& (creatureParityOrAllowedDiff || wantToTradeWithCreatInHand)
&& (MyRandom.percentTrue(chance) || wantToSavePlaneswalker)) {
return true;
}
return false;
&& (MyRandom.percentTrue(chance) || wantToSavePlaneswalker);
}
}

View File

@@ -137,7 +137,7 @@ public class AiCardMemory {
Set<Card> memorySet = getMemorySet(set);
return memorySet == null ? false : memorySet.contains(c);
return memorySet != null && memorySet.contains(c);
}
/**
@@ -150,12 +150,15 @@ public class AiCardMemory {
*/
public boolean isRememberedCardByName(String cardName, MemorySet set) {
Set<Card> memorySet = getMemorySet(set);
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName)) {
return true;
if (memorySet != null) {
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName)) {
return true;
}
}
}
@@ -174,12 +177,15 @@ public class AiCardMemory {
*/
public boolean isRememberedCardByName(String cardName, MemorySet set, Player owner) {
Set<Card> memorySet = getMemorySet(set);
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName) && c.getOwner().equals(owner)) {
return true;
if (memorySet != null) {
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName) && c.getOwner().equals(owner)) {
return true;
}
}
}
@@ -197,7 +203,12 @@ public class AiCardMemory {
if (c == null)
return false;
getMemorySet(set).add(c);
Set<Card> memorySet = getMemorySet(set);
if (memorySet != null) {
memorySet.add(c);
}
return true;
}
@@ -216,7 +227,12 @@ public class AiCardMemory {
return false;
}
getMemorySet(set).remove(c);
Set<Card> memorySet = getMemorySet(set);
if (memorySet != null) {
memorySet.remove(c);
}
return true;
}
@@ -229,12 +245,15 @@ public class AiCardMemory {
*/
public boolean forgetAnyCardWithName(String cardName, MemorySet set) {
Set<Card> memorySet = getMemorySet(set);
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName)) {
return forgetCard(c, set);
if (memorySet != null) {
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName)) {
return forgetCard(c, set);
}
}
}
@@ -251,15 +270,18 @@ public class AiCardMemory {
*/
public boolean forgetAnyCardWithName(String cardName, MemorySet set, Player owner) {
Set<Card> memorySet = getMemorySet(set);
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName) && c.getOwner().equals(owner)) {
return forgetCard(c, set);
if (memorySet != null) {
Iterator<Card> it = memorySet.iterator();
while (it.hasNext()) {
Card c = it.next();
if (c.getName().equals(cardName) && c.getOwner().equals(owner)) {
return forgetCard(c, set);
}
}
}
return false;
}
@@ -269,14 +291,16 @@ public class AiCardMemory {
* @return true, if the given memory set contains no remembered cards.
*/
public boolean isMemorySetEmpty(MemorySet set) {
return getMemorySet(set).isEmpty();
return set == null || getMemorySet(set).isEmpty();
}
/**
* Clears the given memory set.
*/
public void clearMemorySet(MemorySet set) {
getMemorySet(set).clear();
if (set != null) {
getMemorySet(set).clear();
}
}
/**

View File

@@ -18,12 +18,10 @@
package forge.ai;
import com.esotericsoftware.minlog.Log;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.ai.ability.ChangeZoneAi;
import forge.ai.ability.ExploreAi;
import forge.ai.simulation.SpellAbilityPicker;
@@ -50,6 +48,7 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.replacement.ReplaceMoved;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.*;
import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
@@ -60,6 +59,7 @@ import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.Expressions;
import forge.util.MyRandom;
import forge.util.ComparatorUtil;
import forge.util.collect.FCollectionView;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
@@ -177,7 +177,7 @@ public class AiController {
&& CardFactoryUtil.isCounterable(host)) {
return true;
} else if ("ChaliceOfTheVoid".equals(curse) && sa.isSpell() && CardFactoryUtil.isCounterable(host)
&& host.getCMC() == c.getCounters(CounterType.CHARGE)) {
&& host.getCMC() == c.getCounters(CounterEnumType.CHARGE)) {
return true;
} else if ("BazaarOfWonders".equals(curse) && sa.isSpell() && CardFactoryUtil.isCounterable(host)) {
String hostName = host.getName();
@@ -610,7 +610,15 @@ public class AiController {
ComputerUtilAbility.getAvailableCards(game, player);
List<SpellAbility> all = ComputerUtilAbility.getSpellAbilities(cards, player);
Collections.sort(all, saComparator); // put best spells first
try {
Collections.sort(all, saComparator); // put best spells first
}
catch (IllegalArgumentException ex) {
System.err.println(ex.getMessage());
String assertex = ComparatorUtil.verifyTransitivity(saComparator, all);
Sentry.capture(ex.getMessage() + "\nAssertionError [verifyTransitivity]: " + assertex);
}
for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) {
ApiType saApi = sa.getApi();
@@ -657,10 +665,10 @@ public class AiController {
return false;
}
AiCardMemory.MemorySet memSet;
AiCardMemory.MemorySet memSet = null;
if (phaseType == null && forNextSpell) {
memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL;
} else {
} else if (phaseType != null) {
switch (phaseType) {
case MAIN2:
memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2;
@@ -761,7 +769,7 @@ public class AiController {
return AiPlayDecision.CantPlayAi;
}
}
else if (sa.getPayCosts() != null){
else {
Cost payCosts = sa.getPayCosts();
ManaCost mana = payCosts.getTotalMana();
if (mana != null) {
@@ -850,7 +858,7 @@ public class AiController {
int neededMana = 0;
boolean dangerousRecurringCost = false;
Cost costWithBuyback = sa.getPayCosts() != null ? sa.getPayCosts().copy() : Cost.Zero;
Cost costWithBuyback = sa.getPayCosts().copy();
for (OptionalCostValue opt : GameActionUtil.getOptionalCostValues(sa)) {
if (opt.getType() == OptionalCost.Buyback) {
costWithBuyback.add(opt.getCost());
@@ -899,8 +907,8 @@ public class AiController {
public int compare(final SpellAbility a, final SpellAbility b) {
// sort from highest cost to lowest
// we want the highest costs first
int a1 = a.getPayCosts() == null ? 0 : a.getPayCosts().getTotalMana().getCMC();
int b1 = b.getPayCosts() == null ? 0 : b.getPayCosts().getTotalMana().getCMC();
int a1 = a.getPayCosts().getTotalMana().getCMC();
int b1 = b.getPayCosts().getTotalMana().getCMC();
// deprioritize SAs explicitly marked as preferred to be activated last compared to all other SAs
if (a.hasParam("AIActivateLast") && !b.hasParam("AIActivateLast")) {
@@ -919,12 +927,12 @@ public class AiController {
// deprioritize pump spells with pure energy cost (can be activated last,
// since energy is generally scarce, plus can benefit e.g. Electrostatic Pummeler)
int a2 = 0, b2 = 0;
if (a.getApi() == ApiType.Pump && a.getPayCosts() != null && a.getPayCosts().getCostEnergy() != null) {
if (a.getApi() == ApiType.Pump && a.getPayCosts().getCostEnergy() != null) {
if (a.getPayCosts().hasOnlySpecificCostType(CostPayEnergy.class)) {
a2 = a.getPayCosts().getCostEnergy().convertAmount();
}
}
if (b.getApi() == ApiType.Pump && b.getPayCosts() != null && b.getPayCosts().getCostEnergy() != null) {
if (b.getApi() == ApiType.Pump && b.getPayCosts().getCostEnergy() != null) {
if (b.getPayCosts().hasOnlySpecificCostType(CostPayEnergy.class)) {
b2 = b.getPayCosts().getCostEnergy().convertAmount();
}
@@ -948,8 +956,7 @@ public class AiController {
return 1;
}
if (a.getHostCard().equals(b.getHostCard()) && a.getApi() == b.getApi()
&& a.getPayCosts() != null && b.getPayCosts() != null) {
if (a.getHostCard().equals(b.getHostCard()) && a.getApi() == b.getApi()) {
// Cheaper Spectacle costs should be preferred
// FIXME: Any better way to identify that these are the same ability, one with Spectacle and one not?
// (looks like it's not a full-fledged alternative cost as such, and is not processed with other alt costs)
@@ -1012,7 +1019,7 @@ public class AiController {
p += 9;
}
// sort planeswalker abilities with most costly first
if (sa.getRestrictions().isPwAbility()) {
if (sa.isPwAbility()) {
final CostPart cost = sa.getPayCosts().getCostParts().get(0);
if (cost instanceof CostRemoveCounter) {
p += cost.convertAmount() == null ? 1 : cost.convertAmount();
@@ -1044,9 +1051,10 @@ public class AiController {
}
public CardCollection getCardsToDiscard(final int numDiscard, final String[] uTypes, final SpellAbility sa, final CardCollectionView exclude) {
boolean noFiltering = (sa != null) && "DiscardCMCX".equals(sa.getParam("AILogic")); // list AI logic for which filtering is taken care of elsewhere
CardCollection hand = new CardCollection(player.getCardsIn(ZoneType.Hand));
hand.removeAll(exclude);
if ((uTypes != null) && (sa != null)) {
if ((uTypes != null) && (sa != null) && !noFiltering) {
hand = CardLists.getValidCards(hand, uTypes, sa.getActivatingPlayer(), sa.getHostCard(), sa);
}
return getCardsToDiscard(numDiscard, numDiscard, hand, sa);
@@ -1066,6 +1074,14 @@ public class AiController {
min = 1;
} else if ("VolrathsShapeshifter".equals(sa.getParam("AILogic"))) {
return SpecialCardAi.VolrathsShapeshifter.targetBestCreature(player, sa);
} else if ("DiscardCMCX".equals(sa.getParam("AILogic"))) {
final int CMC = Integer.parseInt(sourceCard.getSVar("PayX"));
CardCollection discards = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.hasCMC(CMC));
if (discards.isEmpty()) {
return null;
} else {
return new CardCollection(ComputerUtilCard.getWorstAI(discards));
}
}
if (sa.hasParam("AnyNumber")) {
@@ -1211,7 +1227,7 @@ public class AiController {
public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) {
ApiType api = sa.getApi();
// Abilities without api may also use this routine, However they should provide a unique mode value
// Abilities without api may also use this routine, However they should provide a unique mode value ?? How could this work?
if (api == null) {
String exMsg = String.format("AI confirmAction does not know what to decide about %s mode (api is null).",
mode);
@@ -1462,7 +1478,7 @@ public class AiController {
}
for (SpellAbility sa : card.getSpellAbilities()) {
if (sa.getPayCosts() != null && sa.isAbility()
if (sa.isAbility()
&& sa.getPayCosts().getCostMana() != null
&& sa.getPayCosts().getCostMana().getMana().getCMC() > 0
&& (!sa.getPayCosts().hasTapCost() || !isTapLand)
@@ -1564,8 +1580,15 @@ public class AiController {
if (all == null || all.isEmpty())
return null;
Collections.sort(all, saComparator); // put best spells first
try {
Collections.sort(all, saComparator); // put best spells first
}
catch (IllegalArgumentException ex) {
System.err.println(ex.getMessage());
String assertex = ComparatorUtil.verifyTransitivity(saComparator, all);
Sentry.capture(ex.getMessage() + "\nAssertionError [verifyTransitivity]: " + assertex);
}
for (final SpellAbility sa : ComputerUtilAbility.getOriginalAndAltCostAbilities(all, player)) {
// Don't add Counterspells to the "normal" playcard lookups
if (skipCounter && sa.getApi() == ApiType.Counter) {
@@ -1638,7 +1661,6 @@ public class AiController {
// For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about
return true;
}
return false;
}
@@ -1654,14 +1676,14 @@ public class AiController {
hostCard = game.getCardState(hostCard);
}
if (effect.getMapParams().containsKey("AICheckSVar")) {
if (effect.hasParam("AICheckSVar")) {
System.out.println("aiShouldRun?" + sa);
final String svarToCheck = effect.getMapParams().get("AICheckSVar");
final String svarToCheck = effect.getParam("AICheckSVar");
String comparator = "GE";
int compareTo = 1;
if (effect.getMapParams().containsKey("AISVarCompare")) {
final String fullCmp = effect.getMapParams().get("AISVarCompare");
if (effect.hasParam("AISVarCompare")) {
final String fullCmp = effect.getParam("AISVarCompare");
comparator = fullCmp.substring(0, 2);
final String strCmpTo = fullCmp.substring(2);
try {
@@ -1683,16 +1705,11 @@ public class AiController {
left = AbilityUtils.calculateAmount(hostCard, svarToCheck, sa);
}
System.out.println("aiShouldRun?" + left + comparator + compareTo);
if (Expressions.compare(left, comparator, compareTo)) {
return true;
}
} else if (effect.getMapParams().containsKey("AICheckDredge")) {
return Expressions.compare(left, comparator, compareTo);
} else if (effect.hasParam("AICheckDredge")) {
return player.getCardsIn(ZoneType.Library).size() > 8 || player.isCardInPlay("Laboratory Maniac");
} else if (sa != null && doTrigger(sa, false)) {
return true;
}
} else return sa != null && doTrigger(sa, false);
return false;
}
public List<SpellAbility> chooseSaToActivateFromOpeningHand(List<SpellAbility> usableFromOpeningHand) {
@@ -1771,7 +1788,7 @@ public class AiController {
+ MyRandom.getRandom().nextInt(3);
return Math.max(remaining, min) / 2;
} else if ("LowestLoseLife".equals(logic)) {
return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, ComputerUtil.getOpponentFor(player).getLife())) + 1;
return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1;
} else if ("HighestGetCounter".equals(logic)) {
return MyRandom.getRandom().nextInt(3);
} else if (source.hasSVar("EnergyToPay")) {
@@ -1784,76 +1801,7 @@ public class AiController {
throw new UnsupportedOperationException("AI is not supposed to reach this code at the moment");
}
public Map<GameEntity, CounterType> chooseProliferation(final SpellAbility sa) {
final Map<GameEntity, CounterType> result = Maps.newHashMap();
final List<Player> allies = player.getAllies();
allies.add(player);
final List<Player> enemies = player.getOpponents();
final Function<Card, CounterType> predProliferate = new Function<Card, CounterType>() {
@Override
public CounterType apply(Card crd) {
//fast way out, no need to check other stuff
if (!crd.hasCounters()) {
return null;
}
// cards controlled by ai or ally with Vanishing or Fading
// and exaclty one counter of the specifice type gets high priority to keep the card
if (allies.contains(crd.getController())) {
// except if its a Chronozoa, because it WANTS to be removed to make more
if (crd.hasKeyword(Keyword.VANISHING) && !"Chronozoa".equals(crd.getName())) {
if (crd.getCounters(CounterType.TIME) == 1) {
return CounterType.TIME;
}
} else if (crd.hasKeyword(Keyword.FADING)) {
if (crd.getCounters(CounterType.FADE) == 1) {
return CounterType.FADE;
}
}
}
for (final Entry<CounterType, Integer> c1 : crd.getCounters().entrySet()) {
// if card can not recive the given counter, try another one
if (!crd.canReceiveCounters(c1.getKey())) {
continue;
}
if (ComputerUtil.isNegativeCounter(c1.getKey(), crd) && enemies.contains(crd.getController())) {
return c1.getKey();
}
if (!ComputerUtil.isNegativeCounter(c1.getKey(), crd) && allies.contains(crd.getController())) {
return c1.getKey();
}
}
return null;
}
};
for (Card c : game.getCardsIn(ZoneType.Battlefield)) {
CounterType ct = predProliferate.apply(c);
if (ct != null)
result.put(c, ct);
}
for (Player e : enemies) {
// TODO In the future check of enemies can get poison counters and give them some other bad counter type
if (e.getCounters(CounterType.POISON) > 0) {
result.put(e, CounterType.POISON);
}
}
for (Player pl : allies) {
if (pl.getCounters(CounterType.EXPERIENCE) > 0) {
result.put(pl, CounterType.EXPERIENCE);
} else if (pl.getCounters(CounterType.ENERGY) > 0) {
result.put(pl, CounterType.ENERGY);
}
}
return result;
}
public CardCollection chooseCardsForEffect(CardCollectionView pool, SpellAbility sa, int min, int max, boolean isOptional) {
public CardCollection chooseCardsForEffect(CardCollectionView pool, SpellAbility sa, int min, int max, boolean isOptional, Map<String, Object> params) {
if (sa == null || sa.getApi() == null) {
throw new UnsupportedOperationException();
}
@@ -1886,7 +1834,7 @@ public class AiController {
default:
CardCollection editablePool = new CardCollection(pool);
for (int i = 0; i < max; i++) {
Card c = player.getController().chooseSingleEntityForEffect(editablePool, sa, null, isOptional);
Card c = player.getController().chooseSingleEntityForEffect(editablePool, sa, null, isOptional, params);
if (c != null) {
result.add(c);
editablePool.remove(c);
@@ -1897,7 +1845,7 @@ public class AiController {
// Special case for Bow to My Command which simulates a complex tap cost via ChooseCard
// TODO: consider enhancing support for tapXType<Any/...> in UnlessCost to get rid of this hack
if ("BowToMyCommand".equals(sa.getParam("AILogic"))) {
if (!sa.getHostCard().getZone().is(ZoneType.Command)) {
if (!sa.getHostCard().isInZone(ZoneType.Command)) {
// Make sure that other opponents do not tap for an already abandoned scheme
result.clear();
break;
@@ -2037,6 +1985,35 @@ public class AiController {
return MyRandom.getRandom().nextBoolean();
}
public boolean chooseEvenOdd(SpellAbility sa) {
String aiLogic = sa.getParamOrDefault("AILogic", "");
if (aiLogic.equals("AlwaysEven")) {
return false; // false is Even
} else if (aiLogic.equals("AlwaysOdd")) {
return true; // true is Odd
} else if (aiLogic.equals("Random")) {
return MyRandom.getRandom().nextBoolean();
} else if (aiLogic.equals("CMCInHand")) {
CardCollectionView hand = sa.getActivatingPlayer().getCardsIn(ZoneType.Hand);
int numEven = CardLists.filter(hand, CardPredicates.evenCMC()).size();
int numOdd = CardLists.filter(hand, CardPredicates.oddCMC()).size();
return numOdd > numEven;
} else if (aiLogic.equals("CMCOppControls")) {
CardCollectionView hand = sa.getActivatingPlayer().getOpponents().getCardsIn(ZoneType.Battlefield);
int numEven = CardLists.filter(hand, CardPredicates.evenCMC()).size();
int numOdd = CardLists.filter(hand, CardPredicates.oddCMC()).size();
return numOdd > numEven;
} else if (aiLogic.equals("CMCOppControlsByPower")) {
// TODO: improve this to check for how dangerous those creatures actually are relative to host card
CardCollectionView hand = sa.getActivatingPlayer().getOpponents().getCardsIn(ZoneType.Battlefield);
int powerEven = Aggregates.sum(CardLists.filter(hand, CardPredicates.evenCMC()), Accessors.fnGetNetPower);
int powerOdd = Aggregates.sum(CardLists.filter(hand, CardPredicates.oddCMC()), Accessors.fnGetNetPower);
return powerOdd > powerEven;
}
return MyRandom.getRandom().nextBoolean(); // outside of any specific logic, choose randomly
}
public Card chooseCardToHiddenOriginChangeZone(ZoneType destination, List<ZoneType> origin, SpellAbility sa,
CardCollection fetchList, Player player2, Player decider) {
if (useSimulation) {
@@ -2140,50 +2117,47 @@ public class AiController {
// AI-specific restrictions specified as activation parameters in spell abilities
if (sa.hasParam("AILifeThreshold")) {
if (player.getLife() <= Integer.parseInt(sa.getParam("AILifeThreshold"))) {
return false;
}
return player.getLife() > Integer.parseInt(sa.getParam("AILifeThreshold"));
}
return true;
}
public ReplacementEffect chooseSingleReplacementEffect(List<ReplacementEffect> list,
Map<String, Object> runParams) {
public ReplacementEffect chooseSingleReplacementEffect(List<ReplacementEffect> list) {
// no need to choose anything
if (list.size() <= 1) {
return Iterables.getFirst(list, null);
}
if (runParams.containsKey("Event")) {
// replace lifegain effects
if ("GainLife".equals(runParams.get("Event"))) {
List<ReplacementEffect> noGain = filterListByAiLogic(list, "NoLife");
List<ReplacementEffect> loseLife = filterListByAiLogic(list, "LoseLife");
List<ReplacementEffect> doubleLife = filterListByAiLogic(list, "DoubleLife");
List<ReplacementEffect> lichDraw = filterListByAiLogic(list, "LichDraw");
ReplacementType mode = Iterables.getFirst(list, null).getMode();
if (!noGain.isEmpty()) {
// no lifegain is better than lose life
return Iterables.getFirst(noGain, null);
} else if (!loseLife.isEmpty()) {
// lose life before double life to prevent lose double
return Iterables.getFirst(loseLife, null);
} else if (!lichDraw.isEmpty()) {
// lich draw before double life to prevent to draw to much
return Iterables.getFirst(lichDraw, null);
} else if (!doubleLife.isEmpty()) {
// other than that, do double life
return Iterables.getFirst(doubleLife, null);
}
} else if ("DamageDone".equals(runParams.get("Event"))) {
List<ReplacementEffect> prevention = filterList(list, CardTraitPredicates.hasParam("Prevention"));
// replace lifegain effects
if (mode.equals(ReplacementType.GainLife)) {
List<ReplacementEffect> noGain = filterListByAiLogic(list, "NoLife");
List<ReplacementEffect> loseLife = filterListByAiLogic(list, "LoseLife");
List<ReplacementEffect> doubleLife = filterListByAiLogic(list, "DoubleLife");
List<ReplacementEffect> lichDraw = filterListByAiLogic(list, "LichDraw");
// TODO when Protection is done as ReplacementEffect do them
// before normal prevention
if (!prevention.isEmpty()) {
return Iterables.getFirst(prevention, null);
}
if (!noGain.isEmpty()) {
// no lifegain is better than lose life
return Iterables.getFirst(noGain, null);
} else if (!loseLife.isEmpty()) {
// lose life before double life to prevent lose double
return Iterables.getFirst(loseLife, null);
} else if (!lichDraw.isEmpty()) {
// lich draw before double life to prevent to draw to much
return Iterables.getFirst(lichDraw, null);
} else if (!doubleLife.isEmpty()) {
// other than that, do double life
return Iterables.getFirst(doubleLife, null);
}
} else if (mode.equals(ReplacementType.DamageDone)) {
List<ReplacementEffect> prevention = filterList(list, CardTraitPredicates.hasParam("Prevention"));
// TODO when Protection is done as ReplacementEffect do them
// before normal prevention
if (!prevention.isEmpty()) {
return Iterables.getFirst(prevention, null);
}
}

View File

@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import forge.card.CardType;
@@ -16,12 +17,14 @@ import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.cost.*;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
@@ -56,7 +59,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override
public PaymentDecision visit(CostChooseCreatureType cost) {
String choice = player.getController().chooseSomeType("Creature", ability, CardType.getAllCreatureTypes(),
Lists.<String>newArrayList());
Lists.newArrayList());
return PaymentDecision.type(choice);
}
@@ -104,6 +107,24 @@ public class AiCostDecision extends CostDecisionMakerBase {
}
return PaymentDecision.card(randomSubset);
}
else if (type.equals("DifferentNames")) {
CardCollection differentNames = new CardCollection();
CardCollection discardMe = CardLists.filter(hand, CardPredicates.hasSVar("DiscardMe"));
while (c > 0) {
Card chosen;
if (!discardMe.isEmpty()) {
chosen = Aggregates.random(discardMe);
discardMe = CardLists.filter(discardMe, Predicates.not(CardPredicates.sharesNameWith(chosen)));
} else {
final Card worst = ComputerUtilCard.getWorstAI(hand);
chosen = worst != null ? worst : Aggregates.random(hand);
}
differentNames.add(chosen);
hand = CardLists.filter(hand, Predicates.not(CardPredicates.sharesNameWith(chosen)));
c--;
}
return PaymentDecision.card(differentNames);
}
else {
final AiController aic = ((PlayerControllerAi)player.getController()).getAi();
@@ -329,7 +350,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
}
CardCollectionView topLib = player.getCardsIn(ZoneType.Library, c);
return topLib.size() < c ? null : PaymentDecision.card(topLib);
return topLib.size() < c ? null : PaymentDecision.number(c);
}
@Override
@@ -475,7 +496,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
if (ability.getPayCosts().hasTapCost() && typeList.contains(ability.getHostCard())) {
c--;
}
source.setSVar("ChosenX", "Number$" + Integer.toString(c));
source.setSVar("ChosenX", "Number$" + c);
} else {
if (!isVehicle) {
c = AbilityUtils.calculateAmount(source, amount, ability);
@@ -494,7 +515,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override
public boolean apply(Card card) {
for (final SpellAbility sa : card.getSpellAbilities()) {
if (sa.isManaAbility() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) {
if (sa.isManaAbility() && sa.getPayCosts().hasTapCost()) {
return true;
}
}
@@ -579,7 +600,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override
public PaymentDecision visit(CostReveal cost) {
final String type = cost.getType();
CardCollectionView hand = player.getCardsIn(ZoneType.Hand);
CardCollectionView hand = player.getCardsIn(cost.getRevealFrom());
if (cost.payCostFromSource()) {
if (!hand.contains(source)) {
@@ -627,41 +648,41 @@ public class AiCostDecision extends CostDecisionMakerBase {
// the first things are benefit from removing counters
// try to remove +1/+1 counter from undying creature
List<Card> prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterType.P1P1, c),
List<Card> prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterEnumType.P1P1, c),
CardPredicates.hasKeyword("Undying"));
if (!prefs.isEmpty()) {
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.P1P1));
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterEnumType.P1P1));
PaymentDecision result = PaymentDecision.card(prefs);
result.ct = CounterType.P1P1;
result.ct = CounterType.get(CounterEnumType.P1P1);
return result;
}
// try to remove -1/-1 counter from persist creature
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterType.M1M1, c),
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterEnumType.M1M1, c),
CardPredicates.hasKeyword("Persist"));
if (!prefs.isEmpty()) {
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.M1M1));
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterEnumType.M1M1));
PaymentDecision result = PaymentDecision.card(prefs);
result.ct = CounterType.M1M1;
result.ct = CounterType.get(CounterEnumType.M1M1);
return result;
}
// try to remove Time counter from Chronozoa, it will generate more
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterType.TIME, c),
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterEnumType.TIME, c),
CardPredicates.nameEquals("Chronozoa"));
if (!prefs.isEmpty()) {
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterType.TIME));
Collections.sort(prefs, CardPredicates.compareByCounterType(CounterEnumType.TIME));
PaymentDecision result = PaymentDecision.card(prefs);
result.ct = CounterType.TIME;
result.ct = CounterType.get(CounterEnumType.TIME);
return result;
}
// try to remove Quest counter on something with enough counters for the
// effect to continue
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterType.QUEST, c));
prefs = CardLists.filter(typeList, CardPredicates.hasCounter(CounterEnumType.QUEST, c));
if (!prefs.isEmpty()) {
prefs = CardLists.filter(prefs, new Predicate<Card>() {
@@ -673,12 +694,12 @@ public class AiCostDecision extends CostDecisionMakerBase {
if (crd.hasSVar("MaxQuestEffect")) {
e = Integer.parseInt(crd.getSVar("MaxQuestEffect"));
}
return crd.getCounters(CounterType.QUEST) >= e + c;
return crd.getCounters(CounterEnumType.QUEST) >= e + c;
}
});
Collections.sort(prefs, Collections.reverseOrder(CardPredicates.compareByCounterType(CounterType.QUEST)));
Collections.sort(prefs, Collections.reverseOrder(CardPredicates.compareByCounterType(CounterEnumType.QUEST)));
PaymentDecision result = PaymentDecision.card(prefs);
result.ct = CounterType.QUEST;
result.ct = CounterType.get(CounterEnumType.QUEST);
return result;
}
@@ -775,7 +796,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
@Override
public boolean apply(final Card crd) {
for (Map.Entry<CounterType, Integer> e : crd.getCounters().entrySet()) {
if (e.getValue() >= c && (ctr.equals("ANY") || e.getKey() == CounterType.valueOf(ctr))) {
if (e.getValue() >= c && (ctr.equals("ANY") || e.getKey().equals(CounterType.getType(ctr)))) {
return true;
}
}
@@ -787,7 +808,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
PaymentDecision result = PaymentDecision.card(card);
for (Map.Entry<CounterType, Integer> e : card.getCounters().entrySet()) {
if (e.getValue() >= c && (ctr.equals("ANY") || e.getKey() == CounterType.valueOf(ctr))) {
if (e.getValue() >= c && (ctr.equals("ANY") || e.getKey().equals(CounterType.getType(ctr)))) {
result.ct = e.getKey();
break;
}
@@ -809,7 +830,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
final String sVar = ability.getSVar(amount);
if (sVar.equals("XChoice")) {
c = AbilityUtils.calculateAmount(source, "ChosenX", ability);
source.setSVar("ChosenX", "Number$" + String.valueOf(c));
source.setSVar("ChosenX", "Number$" + c);
} else if (amount.equals("All")) {
c = source.getCounters(cost.counter);
} else if (sVar.equals("Targeted$CardManaCost")) {
@@ -821,6 +842,8 @@ public class AiCostDecision extends CostDecisionMakerBase {
}
}
}
} else if (sVar.equals("Count$xPaid")) {
c = AbilityUtils.calculateAmount(source, "PayX", null);
} else {
c = AbilityUtils.calculateAmount(source, amount, ability);
}
@@ -863,7 +886,7 @@ public class AiCostDecision extends CostDecisionMakerBase {
}
typeList = CardLists.filter(typeList, Presets.TAPPED);
c = typeList.size();
source.setSVar("ChosenX", "Number$" + Integer.toString(c));
source.setSVar("ChosenX", "Number$" + c);
} else {
c = AbilityUtils.calculateAmount(source, amount, ability);
}

View File

@@ -17,5 +17,5 @@ public enum AiPlayDecision {
WouldBecomeZeroToughnessCreature,
WouldDestroyWorldEnchantment,
BadEtbEffects,
CurseEffects;
CurseEffects
}

View File

@@ -39,7 +39,7 @@ import java.util.Map;
* @version $Id: AIProfile.java 20169 2013-03-08 08:24:17Z Agetian $
*/
public class AiProfileUtil {
private static Map<String, Map<AiProps, String>> loadedProfiles = new HashMap<String, Map<AiProps, String>>();
private static Map<String, Map<AiProps, String>> loadedProfiles = new HashMap<>();
private static String AI_PROFILE_DIR;
private static final String AI_PROFILE_EXT = ".ai";
@@ -74,7 +74,7 @@ public class AiProfileUtil {
* @param profileName a profile to load.
*/
private static final Map<AiProps, String> loadProfile(final String profileName) {
Map<AiProps, String> profileMap = new HashMap<AiProps, String>();
Map<AiProps, String> profileMap = new HashMap<>();
List<String> lines = FileUtil.readFile(buildFileName(profileName));
for (String line : lines) {
@@ -122,7 +122,7 @@ public class AiProfileUtil {
*/
public static List<String> getAvailableProfiles()
{
final List<String> availableProfiles = new ArrayList<String>();
final List<String> availableProfiles = new ArrayList<>();
final File dir = new File(AI_PROFILE_DIR);
final String[] children = dir.list();
@@ -146,7 +146,7 @@ public class AiProfileUtil {
* available profiles including special random profile tags.
*/
public static List<String> getProfilesDisplayList() {
final List<String> availableProfiles = new ArrayList<String>();
final List<String> availableProfiles = new ArrayList<>();
availableProfiles.add(AI_PROFILE_RANDOM_MATCH);
availableProfiles.add(AI_PROFILE_RANDOM_DUEL);
availableProfiles.addAll(getAvailableProfiles());

View File

@@ -129,7 +129,10 @@ public enum AiProps { /** */
FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"),
FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"),
FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"),
FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */
FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"),
BLINK_RELOAD_PLANESWALKER_CHANCE("30"), /** */
BLINK_RELOAD_PLANESWALKER_MAX_LOYALTY("2"), /** */
BLINK_RELOAD_PLANESWALKER_LOYALTY_DIFF("2"); /** */
// Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting
// <-- There are no experimental options here -->

File diff suppressed because it is too large Load Diff

View File

@@ -82,6 +82,10 @@ public class ComputerUtilAbility {
final List<SpellAbility> spellAbilities = Lists.newArrayList();
for (final Card c : l) {
for (final SpellAbility sa : c.getSpellAbilities()) {
// Spells of permanents can't be activated on the battlefield
if (c.isPermanent() && sa.isSpell() && c.isInZone(ZoneType.Battlefield)) {
continue;
}
spellAbilities.add(sa);
}
if (c.isFaceDown() && c.isInZone(ZoneType.Exile) && !c.mayPlay(player).isEmpty()) {
@@ -95,17 +99,21 @@ public class ComputerUtilAbility {
public static List<SpellAbility> getOriginalAndAltCostAbilities(final List<SpellAbility> originList, final Player player) {
final List<SpellAbility> newAbilities = Lists.newArrayList();
for (SpellAbility sa : originList) {
sa.setActivatingPlayer(player);
List<SpellAbility> originListWithAddCosts = Lists.newArrayList();
for (SpellAbility sa : originList) {
// If this spell has alternative additional costs, add them instead of the unmodified SA itself
sa.setActivatingPlayer(player);
originListWithAddCosts.addAll(GameActionUtil.getAdditionalCostSpell(sa));
}
for (SpellAbility sa : originListWithAddCosts) {
// determine which alternative costs are cheaper than the original and prioritize them
List<SpellAbility> saAltCosts = GameActionUtil.getAlternativeCosts(sa, player);
List<SpellAbility> priorityAltSa = Lists.newArrayList();
List<SpellAbility> otherAltSa = Lists.newArrayList();
for (SpellAbility altSa : saAltCosts) {
if (altSa.getPayCosts() == null || sa.getPayCosts() == null) {
otherAltSa.add(altSa);
} else if (sa.getPayCosts().isOnlyManaCost()
if (sa.getPayCosts().isOnlyManaCost()
&& altSa.getPayCosts().isOnlyManaCost() && sa.getPayCosts().getTotalMana().compareTo(altSa.getPayCosts().getTotalMana()) == 1) {
// the alternative cost is strictly cheaper, so why not? (e.g. Omniscience etc.)
priorityAltSa.add(altSa);

View File

@@ -5,7 +5,6 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.card.CardType;
import forge.card.ColorSet;
import forge.card.MagicColor;
@@ -172,30 +171,30 @@ public class ComputerUtilCard {
// if no non-basic lands, target the least represented basic land type
String sminBL = "";
int iminBL = 20000; // hopefully no one will ever have more than 20000
// lands of one type....
int iminBL = Integer.MAX_VALUE;
int n = 0;
for (String name : MagicColor.Constant.BASIC_LANDS) {
n = CardLists.getType(land, name).size();
if ((n < iminBL) && (n > 0)) {
// if two or more are tied, only the
// first
// one checked will be used
if (n < iminBL && n > 0) {
iminBL = n;
sminBL = name;
}
}
if (iminBL == 20000) {
return null; // no basic land was a minimum
if (iminBL == Integer.MAX_VALUE) {
// All basic lands have no basic land type. Just return something
Iterator<Card> untapped = Iterables.filter(land, CardPredicates.Presets.UNTAPPED).iterator();
if (untapped.hasNext()) {
return untapped.next();
}
return land.get(0);
}
final List<Card> bLand = CardLists.getType(land, sminBL);
for (Card ut : Iterables.filter(bLand, CardPredicates.Presets.UNTAPPED)) {
return ut;
}
return Aggregates.random(bLand); // random tapped land of least represented type
}
@@ -228,7 +227,7 @@ public class ComputerUtilCard {
Card cheapest = null;
for (Card c : all) {
if (cheapest == null || cheapest.getManaCost().getCMC() <= cheapest.getManaCost().getCMC()) {
if (cheapest == null || c.getManaCost().getCMC() <= cheapest.getManaCost().getCMC()) {
cheapest = c;
}
}
@@ -368,7 +367,7 @@ public class ComputerUtilCard {
}
if (hasEnchantmants || hasArtifacts) {
final List<Card> ae = CardLists.filter(list, Predicates.and(Predicates.<Card>or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate<Card>() {
final List<Card> ae = CardLists.filter(list, Predicates.and(Predicates.or(CardPredicates.Presets.ARTIFACTS, CardPredicates.Presets.ENCHANTMENTS), new Predicate<Card>() {
@Override
public boolean apply(Card card) {
return !card.hasSVar("DoNotDiscardIfAble");
@@ -521,7 +520,7 @@ public class ComputerUtilCard {
*/
public static CardCollectionView getLikelyBlockers(final Player ai, final CardCollectionView blockers) {
AiBlockController aiBlk = new AiBlockController(ai);
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
Combat combat = new Combat(opp);
//Use actual attackers if available, else consider all possible attackers
Combat currentCombat = ai.getGame().getCombat();
@@ -564,7 +563,7 @@ public class ComputerUtilCard {
AiBlockController aiBlk = new AiBlockController(ai);
Combat combat = new Combat(ai);
combat.addAttacker(attacker, ai);
final List<Card> attackers = new ArrayList<Card>();
final List<Card> attackers = new ArrayList<>();
attackers.add(attacker);
aiBlk.assignBlockersGivenAttackers(combat, attackers);
return ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, combat);
@@ -643,7 +642,7 @@ public class ComputerUtilCard {
return getMostProminentType(list, CardType.getAllCreatureTypes());
}
public static String getMostProminentType(final CardCollectionView list, final List<String> valid) {
public static String getMostProminentType(final CardCollectionView list, final Collection<String> valid) {
if (list.size() == 0) {
return "";
}
@@ -788,7 +787,7 @@ public class ComputerUtilCard {
public static List<String> getColorByProminence(final List<Card> list) {
int cntColors = MagicColor.WUBRG.length;
final List<Pair<Byte,Integer>> map = new ArrayList<Pair<Byte,Integer>>();
final List<Pair<Byte,Integer>> map = new ArrayList<>();
for(int i = 0; i < cntColors; i++) {
map.add(MutablePair.of(MagicColor.WUBRG[i], 0));
}
@@ -809,7 +808,7 @@ public class ComputerUtilCard {
});
// will this part be once dropped?
List<String> result = new ArrayList<String>(cntColors);
List<String> result = new ArrayList<>(cntColors);
for(Pair<Byte, Integer> idx : map) { // fetch color names in the same order
result.add(MagicColor.toLongString(idx.getKey()));
}
@@ -881,10 +880,10 @@ public class ComputerUtilCard {
}
};
public static List<String> chooseColor(SpellAbility sa, int min, int max, List<String> colorChoices) {
List<String> chosen = new ArrayList<String>();
List<String> chosen = new ArrayList<>();
Player ai = sa.getActivatingPlayer();
final Game game = ai.getGame();
Player opp = ComputerUtil.getOpponentFor(ai);
Player opp = ai.getWeakestOpponent();
if (sa.hasParam("AILogic")) {
final String logic = sa.getParam("AILogic");
@@ -926,7 +925,7 @@ public class ComputerUtilCard {
}
else if (logic.equals("MostProminentInComputerDeckButGreen")) {
List<String> prominence = ComputerUtilCard.getColorByProminence(CardLists.filterControlledBy(game.getCardsInGame(), ai));
if (prominence.get(0) == MagicColor.Constant.GREEN) {
if (prominence.get(0).equals(MagicColor.Constant.GREEN)) {
chosen.add(prominence.get(1));
} else {
chosen.add(prominence.get(0));
@@ -964,6 +963,22 @@ public class ComputerUtilCard {
}
chosen.add(chosenColor);
}
else if (logic.equals("HighestDevotionToColor")) {
int curDevotion = 0;
String chosenColor = MagicColor.Constant.WHITE;
CardCollectionView hand = ai.getCardsIn(ZoneType.Hand);
for(byte c : MagicColor.WUBRG) {
String devotionCode = "Count$Devotion." + MagicColor.toLongString(c);
int devotion = CardFactoryUtil.xCount(sa.getHostCard(), devotionCode);
if (devotion > curDevotion && !CardLists.filter(hand, CardPredicates.isColor(c)).isEmpty()) {
curDevotion = devotion;
chosenColor = MagicColor.toLongString(c);
}
}
chosen.add(chosenColor);
}
}
if (chosen.isEmpty()) {
chosen.add(MagicColor.Constant.GREEN);
@@ -974,7 +989,7 @@ public class ComputerUtilCard {
public static boolean useRemovalNow(final SpellAbility sa, final Card c, final int dmg, ZoneType destination) {
final Player ai = sa.getActivatingPlayer();
final AiController aic = ((PlayerControllerAi)ai.getController()).getAi();
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
final Game game = ai.getGame();
final PhaseHandler ph = game.getPhaseHandler();
final PhaseType phaseType = ph.getPhase();
@@ -1128,14 +1143,14 @@ public class ComputerUtilCard {
// assume it either benefits the player or disrupts the opponent
for (final StaticAbility stAb : c.getStaticAbilities()) {
final Map<String, String> params = stAb.getMapParams();
if (params.get("Mode").equals("Continuous") && stAb.isIntrinsic() && !stAb.isTemporary()) {
if (params.get("Mode").equals("Continuous") && stAb.isIntrinsic()) {
priority = true;
break;
}
}
if (!priority) {
for (final Trigger t : c.getTriggers()) {
if (t.isIntrinsic() && !t.isTemporary()) {
if (t.isIntrinsic()) {
// has a triggered ability, could be benefitting the opponent or disrupting the AI
priority = true;
break;
@@ -1213,6 +1228,7 @@ public class ComputerUtilCard {
final Game game = ai.getGame();
final PhaseHandler phase = game.getPhaseHandler();
final Combat combat = phase.getCombat();
final boolean main1Preferred = "Main1IfAble".equals(sa.getParam("AILogic")) && phase.is(PhaseType.MAIN1, ai);
final boolean isBerserk = "Berserk".equals(sa.getParam("AILogic"));
final boolean loseCardAtEOT = "Sacrifice".equals(sa.getParam("AtEOT")) || "Exile".equals(sa.getParam("AtEOT"))
|| "Destroy".equals(sa.getParam("AtEOT")) || "ExileCombat".equals(sa.getParam("AtEOT"));
@@ -1250,7 +1266,7 @@ public class ComputerUtilCard {
// will the creature attack (only relevant for sorcery speed)?
if (phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)
&& phase.isPlayerTurn(ai)
&& SpellAbilityAi.isSorcerySpeed(sa)
&& SpellAbilityAi.isSorcerySpeed(sa) || main1Preferred
&& power > 0
&& ComputerUtilCard.doesCreatureAttackAI(ai, c)) {
return true;
@@ -1269,7 +1285,7 @@ public class ComputerUtilCard {
}
}
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
Card pumped = getPumpedCreature(ai, sa, c, toughness, power, keywords);
List<Card> oppCreatures = opp.getCreaturesInPlay();
float chance = 0;
@@ -1293,14 +1309,14 @@ public class ComputerUtilCard {
// cast it during Declare Blockers, thus ruining its attacker
if (holdCombatTricks && sa.getApi() == ApiType.Pump
&& sa.hasParam("NumAtt") && sa.getHostCard() != null
&& sa.getHostCard().getZone() != null && sa.getHostCard().getZone().is(ZoneType.Hand)
&& sa.getHostCard().isInZone(ZoneType.Hand)
&& c.getNetPower() > 0 // too obvious if attacking with a 0-power creature
&& sa.getHostCard().isInstant() // only do it for instant speed spells in hand
&& ComputerUtilMana.hasEnoughManaSourcesToCast(sa, ai)) {
combatTrick = true;
final List<String> kws = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & "))
: Lists.<String>newArrayList();
: Lists.newArrayList();
for (String kw : kws) {
if (!kw.equals("Trample") && !kw.equals("First Strike") && !kw.equals("Double Strike")) {
combatTrick = false;
@@ -1406,8 +1422,8 @@ public class ComputerUtilCard {
if (combat.isAttacking(c) && opp.getLife() > 0) {
int dmg = ComputerUtilCombat.damageIfUnblocked(c, opp, combat, true);
int pumpedDmg = ComputerUtilCombat.damageIfUnblocked(pumped, opp, pumpedCombat, true);
int poisonOrig = opp.canReceiveCounters(CounterType.POISON) ? ComputerUtilCombat.poisonIfUnblocked(c, ai) : 0;
int poisonPumped = opp.canReceiveCounters(CounterType.POISON) ? ComputerUtilCombat.poisonIfUnblocked(pumped, ai) : 0;
int poisonOrig = opp.canReceiveCounters(CounterEnumType.POISON) ? ComputerUtilCombat.poisonIfUnblocked(c, ai) : 0;
int poisonPumped = opp.canReceiveCounters(CounterEnumType.POISON) ? ComputerUtilCombat.poisonIfUnblocked(pumped, ai) : 0;
// predict Infect
if (pumpedDmg == 0 && c.hasKeyword(Keyword.INFECT)) {
@@ -1430,7 +1446,8 @@ public class ComputerUtilCard {
}
if (pumpedDmg > dmg) {
if ((!c.hasKeyword(Keyword.INFECT) && pumpedDmg >= opp.getLife())
|| (c.hasKeyword(Keyword.INFECT) && opp.canReceiveCounters(CounterType.POISON) && pumpedDmg >= opp.getPoisonCounters())) {
|| (c.hasKeyword(Keyword.INFECT) && opp.canReceiveCounters(CounterEnumType.POISON) && pumpedDmg >= opp.getPoisonCounters())
|| ("PumpForTrample".equals(sa.getParam("AILogic")))) {
return true;
}
}
@@ -1456,6 +1473,10 @@ public class ComputerUtilCard {
}
if (totalPowerUnblocked >= opp.getLife()) {
return true;
} else if (totalPowerUnblocked > dmg && sa.getHostCard() != null && sa.getHostCard().isInPlay()) {
if (sa.getPayCosts().hasNoManaCost()) {
return true; // always activate abilities which cost no mana and which can increase unblocked damage
}
}
}
float value = 1.0f * (pumpedDmg - dmg);
@@ -1566,7 +1587,7 @@ public class ComputerUtilCard {
Card pumped = CardFactory.copyCard(c, true);
pumped.setSickness(c.hasSickness());
final long timestamp = c.getGame().getNextTimestamp();
final List<String> kws = new ArrayList<String>();
final List<String> kws = new ArrayList<>();
for (String kw : keywords) {
if (kw.startsWith("HIDDEN")) {
pumped.addHiddenExtrinsicKeyword(kw);
@@ -1596,12 +1617,12 @@ public class ComputerUtilCard {
}
pumped.addNewPT(c.getCurrentPower(), c.getCurrentToughness(), timestamp);
pumped.addTempPowerBoost(c.getTempPowerBoost() + power + berserkPower);
pumped.addTempToughnessBoost(c.getTempToughnessBoost() + toughness);
pumped.setPTBoost(c.getPTBoostTable());
pumped.addPTBoost(power + berserkPower, toughness, timestamp, null);
pumped.addChangedCardKeywords(kws, null, false, false, timestamp);
Set<CounterType> types = c.getCounters().keySet();
for(CounterType ct : types) {
pumped.addCounterFireNoEvents(ct, c.getCounters(ct), ai, true);
pumped.addCounterFireNoEvents(ct, c.getCounters(ct), ai, true, null);
}
//Copies tap-state and extra keywords (auras, equipment, etc.)
if (c.isTapped()) {
@@ -1643,7 +1664,9 @@ public class ComputerUtilCard {
}
list.add(vCard); // account for the static abilities that may be present on the card itself
for (final Card c : list) {
// remove old boost that might be copied
for (final StaticAbility stAb : c.getStaticAbilities()) {
vCard.removePTBoost(c.getTimestamp(), stAb.getId());
final Map<String, String> params = stAb.getMapParams();
if (!params.get("Mode").equals("Continuous")) {
continue;
@@ -1658,26 +1681,25 @@ public class ComputerUtilCard {
if (!vCard.isValid(valid, c.getController(), c, null)) {
continue;
}
int att = 0;
if (params.containsKey("AddPower")) {
String addP = params.get("AddPower");
int att = 0;
if (addP.equals("AffectedX")) {
att = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addP));
} else {
att = AbilityUtils.calculateAmount(c, addP, stAb);
}
vCard.addTempPowerBoost(att);
}
int def = 0;
if (params.containsKey("AddToughness")) {
String addT = params.get("AddToughness");
int def = 0;
if (addT.equals("AffectedY")) {
def = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addT));
} else {
def = AbilityUtils.calculateAmount(c, addT, stAb);
}
vCard.addTempToughnessBoost(def);
}
vCard.addPTBoost(att, def, c.getTimestamp(), stAb.getId());
}
}
}
@@ -1743,10 +1765,10 @@ public class ComputerUtilCard {
}
public static boolean hasActiveUndyingOrPersist(final Card c) {
if (c.hasKeyword(Keyword.UNDYING) && c.getCounters(CounterType.P1P1) == 0) {
if (c.hasKeyword(Keyword.UNDYING) && c.getCounters(CounterEnumType.P1P1) == 0) {
return true;
}
if (c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterType.M1M1) == 0) {
if (c.hasKeyword(Keyword.PERSIST) && c.getCounters(CounterEnumType.M1M1) == 0) {
return true;
}
return false;
@@ -1763,10 +1785,6 @@ public class ComputerUtilCard {
for (Card c : otb) {
for (SpellAbility sa : c.getSpellAbilities()) {
if (sa.getPayCosts() == null) {
continue;
}
CostPayEnergy energyCost = sa.getPayCosts().getCostEnergy();
if (energyCost != null) {
int amount = energyCost.convertAmount();
@@ -1842,8 +1860,45 @@ public class ComputerUtilCard {
String needsToPlayName = isRightSplit ? "SplitNeedsToPlay" : "NeedsToPlay";
String needsToPlayVarName = isRightSplit ? "SplitNeedsToPlayVar" : "NeedsToPlayVar";
// TODO: if there are ever split cards with Evoke or Kicker, factor in the right split option above
if (sa != null) {
if (sa.isEvoke()) {
// if the spell is evoked, will use NeedsToPlayEvoked if available (otherwise falls back to NeedsToPlay)
if (card.hasSVar("NeedsToPlayEvoked")) {
needsToPlayName = "NeedsToPlayEvoked";
}
if (card.hasSVar("NeedsToPlayEvokedVar")) {
needsToPlayVarName = "NeedsToPlayEvokedVar";
}
} else if (sa.isKicked()) {
// if the spell is kicked, uses NeedsToPlayKicked if able and locks out the regular NeedsToPlay check
// for unkicked spells, uses NeedsToPlay
if (card.hasSVar("NeedsToPlayKicked")) {
needsToPlayName = "NeedsToPlayKicked";
} else {
needsToPlayName = "UNUSED";
}
if (card.hasSVar("NeedsToPlayKickedVar")) {
needsToPlayVarName = "NeedsToPlayKickedVar";
} else {
needsToPlayVarName = "UNUSED";
}
}
}
if (card.hasSVar(needsToPlayName)) {
final String needsToPlay = card.getSVar(needsToPlayName);
// A special case which checks that this creature will attack if it's the AI's turn
if (needsToPlay.equalsIgnoreCase("WillAttack")) {
if (sa != null && game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) {
return ComputerUtilCard.doesSpecifiedCreatureAttackAI(sa.getActivatingPlayer(), card) ?
AiPlayDecision.WillPlay : AiPlayDecision.BadEtbEffects;
} else {
return AiPlayDecision.WillPlay; // not our turn, skip this check for the possible Flash use etc.
}
}
CardCollectionView list = game.getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card, null);
@@ -1853,21 +1908,12 @@ public class ComputerUtilCard {
}
if (card.getSVar(needsToPlayVarName).length() > 0) {
final String needsToPlay = card.getSVar(needsToPlayVarName);
int x = 0;
int y = 0;
String sVar = needsToPlay.split(" ")[0];
String comparator = needsToPlay.split(" ")[1];
String compareTo = comparator.substring(2);
try {
x = Integer.parseInt(sVar);
} catch (final NumberFormatException e) {
x = CardFactoryUtil.xCount(card, card.getSVar(sVar));
}
try {
y = Integer.parseInt(compareTo);
} catch (final NumberFormatException e) {
y = CardFactoryUtil.xCount(card, card.getSVar(compareTo));
}
int x = AbilityUtils.calculateAmount(card, sVar, sa);
int y = AbilityUtils.calculateAmount(card, compareTo, sa);
if (!Expressions.compare(x, comparator, y)) {
return AiPlayDecision.NeedsToPlayCriteriaNotMet;
}

File diff suppressed because it is too large Load Diff

View File

@@ -45,7 +45,7 @@ public class ComputerUtilCost {
final CostPutCounter addCounter = (CostPutCounter) part;
final CounterType type = addCounter.getCounter();
if (type.equals(CounterType.M1M1)) {
if (type.equals(CounterEnumType.M1M1)) {
return false;
}
}
@@ -75,7 +75,7 @@ public class ComputerUtilCost {
final CounterType type = remCounter.counter;
if (!part.payCostFromSource()) {
if (CounterType.P1P1.equals(type)) {
if (CounterEnumType.P1P1.equals(type)) {
return false;
}
continue;
@@ -97,7 +97,7 @@ public class ComputerUtilCost {
// check the sa what the PaymentDecision is.
// ignore Loyality abilities with Zero as Cost
if (sa != null && !CounterType.LOYALTY.equals(type)) {
if (sa != null && !CounterEnumType.LOYALTY.equals(type)) {
final AiCostDecision decision = new AiCostDecision(sa.getActivatingPlayer(), sa);
PaymentDecision pay = decision.visit(remCounter);
if (pay == null || pay.c <= 0) {
@@ -106,10 +106,19 @@ public class ComputerUtilCost {
}
//don't kill the creature
if (CounterType.P1P1.equals(type) && source.getLethalDamage() <= 1
if (CounterEnumType.P1P1.equals(type) && source.getLethalDamage() <= 1
&& !source.hasKeyword(Keyword.UNDYING)) {
return false;
}
} else if (part instanceof CostRemoveAnyCounter) {
if (sa != null) {
final CostRemoveAnyCounter remCounter = (CostRemoveAnyCounter) part;
PaymentDecision decision = new AiCostDecision(sa.getActivatingPlayer(), sa).visit(remCounter);
return decision != null;
}
return false;
}
}
return true;
@@ -415,7 +424,7 @@ public class ComputerUtilCost {
continue;
}
final int remainingLife = ai.getLife();
final int lifeCost = ((CostPayLife) part).convertAmount();
final int lifeCost = part.convertAmount();
if ((remainingLife - lifeCost) < 10) {
return false; //Don't pay life if it would put AI under 10 life
} else if ((remainingLife / lifeCost) < 4) {
@@ -458,9 +467,9 @@ public class ComputerUtilCost {
if(!meetsRestriction)
continue;
try {
extraManaNeeded += Integer.parseInt(snem);
} catch (final NumberFormatException e) {
if (StringUtils.isNumeric(parts[0])) {
extraManaNeeded += Integer.parseInt(parts[0]);
} else {
System.out.println("wrong SpellsNeedExtraMana SVar format on " + c);
}
}
@@ -471,9 +480,9 @@ public class ComputerUtilCost {
}
final String snem = c.getSVar("SpellsNeedExtraManaEffect");
if (!StringUtils.isBlank(snem)) {
try {
if (StringUtils.isNumeric(snem)) {
extraManaNeeded += Integer.parseInt(snem);
} catch (final NumberFormatException e) {
} else {
System.out.println("wrong SpellsNeedExtraManaEffect SVar format on " + c);
}
}
@@ -481,7 +490,7 @@ public class ComputerUtilCost {
}
// Try not to lose Planeswalker if not threatened
if (sa.getRestrictions().isPwAbility()) {
if (sa.isPwAbility()) {
for (final CostPart part : sa.getPayCosts().getCostParts()) {
if (part instanceof CostRemoveCounter) {
if (part.convertAmount() != null && part.convertAmount() == sa.getHostCard().getCurrentLoyalty()) {
@@ -520,7 +529,7 @@ public class ComputerUtilCost {
public boolean apply(Card card) {
boolean hasManaSa = false;
for (final SpellAbility sa : card.getSpellAbilities()) {
if (sa.isManaAbility() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) {
if (sa.isManaAbility() && sa.getPayCosts().hasTapCost()) {
hasManaSa = true;
break;
}
@@ -543,7 +552,7 @@ public class ComputerUtilCost {
final Card source = sa.getHostCard();
final String aiLogic = sa.getParam("UnlessAI");
boolean payForOwnOnly = "OnlyOwn".equals(aiLogic);
boolean payOwner = sa.hasParam("UnlessAI") ? aiLogic.startsWith("Defined") : false;
boolean payOwner = sa.hasParam("UnlessAI") && aiLogic.startsWith("Defined");
boolean payNever = "Never".equals(aiLogic);
boolean shockland = "Shockland".equals(aiLogic);
boolean isMine = sa.getActivatingPlayer().equals(payer);
@@ -585,6 +594,11 @@ public class ComputerUtilCost {
if (c == null || c.isUntapped()) {
return false;
}
} else if ("RiskFactor".equals(aiLogic)) {
final Player activator = sa.getActivatingPlayer();
if (!activator.canDraw() || activator.hasKeyword("You can't draw more than one card each turn.")) {
return false;
}
} else if ("MorePowerful".equals(aiLogic)) {
final int sourceCreatures = sa.getActivatingPlayer().getCreaturesInPlay().size();
final int payerCreatures = payer.getCreaturesInPlay().size();
@@ -626,7 +640,7 @@ public class ComputerUtilCost {
&& (!source.getName().equals("Tyrannize") || payer.getCardsIn(ZoneType.Hand).size() > 2)
&& (!source.getName().equals("Perplex") || payer.getCardsIn(ZoneType.Hand).size() < 2)
&& (!source.getName().equals("Breaking Point") || payer.getCreaturesInPlay().size() > 1)
&& (!source.getName().equals("Chain of Vapor") || (ComputerUtil.getOpponentFor(payer).getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3));
&& (!source.getName().equals("Chain of Vapor") || (payer.getWeakestOpponent().getCreaturesInPlay().size() > 0 && payer.getLandsInPlay().size() > 3));
}
public static Set<String> getAvailableManaColors(Player ai, Card additionalLand) {

View File

@@ -4,6 +4,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.*;
import forge.ai.ability.AnimateAi;
import forge.card.CardStateName;
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
@@ -12,6 +13,7 @@ import forge.card.mana.ManaCostParser;
import forge.card.mana.ManaCostShard;
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
@@ -24,6 +26,7 @@ import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerPredicates;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
@@ -65,6 +68,8 @@ public class ComputerUtilMana {
// Does not check if mana sources can be used right now, just checks for potential chance.
public static boolean hasEnoughManaSourcesToCast(final SpellAbility sa, final Player ai) {
if(ai == null || sa == null)
return false;
sa.setActivatingPlayer(ai);
return payManaCost(sa, ai, true, 0, false);
}
@@ -169,8 +174,7 @@ public class ComputerUtilMana {
}
return ability1.compareTo(ability2);
}
else {
} else {
return preOrder;
}
}
@@ -320,11 +324,17 @@ public class ComputerUtilMana {
SpellAbility saPayment = chooseManaAbility(cost, sa, ai, toPay, saList, true);
if (saPayment == null) {
if (!toPay.isPhyrexian() || !ai.canPayLife(2)) {
boolean lifeInsteadOfBlack = toPay.isBlack() && ai.hasKeyword("PayLifeInsteadOf:B");
if ((!toPay.isPhyrexian() && !lifeInsteadOfBlack) || !ai.canPayLife(2)) {
break; // cannot pay
}
cost.payPhyrexian();
if (toPay.isPhyrexian()) {
cost.payPhyrexian();
} else if (lifeInsteadOfBlack) {
cost.decreaseShard(ManaCostShard.BLACK, 1);
}
continue;
}
@@ -337,6 +347,10 @@ public class ComputerUtilMana {
payMultipleMana(cost, manaProduced, ai);
// remove from available lists
/*
* Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard()));
* causes Android build not to compile
* */
Iterator<SpellAbility> itSa = sourcesForShards.values().iterator();
while (itSa.hasNext()) {
SpellAbility srcSa = itSa.next();
@@ -355,9 +369,9 @@ public class ComputerUtilMana {
private static boolean payManaCost(final ManaCostBeingPaid cost, final SpellAbility sa, final Player ai, final boolean test, boolean checkPlayable) {
adjustManaCostToAvoidNegEffects(cost, sa.getHostCard(), ai);
List<Mana> manaSpentToPay = test ? new ArrayList<Mana>() : sa.getPayingMana();
List<Mana> manaSpentToPay = test ? new ArrayList<>() : sa.getPayingMana();
boolean purePhyrexian = cost.containsOnlyPhyrexianMana();
int testEnergyPool = ai.getCounters(CounterType.ENERGY);
int testEnergyPool = ai.getCounters(CounterEnumType.ENERGY);
List<SpellAbility> paymentList = Lists.newArrayList();
@@ -380,6 +394,8 @@ public class ComputerUtilMana {
while (!cost.isPaid()) {
toPay = getNextShardToPay(cost);
boolean lifeInsteadOfBlack = toPay.isBlack() && ai.hasKeyword("PayLifeInsteadOf:B");
Collection<SpellAbility> saList = null;
if (hasConverge &&
(toPay == ManaCostShard.GENERIC || toPay == ManaCostShard.X)) {
@@ -430,7 +446,8 @@ public class ComputerUtilMana {
}
if (saPayment == null) {
if (!toPay.isPhyrexian() || !ai.canPayLife(2) || (ai.getLife() <= 2 && !ai.cantLoseForZeroOrLessLife())) {
if ((!toPay.isPhyrexian() && !lifeInsteadOfBlack) || !ai.canPayLife(2)
|| (ai.getLife() <= 2 && !ai.cantLoseForZeroOrLessLife())) {
break; // cannot pay
}
@@ -445,7 +462,12 @@ public class ComputerUtilMana {
}
}
cost.payPhyrexian();
if (toPay.isPhyrexian()) {
cost.payPhyrexian();
} else if (lifeInsteadOfBlack) {
cost.decreaseShard(ManaCostShard.BLACK, 1);
}
if (!test) {
ai.payLife(2, sa.getHostCard());
}
@@ -472,6 +494,10 @@ public class ComputerUtilMana {
payMultipleMana(cost, manaProduced, ai);
// remove from available lists
/*
* Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard()));
* causes Android build not to compile
* */
Iterator<SpellAbility> itSa = sourcesForShards.values().iterator();
while (itSa.hasNext()) {
SpellAbility srcSa = itSa.next();
@@ -481,16 +507,10 @@ public class ComputerUtilMana {
}
}
else {
if (saPayment.getPayCosts() != null) {
final CostPayment pay = new CostPayment(saPayment.getPayCosts(), saPayment);
if (!pay.payComputerCosts(new AiCostDecision(ai, saPayment))) {
saList.remove(saPayment);
continue;
}
}
else {
System.err.println("Ability " + saPayment + " from " + saPayment.getHostCard() + " had NULL as payCost");
saPayment.getHostCard().tap();
final CostPayment pay = new CostPayment(saPayment.getPayCosts(), saPayment);
if (!pay.payComputerCosts(new AiCostDecision(ai, saPayment))) {
saList.remove(saPayment);
continue;
}
ai.getGame().getStack().addAndUnfreeze(saPayment);
@@ -502,6 +522,10 @@ public class ComputerUtilMana {
if (hasConverge) { // hack to prevent converge re-using sources
// remove from available lists
/*
* Refactoring this code to sourcesForShards.values().removeIf((SpellAbility srcSa) -> srcSa.getHostCard().equals(saPayment.getHostCard()));
* causes Android build not to compile
* */
Iterator<SpellAbility> itSa = sourcesForShards.values().iterator();
while (itSa.hasNext()) {
SpellAbility srcSa = itSa.next();
@@ -711,7 +735,7 @@ public class ComputerUtilMana {
continue;
}
if (thisMana.getManaAbility() != null && !thisMana.getManaAbility().meetsManaRestrictions(saBeingPaidFor)) {
if (thisMana.getManaAbility() != null && !thisMana.getManaAbility().meetsSpellAndShardRestrictions(saBeingPaidFor, shard, thisMana.getColor())) {
continue;
}
@@ -807,10 +831,9 @@ public class ComputerUtilMana {
if (checkCosts) {
// Check if AI can still play this mana ability
ma.setActivatingPlayer(ai);
if (ma.getPayCosts() != null) { // if the AI can't pay the additional costs skip the mana ability
if (!CostPayment.canPayAdditionalCosts(ma.getPayCosts(), ma)) {
return false;
}
// if the AI can't pay the additional costs skip the mana ability
if (!CostPayment.canPayAdditionalCosts(ma.getPayCosts(), ma)) {
return false;
}
else if (sourceCard.isTapped()) {
return false;
@@ -865,10 +888,12 @@ public class ComputerUtilMana {
// For combat tricks, always obey mana reservation
if (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP) {
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK);
} else if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai)) && (curPhase == PhaseType.COMBAT_DECLARE_BLOCKERS || curPhase == PhaseType.CLEANUP)) {
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK);
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT);
if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai))) {
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK);
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT);
}
else
AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK);
} else {
if ((AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK)) ||
(AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK))) {
@@ -1112,7 +1137,7 @@ public class ComputerUtilMana {
ManaCostBeingPaid cost = new ManaCostBeingPaid(mana, restriction);
// Tack xMana Payments into mana here if X is a set value
if (sa.getPayCosts() != null && (cost.getXcounter() > 0 || extraMana > 0)) {
if (cost.getXcounter() > 0 || extraMana > 0) {
int manaToAdd = 0;
if (test && extraMana > 0) {
final int multiplicator = Math.max(cost.getXcounter(), 1);
@@ -1121,11 +1146,11 @@ public class ComputerUtilMana {
// For Count$xPaid set PayX in the AFs then use that here
// Else calculate it as appropriate.
final String xSvar = card.getSVar("X").startsWith("Count$xPaid") ? "PayX" : "X";
if (!sa.getSVar(xSvar).isEmpty() || card.hasSVar(xSvar)) {
if (xSvar.equals("PayX") && card.hasSVar(xSvar)) {
if (!sa.getSVar(xSvar).isEmpty() || card.hasSVar(xSvar) || card.getState(CardStateName.Original).hasSVar(xSvar)) {
if (xSvar.equals("PayX") && (card.hasSVar(xSvar) || card.getState(CardStateName.Original).hasSVar(xSvar))) {
// X SVar may end up being an empty string when copying a spell with no cost (e.g. Jhoira Avatar)
String xValue = card.getSVar(xSvar);
manaToAdd = xValue.isEmpty() ? 0 : Integer.parseInt(card.getSVar(xSvar)) * cost.getXcounter(); // X
String xValue = card.hasSVar(xSvar) ? card.getSVar(xSvar) : card.getState(CardStateName.Original).getSVar(xSvar);
manaToAdd = xValue.isEmpty() ? 0 : Integer.parseInt(xValue) * cost.getXcounter(); // X
} else {
manaToAdd = AbilityUtils.calculateAmount(card, xSvar, sa) * cost.getXcounter();
}
@@ -1137,7 +1162,7 @@ public class ComputerUtilMana {
cost.increaseShard(shardToGrow, manaToAdd);
if (!test) {
card.setXManaCostPaid(manaToAdd / cost.getXcounter());
sa.setXManaCostPaid(manaToAdd / cost.getXcounter());
}
}
@@ -1186,7 +1211,7 @@ public class ComputerUtilMana {
for (SpellAbility ma : src.getManaAbilities()) {
ma.setActivatingPlayer(p);
if (!checkPlayable || ma.canPlay()) {
int costsToActivate = ma.getPayCosts() != null && ma.getPayCosts().getCostMana() != null ? ma.getPayCosts().getCostMana().convertAmount() : 0;
int costsToActivate = ma.getPayCosts().getCostMana() != null ? ma.getPayCosts().getCostMana().convertAmount() : 0;
int producedMana = ma.getParamOrDefault("Produced", "").split(" ").length;
int producedAmount = AbilityUtils.calculateAmount(src, ma.getParamOrDefault("Amount", "1"), ma);
@@ -1331,12 +1356,13 @@ public class ComputerUtilMana {
final ListMultimap<Integer, SpellAbility> manaMap = ArrayListMultimap.create();
final Game game = ai.getGame();
List<ReplacementEffect> replacementEffects = new ArrayList<ReplacementEffect>();
List<ReplacementEffect> replacementEffects = new ArrayList<>();
for (final Player p : game.getPlayers()) {
for (final Card crd : p.getAllCards()) {
for (final ReplacementEffect replacementEffect : crd.getReplacementEffects()) {
if (replacementEffect.requirementsCheck(game)
&& replacementEffect.getMapParams().containsKey("ManaReplacement")
&& replacementEffect.getMode() == ReplacementType.ProduceMana
&& replacementEffect.hasParam("ManaReplacement")
&& replacementEffect.zonesCheck(game.getZoneOf(crd))) {
replacementEffects.add(replacementEffect);
}
@@ -1376,17 +1402,16 @@ public class ComputerUtilMana {
AbilityManaPart mp = m.getManaPart();
// setup produce mana replacement effects
final Map<String, Object> repParams = new HashMap<>();
repParams.put("Event", "ProduceMana");
repParams.put("Mana", mp.getOrigProduced());
repParams.put("Affected", sourceCard);
repParams.put("Player", ai);
repParams.put("AbilityMana", m);
final Map<AbilityKey, Object> repParams = AbilityKey.newMap();
repParams.put(AbilityKey.Mana, mp.getOrigProduced());
repParams.put(AbilityKey.Affected, sourceCard);
repParams.put(AbilityKey.Player, ai);
repParams.put(AbilityKey.AbilityMana, m);
for (final ReplacementEffect replacementEffect : replacementEffects) {
if (replacementEffect.canReplace(repParams)) {
Card crd = replacementEffect.getHostCard();
String repType = crd.getSVar(replacementEffect.getMapParams().get("ManaReplacement"));
String repType = crd.getSVar(replacementEffect.getParam("ManaReplacement"));
if (repType.contains("Chosen")) {
repType = TextUtil.fastReplace(repType, "Chosen", MagicColor.toShortString(crd.getChosenColor()));
}
@@ -1537,7 +1562,7 @@ public class ComputerUtilMana {
* @return map between creatures and shards to convoke
*/
public static Map<Card, ManaCostShard> getConvokeOrImproviseFromList(final ManaCost cost, List<Card> list, boolean improvise) {
final Map<Card, ManaCostShard> convoke = new HashMap<Card, ManaCostShard>();
final Map<Card, ManaCostShard> convoke = new HashMap<>();
Card convoked = null;
if (!improvise) {
for (ManaCostShard toPay : cost) {
@@ -1562,7 +1587,7 @@ public class ComputerUtilMana {
}
public static int determineMaxAffordableX(Player ai, SpellAbility sa) {
if (sa.getPayCosts() == null || sa.getPayCosts().getCostMana() == null) {
if (sa.getPayCosts().getCostMana() == null) {
return -1;
}

View File

@@ -5,7 +5,7 @@ import com.google.common.base.Function;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.card.CounterEnumType;
import forge.game.cost.CostPayEnergy;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
@@ -242,11 +242,11 @@ public class CreatureEvaluator implements Function<Card, Integer> {
&& "+X".equals(sa.getParam("NumDef"))
&& !sa.usesTargeting()
&& (!sa.hasParam("Defined") || "Self".equals(sa.getParam("Defined")))) {
if (sa.getPayCosts() != null && sa.getPayCosts().hasOnlySpecificCostType(CostPayEnergy.class)) {
if (sa.getPayCosts().hasOnlySpecificCostType(CostPayEnergy.class)) {
// Electrostatic Pummeler, can be expanded for similar cards
int initPower = getEffectivePower(sa.getHostCard());
int pumpedPower = initPower;
int energy = sa.getHostCard().getController().getCounters(CounterType.ENERGY);
int energy = sa.getHostCard().getController().getCounters(CounterEnumType.ENERGY);
if (energy > 0) {
int numActivations = energy / 3;
for (int i = 0; i < numActivations; i++) {

View File

@@ -9,12 +9,10 @@ import forge.card.CardStateName;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.ability.AbilityFactory;
import forge.game.ability.effects.DetachedCardEffect;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CounterType;
import forge.game.card.*;
import forge.game.card.token.TokenInfo;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
@@ -24,7 +22,9 @@ import forge.game.mana.ManaPool;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.ability.AbilityKey;
import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
@@ -41,7 +41,7 @@ import java.util.*;
import java.util.Map.Entry;
public abstract class GameState {
private static final Map<ZoneType, String> ZONES = new HashMap<ZoneType, String>();
private static final Map<ZoneType, String> ZONES = new HashMap<>();
static {
ZONES.put(ZoneType.Battlefield, "battlefield");
ZONES.put(ZoneType.Hand, "hand");
@@ -66,14 +66,15 @@ public abstract class GameState {
private boolean puzzleCreatorState = false;
private final Map<ZoneType, String> humanCardTexts = new EnumMap<ZoneType, String>(ZoneType.class);
private final Map<ZoneType, String> aiCardTexts = new EnumMap<ZoneType, String>(ZoneType.class);
private final Map<ZoneType, String> humanCardTexts = new EnumMap<>(ZoneType.class);
private final Map<ZoneType, String> aiCardTexts = new EnumMap<>(ZoneType.class);
private final Map<Integer, Card> idToCard = new HashMap<>();
private final Map<Card, Integer> cardToAttachId = new HashMap<>();
private final Map<Card, Integer> cardToEnchantPlayerId = new HashMap<>();
private final Map<Card, Integer> markedDamage = new HashMap<>();
private final Map<Card, List<String>> cardToChosenClrs = new HashMap<>();
private final Map<Card, CardCollection> cardToChosenCards = new HashMap<>();
private final Map<Card, String> cardToChosenType = new HashMap<>();
private final Map<Card, List<String>> cardToRememberedId = new HashMap<>();
private final Map<Card, List<String>> cardToImprintedId = new HashMap<>();
@@ -96,8 +97,13 @@ public abstract class GameState {
private String precastHuman = null;
private String precastAI = null;
private String putOnStackHuman = null;
private String putOnStackAI = null;
private int turn = 1;
private boolean removeSummoningSickness = false;
// Targeting for precast spells in a game state (mostly used by Puzzle Mode game states)
private final int TARGET_NONE = -1; // untargeted spell (e.g. Joraga Invocation)
private final int TARGET_HUMAN = -2;
@@ -211,6 +217,10 @@ public abstract class GameState {
// Remember the IDs of imprinted cards
cardsReferencedByID.add(i);
}
for (Card i : card.getChosenCards()) {
// Remember the IDs of chosen cards
cardsReferencedByID.add(i);
}
if (game.getCombat() != null && game.getCombat().isAttacking(card)) {
// Remember the IDs of attacked planeswalkers
GameEntity def = game.getCombat().getDefenderByAttacker(card);
@@ -233,7 +243,7 @@ public abstract class GameState {
if (card instanceof DetachedCardEffect) {
continue;
}
addCard(zone, card.getOwner() == ai ? aiCardTexts : humanCardTexts, card);
addCard(zone, card.getController() == ai ? aiCardTexts : humanCardTexts, card);
}
}
}
@@ -244,7 +254,7 @@ public abstract class GameState {
newText.append(";");
}
if (c.isToken()) {
newText.append("t:" + new TokenInfo(c).toString());
newText.append("t:").append(new TokenInfo(c).toString());
} else {
if (c.getPaperCard() == null) {
return;
@@ -260,6 +270,10 @@ public abstract class GameState {
}
if (zoneType == ZoneType.Battlefield) {
if (c.getOwner() != c.getController()) {
// TODO: Handle more than 2-player games.
newText.append("|Owner:" + (c.getOwner().isAI() ? "AI" : "Human"));
}
if (c.isTapped()) {
newText.append("|Tapped");
}
@@ -312,6 +326,17 @@ public abstract class GameState {
newText.append("|NamedCard:").append(c.getNamedCard());
}
List<String> chosenCardIds = Lists.newArrayList();
for (Object obj : c.getChosenCards()) {
if (obj instanceof Card) {
int id = ((Card)obj).getId();
chosenCardIds.add(String.valueOf(id));
}
}
if (!chosenCardIds.isEmpty()) {
newText.append("|ChosenCards:").append(TextUtil.join(chosenCardIds, ","));
}
List<String> rememberedCardIds = Lists.newArrayList();
for (Object obj : c.getRemembered()) {
if (obj instanceof Card) {
@@ -340,6 +365,12 @@ public abstract class GameState {
if (c.isFaceDown()) {
newText.append("|FaceDown"); // Exiled face down
}
if (c.isAdventureCard() && c.getZone().is(ZoneType.Exile)) {
// TODO: this will basically default all exiled cards with Adventure to being "On Adventure".
// Need to figure out a better way to detect if it's actually on adventure.
newText.append("|OnAdventure");
}
}
if (zoneType == ZoneType.Battlefield || zoneType == ZoneType.Exile) {
@@ -356,7 +387,7 @@ public abstract class GameState {
newText.append("|Attacking");
GameEntity def = c.getGame().getCombat().getDefenderByAttacker(c);
if (def instanceof Card) {
newText.append(":" + def.getId());
newText.append(":").append(def.getId());
}
}
}
@@ -432,6 +463,10 @@ public abstract class GameState {
turn = Integer.parseInt(categoryValue);
}
else if (categoryName.equals("removesummoningsickness")) {
removeSummoningSickness = categoryValue.equalsIgnoreCase("true");
}
else if (categoryName.endsWith("life")) {
if (isHuman)
humanLife = Integer.parseInt(categoryValue);
@@ -513,6 +548,13 @@ public abstract class GameState {
precastAI = categoryValue;
}
else if (categoryName.endsWith("putonstack")) {
if (isHuman)
putOnStackHuman = categoryValue;
else
putOnStackAI = categoryValue;
}
else if (categoryName.endsWith("manapool")) {
if (isHuman)
humanManaPool = categoryValue;
@@ -550,8 +592,10 @@ public abstract class GameState {
cardToEnchantPlayerId.clear();
cardToRememberedId.clear();
cardToExiledWithId.clear();
cardToImprintedId.clear();
markedDamage.clear();
cardToChosenClrs.clear();
cardToChosenCards.clear();
cardToChosenType.clear();
cardToScript.clear();
cardAttackMap.clear();
@@ -591,11 +635,16 @@ public abstract class GameState {
game.getTriggerHandler().setSuppressAllTriggers(false);
// SAs added to stack cause triggers to fire, as if the relevant SAs were cast
handleAddSAsToStack(game);
// Combat only works for 1v1 matches for now (which are the only matches dev mode supports anyway)
// Note: triggers may fire during combat declarations ("whenever X attacks, ...", etc.)
if (newPhase == PhaseType.COMBAT_DECLARE_ATTACKERS || newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS) {
boolean toDeclareBlockers = newPhase == PhaseType.COMBAT_DECLARE_BLOCKERS;
handleCombat(game, newPlayerTurn, newPlayerTurn.getSingleOpponent(), toDeclareBlockers);
if (newPlayerTurn != null) {
handleCombat(game, newPlayerTurn, newPlayerTurn.getSingleOpponent(), toDeclareBlockers);
}
}
game.getStack().setResolving(false);
@@ -605,19 +654,25 @@ public abstract class GameState {
game.getPhaseHandler().devAdvanceToPhase(advPhase);
}
if (removeSummoningSickness) {
for (Card card : game.getCardsInGame()) {
card.setSickness(false);
}
}
game.getAction().checkStateEffects(true); //ensure state based effects and triggers are updated
}
private String processManaPool(ManaPool manaPool) {
String mana = "";
StringBuilder mana = new StringBuilder();
for (final byte c : MagicColor.WUBRGC) {
int amount = manaPool.getAmountOfColor(c);
for (int i = 0; i < amount; i++) {
mana += MagicColor.toShortString(c) + " ";
mana.append(MagicColor.toShortString(c)).append(" ");
}
}
return mana.trim();
return mana.toString().trim();
}
private void updateManaPool(Player p, String manaDef, boolean clearPool, boolean persistent) {
@@ -675,10 +730,10 @@ public abstract class GameState {
for (final Card c : combat.getAttackers()) {
attackedTarget.add(combat.getDefenderByAttacker(c));
}
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("Attackers", combat.getAttackers());
runParams.put("AttackingPlayer", combat.getAttackingPlayer());
runParams.put("AttackedTarget", attackedTarget);
final Map<AbilityKey, Object> runParams = Maps.newEnumMap(AbilityKey.class);
runParams.put(AbilityKey.Attackers, combat.getAttackers());
runParams.put(AbilityKey.AttackingPlayer, combat.getAttackingPlayer());
runParams.put(AbilityKey.AttackedTarget, attackedTarget);
game.getTriggerHandler().runTrigger(TriggerType.AttackersDeclared, runParams, false);
}
@@ -762,6 +817,12 @@ public abstract class GameState {
break;
}
}
if (sa.hasParam("RememberTargets")) {
for (final GameObject o : sa.getTargets().getTargets()) {
sa.getHostCard().addRemembered(o);
}
}
}
private void handleScriptExecution(final Game game) {
@@ -774,6 +835,9 @@ public abstract class GameState {
}
private void executeScript(Game game, Card c, String sPtr) {
executeScript(game, c, sPtr, false);
}
private void executeScript(Game game, Card c, String sPtr, boolean putOnStack) {
int tgtID = TARGET_NONE;
if (sPtr.contains("->")) {
String tgtDef = sPtr.substring(sPtr.lastIndexOf("->") + 2);
@@ -846,16 +910,22 @@ public abstract class GameState {
}
}
sa.setActivatingPlayer(c.getController());
if (sa != null) {
sa.setActivatingPlayer(c.getController());
}
handleScriptedTargetingForSA(game, sa, tgtID);
sa.resolve();
if (putOnStack) {
game.getStack().addAndUnfreeze(sa);
} else {
sa.resolve();
// resolve subabilities
SpellAbility subSa = sa.getSubAbility();
while (subSa != null) {
subSa.resolve();
subSa = subSa.getSubAbility();
// resolve subabilities
SpellAbility subSa = sa.getSubAbility();
while (subSa != null) {
subSa.resolve();
subSa = subSa.getSubAbility();
}
}
}
@@ -877,7 +947,28 @@ public abstract class GameState {
}
}
private void handleAddSAsToStack(final Game game) {
Player human = game.getPlayers().get(0);
Player ai = game.getPlayers().get(1);
if (putOnStackHuman != null) {
String[] spellList = TextUtil.split(putOnStackHuman, ';');
for (String spell : spellList) {
precastSpellFromCard(spell, human, game, true);
}
}
if (putOnStackAI != null) {
String[] spellList = TextUtil.split(putOnStackAI, ';');
for (String spell : spellList) {
precastSpellFromCard(spell, ai, game, true);
}
}
}
private void precastSpellFromCard(String spellDef, final Player activator, final Game game) {
precastSpellFromCard(spellDef, activator, game, false);
}
private void precastSpellFromCard(String spellDef, final Player activator, final Game game, final boolean putOnStack) {
int tgtID = TARGET_NONE;
String scriptID = "";
@@ -891,18 +982,31 @@ public abstract class GameState {
spellDef = spellDef.substring(0, spellDef.indexOf("->")).trim();
}
PaperCard pc = StaticData.instance().getCommonCards().getCard(spellDef);
Card c = null;
if (pc == null) {
System.err.println("ERROR: Could not find a card with name " + spellDef + " to precast!");
return;
if (StringUtils.isNumeric(spellDef)) {
// Precast from a specific host
c = idToCard.get(Integer.parseInt(spellDef));
if (c == null) {
System.err.println("ERROR: Could not find a card with ID " + spellDef + " to precast!");
return;
}
} else {
// Precast from a card by name
PaperCard pc = StaticData.instance().getCommonCards().getCard(spellDef);
if (pc == null) {
System.err.println("ERROR: Could not find a card with name " + spellDef + " to precast!");
return;
}
c = Card.fromPaperCard(pc, activator);
}
Card c = Card.fromPaperCard(pc, activator);
SpellAbility sa = null;
if (!scriptID.isEmpty()) {
executeScript(game, c, scriptID);
executeScript(game, c, scriptID, putOnStack);
return;
}
@@ -911,7 +1015,11 @@ public abstract class GameState {
handleScriptedTargetingForSA(game, sa, tgtID);
sa.resolve();
if (putOnStack) {
game.getStack().addAndUnfreeze(sa);
} else {
sa.resolve();
}
}
private void handleMarkedDamage() {
@@ -947,6 +1055,12 @@ public abstract class GameState {
Card c = entry.getKey();
c.setNamedCard(entry.getValue());
}
// Chosen cards
for (Entry<Card, CardCollection> entry : cardToChosenCards.entrySet()) {
Card c = entry.getKey();
c.setChosenCards(entry.getValue());
}
}
private void handleCardAttachments() {
@@ -977,11 +1091,11 @@ public abstract class GameState {
}
private void applyCountersToGameEntity(GameEntity entity, String counterString) {
entity.setCounters(Maps.<CounterType, Integer>newEnumMap(CounterType.class));
entity.setCounters(Maps.newHashMap());
String[] allCounterStrings = counterString.split(",");
for (final String counterPair : allCounterStrings) {
String[] pair = counterPair.split("=", 2);
entity.addCounter(CounterType.valueOf(pair[0]), Integer.parseInt(pair[1]), null, false, false);
entity.addCounter(CounterType.getType(pair[0]), Integer.parseInt(pair[1]), null, false, false, null);
}
}
@@ -994,7 +1108,7 @@ public abstract class GameState {
p.getZone(zt).removeAllCards(true);
}
Map<ZoneType, CardCollectionView> playerCards = new EnumMap<ZoneType, CardCollectionView>(ZoneType.class);
Map<ZoneType, CardCollectionView> playerCards = new EnumMap<>(ZoneType.class);
for (Entry<ZoneType, String> kv : cardTexts.entrySet()) {
String value = kv.getValue();
playerCards.put(kv.getKey(), processCardsForZone(value.isEmpty() ? new String[0] : value.split(";"), p));
@@ -1007,7 +1121,7 @@ public abstract class GameState {
for (Entry<ZoneType, CardCollectionView> kv : playerCards.entrySet()) {
PlayerZone zone = p.getZone(kv.getKey());
if (kv.getKey() == ZoneType.Battlefield) {
List<Card> cards = new ArrayList<Card>();
List<Card> cards = new ArrayList<>();
for (final Card c : kv.getValue()) {
if (c.isToken()) {
cards.add(c);
@@ -1023,7 +1137,7 @@ public abstract class GameState {
Map<CounterType, Integer> counters = c.getCounters();
// Note: Not clearCounters() since we want to keep the counters
// var as-is.
c.setCounters(Maps.<CounterType, Integer>newEnumMap(CounterType.class));
c.setCounters(Maps.newHashMap());
if (c.isAura()) {
// dummy "enchanting" to indicate that the card will be force-attached elsewhere
// (will be overridden later, so the actual value shouldn't matter)
@@ -1047,7 +1161,6 @@ public abstract class GameState {
zone.setCards(kv.getValue());
}
}
}
/**
@@ -1108,7 +1221,7 @@ public abstract class GameState {
} else if (info.startsWith("SummonSick")) {
c.setSickness(true);
} else if (info.startsWith("FaceDown")) {
c.setState(CardStateName.FaceDown, true);
c.turnFaceDown(true);
if (info.endsWith("Manifested")) {
c.setManifested(true);
}
@@ -1118,6 +1231,16 @@ public abstract class GameState {
c.setState(CardStateName.Flipped, true);
} else if (info.startsWith("Meld")) {
c.setState(CardStateName.Meld, true);
} else if (info.startsWith("OnAdventure")) {
String abAdventure = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
AbilitySub saAdventure = (AbilitySub)AbilityFactory.getAbility(abAdventure, c);
StringBuilder sbPlay = new StringBuilder();
sbPlay.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure");
sbPlay.append(" | AffectedZone$ Exile | Description$ You may cast the card.");
saAdventure.setSVar("Play", sbPlay.toString());
saAdventure.setActivatingPlayer(c.getOwner());
saAdventure.resolve();
c.setExiledWith(c); // This seems to be the way it's set up internally. Potentially not needed here?
} else if (info.startsWith("IsCommander")) {
// TODO: This doesn't seem to properly restore the ability to play the commander. Why?
c.setCommander(true);
@@ -1133,6 +1256,14 @@ public abstract class GameState {
// TODO: improve this for game states with more than two players
String tgt = info.substring(info.indexOf(':') + 1);
cardToEnchantPlayerId.put(c, tgt.equalsIgnoreCase("AI") ? TARGET_AI : TARGET_HUMAN);
} else if (info.startsWith("Owner:")) {
// TODO: improve this for game states with more than two players
Player human = player.getGame().getPlayers().get(0);
Player ai = player.getGame().getPlayers().get(1);
String owner = info.substring(info.indexOf(':') + 1);
Player controller = c.getController();
c.setOwner(owner.equalsIgnoreCase("AI") ? ai : human);
c.setController(controller, c.getGame().getNextTimestamp());
} else if (info.startsWith("Ability:")) {
String abString = info.substring(info.indexOf(':') + 1).toLowerCase();
c.addSpellAbility(AbilityFactory.getAbility(abilityString.get(abString), c));
@@ -1143,6 +1274,13 @@ public abstract class GameState {
cardToChosenClrs.put(c, Arrays.asList(info.substring(info.indexOf(':') + 1).split(",")));
} else if (info.startsWith("ChosenType:")) {
cardToChosenType.put(c, info.substring(info.indexOf(':') + 1));
} else if (info.startsWith("ChosenCards:")) {
CardCollection chosen = new CardCollection();
String[] idlist = info.substring(info.indexOf(':') + 1).split(",");
for (String id : idlist) {
chosen.add(idToCard.get(Integer.parseInt(id)));
}
cardToChosenCards.put(c, chosen);
} else if (info.startsWith("NamedCard:")) {
cardToNamedCard.put(c, info.substring(info.indexOf(':') + 1));
} else if (info.startsWith("ExecuteScript:")) {

View File

@@ -25,6 +25,7 @@ import forge.game.card.*;
import forge.game.card.CardPredicates.Presets;
import forge.game.combat.Combat;
import forge.game.cost.*;
import forge.game.keyword.KeywordInterface;
import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid;
@@ -91,7 +92,7 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public List<PaperCard> sideboard(Deck deck, GameType gameType) {
public List<PaperCard> sideboard(Deck deck, GameType gameType, String message) {
// AI does not know how to sideboard
return null;
}
@@ -144,12 +145,12 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public CardCollectionView chooseCardsForEffect(CardCollectionView sourceList, SpellAbility sa, String title, int min, int max, boolean isOptional) {
return brains.chooseCardsForEffect(sourceList, sa, min, max, isOptional);
public CardCollectionView chooseCardsForEffect(CardCollectionView sourceList, SpellAbility sa, String title, int min, int max, boolean isOptional, Map<String, Object> params) {
return brains.chooseCardsForEffect(sourceList, sa, min, max, isOptional, params);
}
@Override
public <T extends GameEntity> T chooseSingleEntityForEffect(FCollectionView<T> optionList, DelayedReveal delayedReveal, SpellAbility sa, String title, boolean isOptional, Player targetedPlayer) {
public <T extends GameEntity> T chooseSingleEntityForEffect(FCollectionView<T> optionList, DelayedReveal delayedReveal, SpellAbility sa, String title, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
if (delayedReveal != null) {
reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix());
}
@@ -157,19 +158,47 @@ public class PlayerControllerAi extends PlayerController {
if (null == api) {
throw new InvalidParameterException("SA is not api-based, this is not supported yet");
}
return SpellApiToAi.Converter.get(api).chooseSingleEntity(player, sa, (FCollection<T>)optionList, isOptional, targetedPlayer);
return SpellApiToAi.Converter.get(api).chooseSingleEntity(player, sa, (FCollection<T>)optionList, isOptional, targetedPlayer, params);
}
@Override
public <T extends GameEntity> List<T> chooseEntitiesForEffect(
FCollectionView<T> optionList, DelayedReveal delayedReveal, SpellAbility sa, String title,
Player targetedPlayer) {
// this isn't used
return null;
FCollectionView<T> optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title,
Player targetedPlayer, Map<String, Object> params) {
if (delayedReveal != null) {
reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix());
}
FCollection<T> remaining = new FCollection<>(optionList);
List<T> selecteds = new ArrayList<>();
T selected;
do {
selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer, params);
if ( selected != null ) {
remaining.remove(selected);
selecteds.add(selected);
}
} while ( (selected != null ) && (selecteds.size() < max) );
return selecteds;
}
@Override
public SpellAbility chooseSingleSpellForEffect(java.util.List<SpellAbility> spells, SpellAbility sa, String title,
public List<SpellAbility> chooseSpellAbilitiesForEffect(List<SpellAbility> spells, SpellAbility sa, String title,
int num, Map<String, Object> params) {
List<SpellAbility> remaining = Lists.newArrayList(spells);
List<SpellAbility> selecteds = Lists.newArrayList();
SpellAbility selected;
do {
selected = chooseSingleSpellForEffect(remaining, sa, title, params);
if ( selected != null ) {
remaining.remove(selected);
selecteds.add(selected);
}
} while ( (selected != null ) && (selecteds.size() < num) );
return selecteds;
}
@Override
public SpellAbility chooseSingleSpellForEffect(List<SpellAbility> spells, SpellAbility sa, String title,
Map<String, Object> params) {
ApiType api = sa.getApi();
if (null == api) {
@@ -195,15 +224,13 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public boolean confirmTrigger(WrappedAbility wrapper, Map<String, String> triggerParams, boolean isMandatory) {
public boolean confirmTrigger(WrappedAbility wrapper) {
final SpellAbility sa = wrapper.getWrappedAbility();
//final Trigger regtrig = wrapper.getTrigger();
if (ComputerUtilAbility.getAbilitySourceName(sa).equals("Deathmist Raptor")) {
return true;
}
if (triggerParams.containsKey("DelayedTrigger") || isMandatory) {
//TODO: The only card with an optional delayed trigger is Shirei, Shizo's Caretaker,
// needs to be expanded when a more difficult cards comes up
if (wrapper.isMandatory()) {
return true;
}
// Store/replace target choices more properly to get this SA cleared.
@@ -341,8 +368,7 @@ public class PlayerControllerAi extends PlayerController {
@Override
public boolean apply(Card card) {
// need a custom predicate here since Volrath's Shapeshifter may have a different name OTB
return card.getName().equals("Volrath's Shapeshifter")
|| card.getStates().contains(CardStateName.OriginalText) && card.getState(CardStateName.OriginalText).getName().equals("Volrath's Shapeshifter");
return card.getOriginalState(CardStateName.Original).getName().equals("Volrath's Shapeshifter");
}
}).isEmpty()) {
int bestValue = 0;
@@ -480,7 +506,7 @@ public class PlayerControllerAi extends PlayerController {
Card toDiscard = Aggregates.itemWithMin(cardsOfType, CardPredicates.Accessors.fnGetCmc);
return new CardCollection(toDiscard);
}
return getAi().getCardsToDiscard(num, (String[])null, sa);
return getAi().getCardsToDiscard(num, null, sa);
}
@@ -490,20 +516,19 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public String chooseSomeType(String kindOfType, SpellAbility sa, List<String> validTypes, List<String> invalidTypes, boolean isOptional) {
String chosen = ComputerUtil.chooseSomeType(player, kindOfType, sa.getParam("AILogic"), invalidTypes);
if (StringUtils.isBlank(chosen) && !validTypes.isEmpty())
{
chosen = validTypes.get(0);
System.err.println("AI has no idea how to choose " + kindOfType +", defaulting to 1st element: chosen");
public String chooseSomeType(String kindOfType, SpellAbility sa, Collection<String> validTypes, List<String> invalidTypes, boolean isOptional) {
String chosen = ComputerUtil.chooseSomeType(player, kindOfType, sa.getParam("AILogic"), validTypes, invalidTypes);
if (StringUtils.isBlank(chosen) && !validTypes.isEmpty()) {
chosen = validTypes.iterator().next();
System.err.println("AI has no idea how to choose " + kindOfType +", defaulting to arbitrary element: chosen");
}
game.getAction().nofityOfValue(sa, player, chosen, player);
return chosen;
}
@Override
public Object vote(SpellAbility sa, String prompt, List<Object> options, ListMultimap<Object, Player> votes) {
return ComputerUtil.vote(player, options, sa, votes);
public Object vote(SpellAbility sa, String prompt, List<Object> options, ListMultimap<Object, Player> votes, Player forPlayer) {
return ComputerUtil.vote(player, options, sa, votes, forPlayer);
}
@Override
@@ -511,15 +536,66 @@ public class PlayerControllerAi extends PlayerController {
return brains.aiShouldRun(replacementEffect, effectSA);
}
@Override
public boolean mulliganKeepHand(Player firstPlayer, int cardsToReturn) {
return !ComputerUtil.wantMulligan(player, cardsToReturn);
}
@Override
public CardCollectionView getCardsToMulligan(Player firstPlayer) {
if (!ComputerUtil.wantMulligan(player)) {
if (!ComputerUtil.wantMulligan(player, 0)) {
return null;
}
return player.getCardsIn(ZoneType.Hand);
}
@Override
public CardCollectionView londonMulliganReturnCards(final Player mulliganingPlayer, int cardsToReturn) {
// TODO This is better than it was before, but still suboptimal (but fast).
// Maybe score a bunch of hands based on projected hand size and return the "duds"
CardCollection hand = new CardCollection(player.getCardsIn(ZoneType.Hand));
int numLandsDesired = (mulliganingPlayer.getStartingHandSize() - cardsToReturn) / 2;
CardCollection toReturn = new CardCollection();
for (int i = 0; i < cardsToReturn; i++) {
hand.removeAll(toReturn);
CardCollection landsInHand = CardLists.filter(hand, Presets.LANDS);
int numLandsInHand = landsInHand.size() - CardLists.filter(toReturn, Presets.LANDS).size();
// If we're flooding with lands, get rid of the worst land we have
if (numLandsInHand > 0 && numLandsInHand > numLandsDesired) {
CardCollection producingLands = CardLists.filter(landsInHand, Presets.LANDS_PRODUCING_MANA);
CardCollection nonProducingLands = CardLists.filter(landsInHand, Predicates.not(Presets.LANDS_PRODUCING_MANA));
Card worstLand = nonProducingLands.isEmpty() ? ComputerUtilCard.getWorstLand(producingLands)
: ComputerUtilCard.getWorstLand(nonProducingLands);
toReturn.add(worstLand);
continue;
}
// See if we'd scry something to the bottom in this situation. If we want to, probably get rid of it.
CardCollection scryBottom = new CardCollection();
for (Card c : hand) {
// Lands are evaluated separately above, factoring in the number of cards to be returned to the library
if (!c.isLand() && !toReturn.contains(c) && !willPutCardOnTop(c)) {
scryBottom.add(c);
}
}
if (!scryBottom.isEmpty()) {
CardLists.sortByCmcDesc(scryBottom);
toReturn.add(scryBottom.getFirst()); // assume the max CMC one is worse since we're not guaranteed to have lands for it
continue;
}
// If we don't want to scry anything to the bottom, remove the worst card that we have in order to satisfy
// the requirement
toReturn.add(ComputerUtilCard.getWorstAI(hand));
}
return CardCollection.getView(toReturn);
}
@Override
public void declareAttackers(Player attacker, Combat combat) {
brains.declareAttackers(attacker, combat);
@@ -541,6 +617,7 @@ public class PlayerControllerAi extends PlayerController {
if (sa instanceof LandAbility) {
if (sa.canPlay()) {
sa.resolve();
game.updateLastStateForCard(sa.getHostCard());
}
} else {
ComputerUtil.handlePlayingSpellAbility(player, sa, game);
@@ -549,7 +626,7 @@ public class PlayerControllerAi extends PlayerController {
@Override
public CardCollection chooseCardsToDiscardToMaximumHandSize(int numDiscard) {
return brains.getCardsToDiscard(numDiscard, (String[])null, null);
return brains.getCardsToDiscard(numDiscard, null, null);
}
@Override
@@ -606,7 +683,7 @@ public class PlayerControllerAi extends PlayerController {
throw new InvalidParameterException("SA is not api-based, this is not supported yet");
}
return SpellApiToAi.Converter.get(api).chooseNumber(player, sa, min, max, params);
};
}
@Override
public int chooseNumber(SpellAbility sa, String title, List<Integer> options, Player relatedPlayer) {
@@ -666,14 +743,15 @@ public class PlayerControllerAi extends PlayerController {
return true;
} else {
Card rem = (Card) source.getFirstRemembered();
if (!rem.getZone().is(ZoneType.Battlefield)) {
if (!rem.isInZone(ZoneType.Battlefield)) {
return true;
}
}
break;
case "BetterTgtThanRemembered":
if (source.getRememberedCount() > 0) {
Card rem = (Card) source.getFirstRemembered();
if (!rem.getZone().is(ZoneType.Battlefield)) {
if (!rem.isInZone(ZoneType.Battlefield)) {
return true;
}
for (Card c : source.getController().getCreaturesInPlay()) {
@@ -683,6 +761,7 @@ public class PlayerControllerAi extends PlayerController {
}
return false;
}
break;
default:
break;
}
@@ -690,6 +769,7 @@ public class PlayerControllerAi extends PlayerController {
return defaultVal != null && defaultVal.booleanValue();
case UntapTimeVault: return false; // TODO Should AI skip his turn for time vault?
case LeftOrRight: return brains.chooseDirection(sa);
case OddsOrEvens: return brains.chooseEvenOdd(sa); // false is Odd, true is Even
default:
return MyRandom.getRandom().nextBoolean();
}
@@ -801,8 +881,8 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, Map<String, Object> runParams) {
return brains.chooseSingleReplacementEffect(possibleReplacers, runParams);
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers) {
return brains.chooseSingleReplacementEffect(possibleReplacers);
}
@Override
@@ -876,6 +956,10 @@ public class PlayerControllerAi extends PlayerController {
final Card source = sa.getHostCard();
final Ability emptyAbility = new AbilityStatic(source, cost, sa.getTargetRestrictions()) { @Override public void resolve() { } };
emptyAbility.setActivatingPlayer(player);
emptyAbility.setTriggeringObjects(sa.getTriggeringObjects());
for (String sVar : sa.getSVars()) {
emptyAbility.setSVar(sVar, sa.getSVar(sVar));
}
if (ComputerUtilCost.willPayUnlessCost(sa, player, cost, alreadyPaid, allPayers) && ComputerUtilCost.canPayCost(emptyAbility, player)) {
ComputerUtil.playNoStack(player, emptyAbility, game); // AI needs something to resolve to pay that cost
return true;
@@ -927,11 +1011,6 @@ public class PlayerControllerAi extends PlayerController {
return true;
}
@Override
public Map<GameEntity, CounterType> chooseProliferation(SpellAbility sa) {
return brains.chooseProliferation(sa);
}
@Override
public boolean chooseTargetsFor(SpellAbility currentAbility) {
return brains.doTrigger(currentAbility, true);
@@ -1008,7 +1087,7 @@ public class PlayerControllerAi extends PlayerController {
}
});
} else {
return new HashMap<Card, ManaCostShard>();
return new HashMap<>();
}
}
@@ -1034,7 +1113,7 @@ public class PlayerControllerAi extends PlayerController {
public String chooseCardName(SpellAbility sa, Predicate<ICardFace> cpp, String valid, String message) {
if (sa.hasParam("AILogic")) {
CardCollectionView aiLibrary = player.getCardsIn(ZoneType.Library);
CardCollectionView oppLibrary = ComputerUtil.getOpponentFor(player).getCardsIn(ZoneType.Library);
CardCollectionView oppLibrary = player.getWeakestOpponent().getCardsIn(ZoneType.Library);
final Card source = sa.getHostCard();
final String logic = sa.getParam("AILogic");
@@ -1059,7 +1138,8 @@ public class PlayerControllerAi extends PlayerController {
CardCollectionView cards = CardLists.getValidCards(aiLibrary, "Creature", player, sa.getHostCard());
return ComputerUtilCard.getMostProminentCardName(cards);
} else if (logic.equals("BestCreatureInComputerDeck")) {
return ComputerUtilCard.getBestCreatureAI(aiLibrary).getName();
Card bestCreature = ComputerUtilCard.getBestCreatureAI(aiLibrary);
return bestCreature != null ? bestCreature.getName() : "Plains";
} else if (logic.equals("RandomInComputerDeck")) {
return Aggregates.random(aiLibrary).getName();
} else if (logic.equals("MostProminentSpellInComputerDeck")) {
@@ -1090,7 +1170,7 @@ public class PlayerControllerAi extends PlayerController {
@Override
public List<Card> chooseCardsForZoneChange(
ZoneType destination, List<ZoneType> origin, SpellAbility sa, CardCollection fetchList,
ZoneType destination, List<ZoneType> origin, SpellAbility sa, CardCollection fetchList, int min, int max,
DelayedReveal delayedReveal, String selectPrompt, Player decider) {
// this isn't used
return null;
@@ -1150,12 +1230,24 @@ public class PlayerControllerAi extends PlayerController {
public List<OptionalCostValue> chooseOptionalCosts(SpellAbility chosen,
List<OptionalCostValue> optionalCostValues) {
List<OptionalCostValue> chosenOptCosts = Lists.newArrayList();
Cost costSoFar = chosen.getPayCosts() != null ? chosen.getPayCosts().copy() : Cost.Zero;
Cost costSoFar = chosen.getPayCosts().copy();
for (OptionalCostValue opt : optionalCostValues) {
// Choose the optional cost if it can be paid (to be improved later, check for playability and other conditions perhaps)
Cost fullCost = opt.getCost().copy().add(costSoFar);
SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost);
// Playability check for Kicker
if (opt.getType() == OptionalCost.Kicker1 || opt.getType() == OptionalCost.Kicker2) {
SpellAbility kickedSaCopy = fullCostSa.copy();
kickedSaCopy.addOptionalCost(opt.getType());
Card copy = CardUtil.getLKICopy(chosen.getHostCard());
copy.addOptionalCostPaid(opt.getType());
if (ComputerUtilCard.checkNeedsToPlayReqs(copy, kickedSaCopy) != AiPlayDecision.WillPlay) {
continue; // don't choose kickers we don't want to play
}
}
if (ComputerUtilCost.canPayCost(fullCostSa, player)) {
chosenOptCosts.add(opt);
costSoFar.add(opt.getCost());
@@ -1164,4 +1256,47 @@ public class PlayerControllerAi extends PlayerController {
return chosenOptCosts;
}
@Override
public boolean confirmMulliganScry(Player p) {
// Always true?
return true;
}
@Override
public int chooseNumberForKeywordCost(SpellAbility sa, Cost cost, KeywordInterface keyword, String prompt,
int max) {
// TODO: improve the logic depending on the keyword and the playability of the cost-modified SA (enough targets present etc.)
int chosenAmount = 0;
Cost costSoFar = sa.getPayCosts().copy();
for (int i = 0; i < max; i++) {
costSoFar.add(cost);
SpellAbility fullCostSa = sa.copyWithDefinedCost(costSoFar);
if (ComputerUtilCost.canPayCost(fullCostSa, player)) {
chosenAmount++;
} else {
break;
}
}
return chosenAmount;
}
@Override
public CardCollection chooseCardsForEffectMultiple(Map<String, CardCollection> validMap, SpellAbility sa, String title, boolean isOptional) {
CardCollection choices = new CardCollection();
for (String mapKey: validMap.keySet()) {
CardCollection cc = validMap.get(mapKey);
cc.removeAll(choices);
Card chosen = ComputerUtilCard.getBestAI(cc);
if (chosen != null) {
choices.add(chosen);
}
}
return choices;
}
}

View File

@@ -94,12 +94,8 @@ public class SpecialCardAi {
int minCMC = isLowCMCDeck ? 3 : 4; // probably not worth wasting a lotus on a low-CMC spell (<4 CMC), except in low-CMC decks, where 3 CMC may be fine
int paidCMC = cost.getConvertedManaCost();
if (paidCMC < minCMC) {
if (paidCMC == 3 && numManaSrcs < 3) {
// if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway
return true;
}
return false;
// if it's a CMC 3 spell and we're more than one mana source short for it, might be worth it anyway
return paidCMC == 3 && numManaSrcs < 3;
}
return true;
@@ -172,7 +168,7 @@ public class SpecialCardAi {
}
}
return best.getName();
return best != null ? best.getName() : "";
}
}
@@ -218,11 +214,7 @@ public class SpecialCardAi {
}
}
if (ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker) {
return true;
} else {
return false;
}
return ai.getLife() <= sa.getHostCard().getNetPower() && !hasUsefulBlocker;
}
public static int getSacThreshold() {
@@ -335,7 +327,7 @@ public class SpecialCardAi {
boolean canTrample = source.hasKeyword(Keyword.TRAMPLE);
if (!isBlocking && combat.getDefenderByAttacker(source) instanceof Card) {
int loyalty = ((Card)combat.getDefenderByAttacker(source)).getCounters(CounterType.LOYALTY);
int loyalty = combat.getDefenderByAttacker(source).getCounters(CounterEnumType.LOYALTY);
int totalDamageToPW = 0;
for (Card atk : (combat.getAttackersOf(combat.getDefenderByAttacker(source)))) {
if (combat.isUnblocked(atk)) {
@@ -411,15 +403,11 @@ public class SpecialCardAi {
Pair<Integer, Integer> predictedPT = getPumpedPT(ai, source.getNetCombatDamage(), source.getNetToughness());
int oppT = Aggregates.sum(potentialBlockers, CardPredicates.Accessors.fnGetNetToughness);
if (potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife)) {
return true;
}
return false;
return potentialBlockers.isEmpty() || (source.hasKeyword(Keyword.TRAMPLE) && predictedPT.getLeft() - oppT >= oppLife);
}
public static Pair<Integer, Integer> getPumpedPT(Player ai, int power, int toughness) {
int energy = ai.getCounters(CounterType.ENERGY);
int energy = ai.getCounters(CounterEnumType.ENERGY);
if (energy > 0) {
int numActivations = energy / 3;
for (int i = 0; i < numActivations; i++) {
@@ -501,6 +489,49 @@ public class SpecialCardAi {
}
}
// Gideon Blackblade
public static class GideonBlackblade {
public static boolean consider(final Player ai, final SpellAbility sa) {
CardCollectionView otb = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa));
if (!otb.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getBestAI(otb));
}
return true;
}
public static SpellAbility chooseSpellAbility(final Player ai, final SpellAbility sa, final List<SpellAbility> spells) {
// TODO: generalize and improve this so that it acts in a more reasonable way and can potentially be used for other cards too
List<SpellAbility> best = Lists.newArrayList();
List<SpellAbility> possible = Lists.newArrayList();
Card tgtCard = sa.getTargetCard();
if (tgtCard != null) {
for (SpellAbility sp : spells) {
if (SpellApiToAi.Converter.get(sp.getApi()).canPlayAIWithSubs(ai, sp)) {
best.add(sp); // these SAs are prioritized since the AI sees a reason to play them now
}
final List<String> keywords = sp.hasParam("KW") ? Arrays.asList(sp.getParam("KW").split(" & "))
: Lists.newArrayList();
for (String kw : keywords) {
if (!tgtCard.hasKeyword(kw)) {
if ("Indestructible".equals(kw) && ai.getOpponents().getCreaturesInPlay().isEmpty()) {
continue; // nothing to damage or kill the creature with
}
possible.add(sp); // these SAs at least don't duplicate a keyword on the card
break;
}
}
}
}
if (!best.isEmpty()) {
return Aggregates.random(best);
} else if (!possible.isEmpty()) {
return Aggregates.random(possible);
} else {
return Aggregates.random(spells); // if worst comes to worst, it's a PW +1 ability, so do at least something
}
}
}
// Guilty Conscience
public static class GuiltyConscience {
public static Card getBestAttachTarget(final Player ai, final SpellAbility sa, final List<Card> list) {
@@ -525,10 +556,7 @@ public class SpecialCardAi {
@Override
public boolean apply(final Card c) {
// Don't enchant creatures that can survive
if (!c.canBeDestroyed() || c.getNetCombatDamage() < c.getNetToughness() || c.isEnchantedBy("Guilty Conscience")) {
return false;
}
return true;
return c.canBeDestroyed() && c.getNetCombatDamage() >= c.getNetToughness() && !c.isEnchantedBy("Guilty Conscience");
}
});
chosen = ComputerUtilCard.getBestCreatureAI(creatures);
@@ -680,7 +708,7 @@ public class SpecialCardAi {
// if there's another reanimator card currently suspended, don't cast a new one until the previous
// one resolves, otherwise the reanimation attempt will be ruined (e.g. Living End)
for (Card ex : ai.getCardsIn(ZoneType.Exile)) {
if (ex.hasSVar("IsReanimatorCard") && ex.getCounters(CounterType.TIME) > 0) {
if (ex.hasSVar("IsReanimatorCard") && ex.getCounters(CounterEnumType.TIME) > 0) {
return false;
}
}
@@ -739,7 +767,7 @@ public class SpecialCardAi {
Player controller = c.getController();
boolean wasCaged = false;
for (Card caged : CardLists.filter(controller.getCardsIn(ZoneType.Exile),
CardPredicates.hasCounter(CounterType.CAGE))) {
CardPredicates.hasCounter(CounterEnumType.CAGE))) {
if (c.getName().equals(caged.getName())) {
wasCaged = true;
break;
@@ -868,15 +896,14 @@ public class SpecialCardAi {
}
} else if (blackViseOTB && computerHandSize + exiledWithNecro - 1 >= 4) {
// try not to overdraw in presence of Black Vise
return false;
return false;
} else if (computerHandSize + exiledWithNecro - 1 >= maxHandSize) {
// Only draw until we reach max hand size
return false;
} else if (!ph.isPlayerTurn(ai) || !ph.is(PhaseType.MAIN2)) {
// Only activate in AI's own turn (sans the exception above)
return false;
}
}
return true;
}
}
@@ -898,11 +925,7 @@ public class SpecialCardAi {
}
// Maybe use it for some important high-impact spells even if there are more cards in hand?
if (ai.getCardsIn(ZoneType.Hand).size() > 1 && !hasEnsnaringBridgeEffect) {
return false;
}
return true;
return ai.getCardsIn(ZoneType.Hand).size() <= 1 || hasEnsnaringBridgeEffect;
}
}
@@ -1050,7 +1073,7 @@ public class SpecialCardAi {
// Sarkhan the Mad
public static class SarkhanTheMad {
public static boolean considerDig(final Player ai, final SpellAbility sa) {
return sa.getHostCard().getCounters(CounterType.LOYALTY) == 1;
return sa.getHostCard().getCounters(CounterEnumType.LOYALTY) == 1;
}
public static boolean considerMakeDragon(final Player ai, final SpellAbility sa) {
@@ -1083,6 +1106,44 @@ public class SpecialCardAi {
}
}
// Sorin, Vengeful Bloodlord
public static class SorinVengefulBloodlord {
public static boolean consider(final Player ai, final SpellAbility sa) {
int loyalty = sa.getHostCard().getCounters(CounterEnumType.LOYALTY);
CardCollection creaturesToGet = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard),
Predicates.and(CardPredicates.Presets.CREATURES, CardPredicates.lessCMC(loyalty - 1), new Predicate<Card>() {
@Override
public boolean apply(Card card) {
final Card copy = CardUtil.getLKICopy(card);
ComputerUtilCard.applyStaticContPT(ai.getGame(), copy, null);
return copy.getNetToughness() > 0;
}
}));
CardLists.sortByCmcDesc(creaturesToGet);
if (creaturesToGet.isEmpty()) {
return false;
}
// pick the best creature that will stay on the battlefield
Card best = creaturesToGet.getFirst();
for (Card c : creaturesToGet) {
if (best != c && ComputerUtilCard.evaluateCreature(c, true, false) >
ComputerUtilCard.evaluateCreature(best, true, false)) {
best = c;
}
}
if (best != null) {
sa.resetTargets();
sa.getTargets().add(best);
return true;
}
return false;
}
}
// Survival of the Fittest
public static class SurvivalOfTheFittest {
public static Card considerDiscardTarget(final Player ai) {
@@ -1150,7 +1211,7 @@ public class SpecialCardAi {
// no options with smaller CMC, so discard the one that is harder to cast for the one that is
// easier to cast right now, but only if the best card in the library is at least CMC 3
// (probably not worth it to grab low mana cost cards this way)
if (maxCMC != null && maxCMC.getCMC() < bestInLib.getCMC() && bestInLib.getCMC() >= 3) {
if (maxCMC != null && bestInLib != null && maxCMC.getCMC() < bestInLib.getCMC() && bestInLib.getCMC() >= 3) {
return maxCMC;
}
// We appear to be playing Reanimator (or we have a reanimator card in hand already), so it's
@@ -1229,12 +1290,28 @@ public class SpecialCardAi {
}
}
if (aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD) {
// use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand
return true;
// use in case we're getting low on cards or if we're significantly behind our opponent in cards in hand
return aiHandSize < HAND_SIZE_THRESHOLD || maxOppHandSize - aiHandSize > HAND_SIZE_THRESHOLD;
}
}
// Timmerian Fiends
public static class TimmerianFiends {
public static boolean consider(final Player ai, final SpellAbility sa) {
final Card targeted = sa.getParentTargetingCard().getTargetCard();
if (targeted == null) {
return false;
}
return false;
if (targeted.isCreature()) {
if (ComputerUtil.aiLifeInDanger(ai, true, 0)) {
return true; // do it, hoping to save a valuable potential blocker etc.
}
return ComputerUtilCard.evaluateCreature(targeted) >= 200; // might need tweaking
} else {
// TODO: this currently compares purely by CMC. To be somehow improved, especially for stuff like the Power Nine etc.
return ComputerUtilCard.evaluatePermanentList(new CardCollection(targeted)) >= 3;
}
}
}
@@ -1261,9 +1338,7 @@ public class SpecialCardAi {
if (topGY == null
|| !topGY.isCreature()
|| ComputerUtilCard.evaluateCreature(creatHand) > ComputerUtilCard.evaluateCreature(topGY) + 80) {
if (numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0)) {
return true;
}
return numCreatsInHand > 1 || !ComputerUtilMana.canPayManaCost(creatHand.getSpellPermanent(), ai, 0);
}
}
@@ -1290,7 +1365,7 @@ public class SpecialCardAi {
Card source = sa.getHostCard();
Game game = source.getGame();
final int loyalty = source.getCounters(CounterType.LOYALTY);
final int loyalty = source.getCounters(CounterEnumType.LOYALTY);
int x = -1, best = 0;
Card single = null;
for (int i = 0; i < loyalty; i++) {
@@ -1384,8 +1459,7 @@ public class SpecialCardAi {
} else if (!ph.isPlayerTurn(ai)) {
// Only activate in AI's own turn (sans the exception above)
return false;
}
}
return true;
}
}

View File

@@ -2,6 +2,7 @@ package forge.ai;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.card.CardStateName;
import forge.card.ICardFace;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostParser;
@@ -167,7 +168,8 @@ public abstract class SpellAbilityAi {
// a mandatory SpellAbility with targeting but without candidates,
// does not need to go any deeper
if (sa.usesTargeting() && mandatory && !sa.getTargetRestrictions().hasCandidates(sa, true)) {
if (sa.usesTargeting() && mandatory && !sa.isTargetNumberValid()
&& !sa.getTargetRestrictions().hasCandidates(sa, true)) {
return false;
}
@@ -247,7 +249,8 @@ public abstract class SpellAbilityAi {
protected static boolean isSorcerySpeed(final SpellAbility sa) {
return (sa.getRootAbility().isSpell() && sa.getHostCard().isSorcery())
|| (sa.getRootAbility().isAbility() && sa.getRestrictions().isSorcerySpeed())
|| (sa.getRestrictions().isPwAbility() && !sa.getHostCard().hasKeyword("CARDNAME's loyalty abilities can be activated at instant speed."));
|| (sa.getRootAbility().isAdventure() && sa.getHostCard().getState(CardStateName.Adventure).getType().isSorcery())
|| (sa.isPwAbility() && !sa.getHostCard().hasKeyword("CARDNAME's loyalty abilities can be activated at instant speed."));
}
/**
@@ -264,7 +267,7 @@ public abstract class SpellAbilityAi {
// TODO probably also consider if winter orb or similar are out
if (sa.getPayCosts() == null || sa instanceof AbilitySub) {
if (sa instanceof AbilitySub) {
return true; // This is only true for Drawbacks and triggers
}
@@ -276,7 +279,7 @@ public abstract class SpellAbilityAi {
return true;
}
if (sa.getRestrictions().isPwAbility() && phase.is(PhaseType.MAIN2)) {
if (sa.isPwAbility() && phase.is(PhaseType.MAIN2)) {
return true;
}
if (sa.isSpell() && !sa.isBuyBackAbility()) {
@@ -304,7 +307,7 @@ public abstract class SpellAbilityAi {
}
@SuppressWarnings("unchecked")
public <T extends GameEntity> T chooseSingleEntity(Player ai, SpellAbility sa, Collection<T> options, boolean isOptional, Player targetedPlayer) {
public <T extends GameEntity> T chooseSingleEntity(Player ai, SpellAbility sa, Collection<T> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
boolean hasPlayer = false;
boolean hasCard = false;
boolean hasPlaneswalker = false;
@@ -321,11 +324,11 @@ public abstract class SpellAbilityAi {
}
if (hasPlayer && hasPlaneswalker) {
return (T) chooseSinglePlayerOrPlaneswalker(ai, sa, (Collection<GameEntity>) options);
return (T) chooseSinglePlayerOrPlaneswalker(ai, sa, (Collection<GameEntity>) options, params);
} else if (hasCard) {
return (T) chooseSingleCard(ai, sa, (Collection<Card>) options, isOptional, targetedPlayer);
return (T) chooseSingleCard(ai, sa, (Collection<Card>) options, isOptional, targetedPlayer, params);
} else if (hasPlayer) {
return (T) chooseSinglePlayer(ai, sa, (Collection<Player>) options);
return (T) chooseSinglePlayer(ai, sa, (Collection<Player>) options, params);
}
return null;
@@ -336,17 +339,17 @@ public abstract class SpellAbilityAi {
return spells.get(0);
}
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseSingleCard is used by " + sa.getHostCard().getName() + " for " + this.getClass().getName() + ". Consider declaring an overloaded method");
return Iterables.getFirst(options, null);
}
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by " + sa.getHostCard().getName() + " for " + this.getClass().getName() + ". Consider declaring an overloaded method");
return Iterables.getFirst(options, null);
}
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable<GameEntity> options) {
protected GameEntity chooseSinglePlayerOrPlaneswalker(Player ai, SpellAbility sa, Iterable<GameEntity> options, Map<String, Object> params) {
System.err.println("Warning: default (ie. inherited from base class) implementation of chooseSinglePlayerOrPlaneswalker is used for " + this.getClass().getName() + ". Consider declaring an overloaded method");
return Iterables.getFirst(options, null);
}

View File

@@ -21,6 +21,7 @@ public enum SpellApiToAi {
.put(ApiType.AddOrRemoveCounter, CountersPutOrRemoveAi.class)
.put(ApiType.AddPhase, AddPhaseAi.class)
.put(ApiType.AddTurn, AddTurnAi.class)
.put(ApiType.Amass, AmassAi.class)
.put(ApiType.Animate, AnimateAi.class)
.put(ApiType.AnimateAll, AnimateAllAi.class)
.put(ApiType.Attach, AttachAi.class)
@@ -32,14 +33,16 @@ public enum SpellApiToAi {
.put(ApiType.BidLife, BidLifeAi.class)
.put(ApiType.Bond, BondAi.class)
.put(ApiType.Branch, AlwaysPlayAi.class)
.put(ApiType.ChangeCombatants, CannotPlayAi.class)
.put(ApiType.ChangeCombatants, ChangeCombatantsAi.class)
.put(ApiType.ChangeTargets, ChangeTargetsAi.class)
.put(ApiType.ChangeX, AlwaysPlayAi.class)
.put(ApiType.ChangeZone, ChangeZoneAi.class)
.put(ApiType.ChangeZoneAll, ChangeZoneAllAi.class)
.put(ApiType.Charm, CharmAi.class)
.put(ApiType.ChooseCard, ChooseCardAi.class)
.put(ApiType.ChooseColor, ChooseColorAi.class)
.put(ApiType.ChooseDirection, ChooseDirectionAi.class)
.put(ApiType.ChooseEvenOdd, ChooseEvenOddAi.class)
.put(ApiType.ChooseNumber, ChooseNumberAi.class)
.put(ApiType.ChoosePlayer, ChoosePlayerAi.class)
.put(ApiType.ChooseSource, ChooseSourceAi.class)
@@ -60,6 +63,7 @@ public enum SpellApiToAi {
.put(ApiType.Destroy, DestroyAi.class)
.put(ApiType.DestroyAll, DestroyAllAi.class)
.put(ApiType.Dig, DigAi.class)
.put(ApiType.DigMultiple, DigMultipleAi.class)
.put(ApiType.DigUntil, DigUntilAi.class)
.put(ApiType.Discard, DiscardAi.class)
.put(ApiType.DrainMana, DrainManaAi.class)
@@ -67,6 +71,7 @@ public enum SpellApiToAi {
.put(ApiType.EachDamage, DamageEachAi.class)
.put(ApiType.Effect, EffectAi.class)
.put(ApiType.Encode, EncodeAi.class)
.put(ApiType.EndCombatPhase, EndTurnAi.class)
.put(ApiType.EndTurn, EndTurnAi.class)
.put(ApiType.ExchangeLife, LifeExchangeAi.class)
.put(ApiType.ExchangeLifeVariant, LifeExchangeVariantAi.class)
@@ -79,7 +84,7 @@ public enum SpellApiToAi {
.put(ApiType.FlipACoin, FlipACoinAi.class)
.put(ApiType.Fog, FogAi.class)
.put(ApiType.GainControl, ControlGainAi.class)
.put(ApiType.GainControlVariant, AlwaysPlayAi.class)
.put(ApiType.GainControlVariant, ControlGainVariantAi.class)
.put(ApiType.GainLife, LifeGainAi.class)
.put(ApiType.GainOwnership, CannotPlayAi.class)
.put(ApiType.GameDrawn, CannotPlayAi.class)
@@ -87,6 +92,7 @@ public enum SpellApiToAi {
.put(ApiType.Goad, GoadAi.class)
.put(ApiType.Haunt, HauntAi.class)
.put(ApiType.ImmediateTrigger, AlwaysPlayAi.class)
.put(ApiType.Investigate, InvestigateAi.class)
.put(ApiType.LoseLife, LifeLoseAi.class)
.put(ApiType.LosesGame, GameLossAi.class)
.put(ApiType.Mana, ManaEffectAi.class)

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -22,7 +21,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
List<Card> list = CardLists.getType(opp.getCardsIn(ZoneType.Battlefield), sa.getParamOrDefault("Type", "Card"));
@@ -46,7 +45,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
@@ -57,12 +56,9 @@ public class ActivateAbilityAi extends SpellAbilityAi {
} else {
final List<Player> defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa);
if (!defined.contains(opp)) {
return false;
}
return defined.contains(opp);
}
return true;
} else {
sa.resetTargets();
sa.getTargets().add(opp);
@@ -87,7 +83,7 @@ public class ActivateAbilityAi extends SpellAbilityAi {
}
} else {
sa.resetTargets();
sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
sa.getTargets().add(ai.getWeakestOpponent());
}
return randomReturn;

View File

@@ -67,10 +67,8 @@ public class AddTurnAi extends SpellAbilityAi {
return false;
}
}
if (!StringUtils.isNumeric(sa.getParam("NumTurns"))) {
// TODO: improve ai for Sage of Hours
return false;
}
// TODO: improve ai for Sage of Hours
return StringUtils.isNumeric(sa.getParam("NumTurns"));
// not sure if the AI should be playing with cards that give the
// Human more turns.
}

View File

@@ -0,0 +1,99 @@
package forge.ai.ability;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.*;
import forge.game.card.token.TokenInfo;
import forge.game.phase.PhaseHandler;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
public class AmassAi extends SpellAbilityAi {
@Override
protected boolean checkApiLogic(Player ai, final SpellAbility sa) {
CardCollection aiArmies = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army"));
Card host = sa.getHostCard();
final Game game = ai.getGame();
if (!aiArmies.isEmpty()) {
return CardLists.count(aiArmies, CardPredicates.canReceiveCounters(CounterEnumType.P1P1)) > 0;
} else {
final String tokenScript = "b_0_0_zombie_army";
final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("Num", "1"), sa);
Card token = TokenInfo.getProtoType(tokenScript, sa, false);
if (token == null) {
return false;
}
token.setController(ai, 0);
token.setLastKnownZone(ai.getZone(ZoneType.Battlefield));
boolean result = true;
// need to check what the cards would be on the battlefield
// do not attach yet, that would cause Events
CardCollection preList = new CardCollection(token);
game.getAction().checkStaticAbilities(false, Sets.newHashSet(token), preList);
if (token.canReceiveCounters(CounterEnumType.P1P1)) {
token.setCounters(CounterEnumType.P1P1, amount);
}
if (token.isCreature() && token.getNetToughness() < 1) {
result = false;
}
//reset static abilities
game.getAction().checkStaticAbilities(false);
return result;
}
}
@Override
protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) {
// TODO: Special check for instant speed logic? Something like Lazotep Plating.
/*
boolean isInstant = sa.getRestrictions().isInstantSpeed();
CardCollection aiArmies = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army"));
if (isInstant) {
}
*/
return true;
}
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
return mandatory || checkApiLogic(ai, sa);
}
@Override
public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
return true;
}
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
Iterable<Card> better = CardLists.filter(options, CardPredicates.canReceiveCounters(CounterEnumType.P1P1));
if (Iterables.isEmpty(better)) {
better = options;
}
return ComputerUtilCard.getBestAI(better);
}
}

View File

@@ -10,6 +10,7 @@ import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
import forge.game.cost.CostPutCounter;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -77,13 +78,13 @@ public class AnimateAi extends SpellAbilityAi {
num = (num == null) ? "1" : num;
final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack);
CardCollection list = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","),
ComputerUtil.getOpponentFor(ai), topStack.getHostCard(), topStack);
ai.getWeakestOpponent(), topStack.getHostCard(), topStack);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
ComputerUtilCard.sortByEvaluateCreature(list);
if (!list.isEmpty() && list.size() == nToSac && ComputerUtilCost.canPayCost(sa, ai)) {
Card animatedCopy = becomeAnimated(source, sa);
list.add(animatedCopy);
list = CardLists.getValidCards(list, valid.split(","), ComputerUtil.getOpponentFor(ai), topStack.getHostCard(),
list = CardLists.getValidCards(list, valid.split(","), ai.getWeakestOpponent(), topStack.getHostCard(),
topStack);
list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack));
if (ComputerUtilCard.evaluateCreature(animatedCopy) < ComputerUtilCard.evaluateCreature(list.get(0))
@@ -109,11 +110,16 @@ public class AnimateAi extends SpellAbilityAi {
if (ph.is(PhaseType.MAIN2) && !sa.hasParam("Permanent") && !sa.hasParam("UntilYourNextTurn")) {
return false;
}
// Don't animate if the AI won't attack anyway
// Don't animate if the AI won't attack anyway or use as a potential blocker
Player opponent = ai.getWeakestOpponent();
// Activating as a potential blocker is only viable if it's an ability activated from a permanent, otherwise
// the AI will waste resources
boolean activateAsPotentialBlocker = sa.hasParam("UntilYourNextTurn")
&& ai.getGame().getPhaseHandler().getNextTurn() != ai
&& source.isPermanent();
if (ph.isPlayerTurn(ai) && ai.getLife() < 6 && opponent.getLife() > 6
&& Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES)
&& !sa.hasParam("AILogic") && !sa.hasParam("Permanent")) {
&& !sa.hasParam("AILogic") && !sa.hasParam("Permanent") && !activateAsPotentialBlocker) {
return false;
}
return true;
@@ -201,21 +207,16 @@ public class AnimateAi extends SpellAbilityAi {
return bFlag; // All of the defined stuff is animated, not very useful
} else {
sa.resetTargets();
if (!animateTgtAI(sa)) {
return false;
}
return animateTgtAI(sa);
}
return true;
}
@Override
public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) {
if (sa.usesTargeting()) {
sa.resetTargets();
if (!animateTgtAI(sa)) {
return false;
}
return animateTgtAI(sa);
}
return true;
@@ -245,6 +246,10 @@ public class AnimateAi extends SpellAbilityAi {
private boolean animateTgtAI(final SpellAbility sa) {
final Player ai = sa.getActivatingPlayer();
final PhaseHandler ph = ai.getGame().getPhaseHandler();
final boolean alwaysActivatePWAbility = sa.hasParam("Planeswalker")
&& sa.getPayCosts().hasSpecificCostType(CostPutCounter.class)
&& sa.getTargetRestrictions() != null
&& sa.getTargetRestrictions().getMinTargets(sa.getHostCard(), sa) == 0;
final CardType types = new CardType();
if (sa.hasParam("Types")) {
@@ -264,7 +269,7 @@ public class AnimateAi extends SpellAbilityAi {
list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, false);
// list is empty, no possible targets
if (list.isEmpty()) {
if (list.isEmpty() && !alwaysActivatePWAbility) {
return false;
}
@@ -317,7 +322,7 @@ public class AnimateAi extends SpellAbilityAi {
}
// data is empty, no good targets
if (data.isEmpty()) {
if (data.isEmpty() && !alwaysActivatePWAbility) {
return false;
}
@@ -366,10 +371,16 @@ public class AnimateAi extends SpellAbilityAi {
Integer power = null;
if (sa.hasParam("Power")) {
power = AbilityUtils.calculateAmount(source, sa.getParam("Power"), sa);
if (power == 0 && "PTByCMC".equals(sa.getParam("AILogic"))) {
power = card.getManaCost().getCMC();
}
}
Integer toughness = null;
if (sa.hasParam("Toughness")) {
toughness = AbilityUtils.calculateAmount(source, sa.getParam("Toughness"), sa);
if (toughness == 0 && "PTByCMC".equals(sa.getParam("AILogic"))) {
toughness = card.getManaCost().getCMC();
}
}
final CardType types = new CardType();
@@ -455,26 +466,19 @@ public class AnimateAi extends SpellAbilityAi {
AnimateEffectBase.doAnimate(card, sa, power, toughness, types, removeTypes, finalDesc, keywords, removeKeywords, hiddenKeywords, timestamp);
// back to duplicating AnimateEffect.resolve
// TODO will all these abilities/triggers/replacements/etc. lead to
// memory leaks or unintended effects?
// remove abilities
final List<SpellAbility> removedAbilities = Lists.newArrayList();
boolean clearAbilities = sa.hasParam("OverwriteAbilities");
boolean clearSpells = sa.hasParam("OverwriteSpells");
boolean removeAll = sa.hasParam("RemoveAllAbilities");
boolean removeIntrinsic = sa.hasParam("RemoveIntrinsicAbilities");
if (clearAbilities || clearSpells || removeAll) {
for (final SpellAbility ab : card.getSpellAbilities()) {
if (removeAll
|| (ab.isIntrinsic() && removeIntrinsic && !ab.isBasicLandAbility())
|| (ab.isAbility() && clearAbilities)
|| (ab.isSpell() && clearSpells)) {
card.removeSpellAbility(ab);
removedAbilities.add(ab);
}
}
if (clearSpells) {
removedAbilities.addAll(Lists.newArrayList(card.getSpells()));
}
if (sa.hasParam("RemoveThisAbility") && !removedAbilities.contains(sa)) {
removedAbilities.add(sa);
}
// give abilities
@@ -482,9 +486,7 @@ public class AnimateAi extends SpellAbilityAi {
if (abilities.size() > 0) {
for (final String s : abilities) {
final String actualAbility = source.getSVar(s);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, source);
addedAbilities.add(grantedAbility);
card.addSpellAbility(grantedAbility);
addedAbilities.add(AbilityFactory.getAbility(actualAbility, card));
}
}
@@ -493,8 +495,8 @@ public class AnimateAi extends SpellAbilityAi {
if (triggers.size() > 0) {
for (final String s : triggers) {
final String actualTrigger = source.getSVar(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, source, false);
addedTriggers.add(card.addTrigger(parsedTrigger));
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, card, false);
addedTriggers.add(parsedTrigger);
}
}
@@ -503,31 +505,35 @@ public class AnimateAi extends SpellAbilityAi {
if (replacements.size() > 0) {
for (final String s : replacements) {
final String actualReplacement = source.getSVar(s);
final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement,
source, false);
addedReplacements.add(card.addReplacementEffect(parsedReplacement));
final ReplacementEffect parsedReplacement = ReplacementHandler.parseReplacement(actualReplacement, card, false);
addedReplacements.add(parsedReplacement);
}
}
// suppress triggers from the animated card
final List<Trigger> removedTriggers = Lists.newArrayList();
if (sa.hasParam("OverwriteTriggers") || removeAll || removeIntrinsic) {
for (final Trigger trigger : card.getTriggers()) {
if (removeIntrinsic && !trigger.isIntrinsic()) {
continue;
}
trigger.setSuppressed(true);
removedTriggers.add(trigger);
// give static abilities (should only be used by cards to give
// itself a static ability)
final List<StaticAbility> addedStaticAbilities = Lists.newArrayList();
if (stAbs.size() > 0) {
for (final String s : stAbs) {
final String actualAbility = source.getSVar(s);
addedStaticAbilities.add(new StaticAbility(actualAbility, card));
}
}
if (removeAll || removeIntrinsic
|| !addedAbilities.isEmpty() || !removedAbilities.isEmpty() || !addedTriggers.isEmpty()
|| !addedReplacements.isEmpty() || !addedStaticAbilities.isEmpty()) {
card.addChangedCardTraits(addedAbilities, removedAbilities, addedTriggers, addedReplacements,
addedStaticAbilities, removeAll, false, removeIntrinsic, timestamp);
}
// give static abilities (should only be used by cards to give
// itself a static ability)
if (stAbs.size() > 0) {
for (final String s : stAbs) {
final String actualAbility = source.getSVar(s);
final StaticAbility stAb = card.addStaticAbility(actualAbility);
if ("Continuous".equals(stAb.getMapParams().get("Mode"))) {
if ("Continuous".equals(stAb.getParam("Mode"))) {
for (final StaticAbilityLayer layer : stAb.getLayers()) {
StaticAbilityContinuous.applyContinuousAbility(stAb, new CardCollection(card), layer);
}
@@ -548,30 +554,6 @@ public class AnimateAi extends SpellAbilityAi {
card.setSVar(name, actualsVar);
}
}
// suppress static abilities from the animated card
final List<StaticAbility> removedStatics = Lists.newArrayList();
if (sa.hasParam("OverwriteStatics") || removeAll || removeIntrinsic) {
for (final StaticAbility stAb : card.getStaticAbilities()) {
if (removeIntrinsic && !stAb.isIntrinsic()) {
continue;
}
stAb.setTemporarilySuppressed(true);
removedStatics.add(stAb);
}
}
// suppress static abilities from the animated card
final List<ReplacementEffect> removedReplacements = Lists.newArrayList();
if (sa.hasParam("OverwriteReplacements") || removeAll || removeIntrinsic) {
for (final ReplacementEffect re : card.getReplacementEffects()) {
if (removeIntrinsic && !re.isIntrinsic()) {
continue;
}
re.setTemporarilySuppressed(true);
removedReplacements.add(re);
}
}
ComputerUtilCard.applyStaticContPT(game, card, null);
}

View File

@@ -8,7 +8,7 @@ public class AnimateAllAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
return false;
return "Always".equals(sa.getParam("AILogic"));
} // end animateAllCanPlayAI()
@Override

View File

@@ -31,10 +31,7 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
public class AttachAi extends SpellAbilityAi {
@@ -123,9 +120,7 @@ public class AttachAi extends SpellAbilityAi {
return !(c.hasProtectionFrom(source) || c.hasKeyword(Keyword.SHROUD) || c.hasKeyword(Keyword.HEXPROOF));
}
});
if (targets.isEmpty()) {
return false;
}
return !targets.isEmpty();
}
return true;
@@ -233,8 +228,13 @@ public class AttachAi extends SpellAbilityAi {
boolean alternativeConsiderations = hasFloatMana || willDiscardNow || willDieNow || willRespondToStack || willCastAtEOT || willCastEarly;
if (!alternativeConsiderations && (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) || (!combat.isAttacking(attachTarget) && !combat.isBlocking(attachTarget))) {
return false;
if (!alternativeConsiderations) {
if (combat == null ||
game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
return false;
}
return combat.isAttacking(attachTarget) || combat.isBlocking(attachTarget);
}
return true;
@@ -398,7 +398,7 @@ public class AttachAi extends SpellAbilityAi {
if (!c.isCreature() && !c.getType().hasSubtype("Vehicle") && !c.isTapped()) {
// try to identify if this thing can actually tap
for (SpellAbility ab : c.getAllSpellAbilities()) {
if (ab.getPayCosts() != null && ab.getPayCosts().hasTapCost()) {
if (ab.getPayCosts().hasTapCost()) {
return true;
}
}
@@ -448,7 +448,7 @@ public class AttachAi extends SpellAbilityAi {
*/
private static Player attachToPlayerAIPreferences(final Player aiPlayer, final SpellAbility sa,
final boolean mandatory) {
List<Player> targetable = new ArrayList<Player>();
List<Player> targetable = new ArrayList<>();
for (final Player player : aiPlayer.getGame().getPlayers()) {
if (sa.canTarget(player)) {
targetable.add(player);
@@ -560,7 +560,7 @@ public class AttachAi extends SpellAbilityAi {
@Override
public boolean apply(final Card c) {
for (final SpellAbility sa : c.getSpellAbilities()) {
if (sa.isAbility() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) {
if (sa.isAbility() && sa.getPayCosts().hasTapCost()) {
return false;
}
}
@@ -852,7 +852,7 @@ public class AttachAi extends SpellAbilityAi {
int totToughness = 0;
int totPower = 0;
final List<String> keywords = new ArrayList<String>();
final List<String> keywords = new ArrayList<>();
for (final StaticAbility stAbility : attachSource.getStaticAbilities()) {
final Map<String, String> stabMap = stAbility.getMapParams();
@@ -872,15 +872,11 @@ public class AttachAi extends SpellAbilityAi {
String kws = stabMap.get("AddKeyword");
if (kws != null) {
for (final String kw : kws.split(" & ")) {
keywords.add(kw);
}
keywords.addAll(Arrays.asList(kws.split(" & ")));
}
kws = stabMap.get("AddHiddenKeyword");
if (kws != null) {
for (final String kw : kws.split(" & ")) {
keywords.add(kw);
}
keywords.addAll(Arrays.asList(kws.split(" & ")));
}
}
}
@@ -903,7 +899,7 @@ public class AttachAi extends SpellAbilityAi {
Card c = null;
if (prefList == null || prefList.isEmpty()) {
prefList = new ArrayList<Card>(list);
prefList = new ArrayList<>(list);
} else {
c = ComputerUtilCard.getBestAI(prefList);
if (c != null) {
@@ -957,7 +953,7 @@ public class AttachAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Card card = sa.getHostCard();
// Check if there are any valid targets
List<GameObject> targets = new ArrayList<GameObject>();
List<GameObject> targets = new ArrayList<>();
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
targets = AbilityUtils.getDefinedObjects(sa.getHostCard(), sa.getParam("Defined"), sa);
@@ -980,9 +976,7 @@ public class AttachAi extends SpellAbilityAi {
return false;
}
// don't equip creatures that don't gain anything
if (card.hasSVar("NonStackingAttachEffect") && newTarget.isEquippedBy(card.getName())) {
return false;
}
return !card.hasSVar("NonStackingAttachEffect") || !newTarget.isEquippedBy(card.getName());
}
}
@@ -1037,7 +1031,7 @@ public class AttachAi extends SpellAbilityAi {
Card c = null;
List<Card> magnetList = null;
String stCheck = null;
if (attachSource.isAura() || sa.hasParam("Bestow")) {
if (attachSource.isAura() || sa.isBestow()) {
stCheck = "EnchantedBy";
magnetList = CardLists.filter(list, new Predicate<Card>() {
@Override
@@ -1149,8 +1143,9 @@ public class AttachAi extends SpellAbilityAi {
int totToughness = 0;
int totPower = 0;
final List<String> keywords = new ArrayList<String>();
final List<String> keywords = new ArrayList<>();
boolean grantingAbilities = false;
boolean grantingExtraBlock = false;
for (final StaticAbility stAbility : attachSource.getStaticAbilities()) {
final Map<String, String> stabMap = stAbility.getMapParams();
@@ -1169,18 +1164,15 @@ public class AttachAi extends SpellAbilityAi {
totPower += AbilityUtils.calculateAmount(attachSource, stabMap.get("AddPower"), stAbility);
grantingAbilities |= stabMap.containsKey("AddAbility");
grantingExtraBlock |= stabMap.containsKey("CanBlockAmount") || stabMap.containsKey("CanBlockAny");
String kws = stabMap.get("AddKeyword");
if (kws != null) {
for (final String kw : kws.split(" & ")) {
keywords.add(kw);
}
keywords.addAll(Arrays.asList(kws.split(" & ")));
}
kws = stabMap.get("AddHiddenKeyword");
if (kws != null) {
for (final String kw : kws.split(" & ")) {
keywords.add(kw);
}
keywords.addAll(Arrays.asList(kws.split(" & ")));
}
}
}
@@ -1202,20 +1194,27 @@ public class AttachAi extends SpellAbilityAi {
}
//only add useful keywords unless P/T bonus is significant
if (totToughness + totPower < 4 && !keywords.isEmpty()) {
if (totToughness + totPower < 4 && (!keywords.isEmpty() || grantingExtraBlock)) {
final int pow = totPower;
final boolean extraBlock = grantingExtraBlock;
prefList = CardLists.filter(prefList, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
for (final String keyword : keywords) {
if (isUsefulAttachKeyword(keyword, c, sa, pow)) {
return true;
}
if (c.hasKeyword(Keyword.INFECT) && pow >= 2) {
// consider +2 power a significant bonus on Infect creatures
return true;
if (!keywords.isEmpty()) {
for (final String keyword : keywords) {
if (isUsefulAttachKeyword(keyword, c, sa, pow)) {
return true;
}
}
}
if (c.hasKeyword(Keyword.INFECT) && pow >= 2) {
// consider +2 power a significant bonus on Infect creatures
return true;
}
if (extraBlock && CombatUtil.canBlock(c, true) && !c.canBlockAny()) {
return true;
}
return false;
}
});
@@ -1346,7 +1345,7 @@ public class AttachAi extends SpellAbilityAi {
CardCollection prefList = list;
// Filter AI-specific targets if provided
prefList = ComputerUtil.filterAITgts(sa, aiPlayer, (CardCollection)list, true);
prefList = ComputerUtil.filterAITgts(sa, aiPlayer, list, true);
Card c = attachGeneralAI(aiPlayer, sa, prefList, mandatory, attachSource, sa.getParam("AILogic"));
@@ -1550,86 +1549,52 @@ public class AttachAi extends SpellAbilityAi {
}
if (evasive) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| !ComputerUtilCombat.canAttackNextTurn(card)
|| !canBeBlocked) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& ComputerUtilCombat.canAttackNextTurn(card)
&& canBeBlocked;
} else if (keyword.equals("Haste")) {
if (!card.hasSickness() || !ph.isPlayerTurn(sa.getActivatingPlayer()) || card.isTapped()
|| card.getNetCombatDamage() + powerBonus <= 0
|| card.hasKeyword("CARDNAME can attack as though it had haste.")
|| ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)
|| !ComputerUtilCombat.canAttackNextTurn(card)) {
return false;
}
return card.hasSickness() && ph.isPlayerTurn(sa.getActivatingPlayer()) && !card.isTapped()
&& card.getNetCombatDamage() + powerBonus > 0
&& !card.hasKeyword("CARDNAME can attack as though it had haste.")
&& !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)
&& ComputerUtilCombat.canAttackNextTurn(card);
} else if (keyword.endsWith("Indestructible")) {
return true;
} else if (keyword.endsWith("Deathtouch") || keyword.endsWith("Wither")) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card))
&& !CombatUtil.canBlock(card, true))) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& ((canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card))
|| CombatUtil.canBlock(card, true));
} else if (keyword.equals("Double Strike") || keyword.equals("Lifelink")) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true));
} else if (keyword.equals("First Strike")) {
if (card.getNetCombatDamage() + powerBonus <= 0 || card.hasKeyword(Keyword.DOUBLE_STRIKE)
|| (!ComputerUtilCombat.canAttackNextTurn(card) && !CombatUtil.canBlock(card, true))) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0 && !card.hasKeyword(Keyword.DOUBLE_STRIKE)
&& (ComputerUtilCombat.canAttackNextTurn(card) || CombatUtil.canBlock(card, true));
} else if (keyword.startsWith("Flanking")) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| !ComputerUtilCombat.canAttackNextTurn(card)
|| !canBeBlocked) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& ComputerUtilCombat.canAttackNextTurn(card)
&& canBeBlocked;
} else if (keyword.startsWith("Bushido")) {
if ((!canBeBlocked || !ComputerUtilCombat.canAttackNextTurn(card))
&& !CombatUtil.canBlock(card, true)) {
return false;
}
return (canBeBlocked && ComputerUtilCombat.canAttackNextTurn(card))
|| CombatUtil.canBlock(card, true);
} else if (keyword.equals("Trample")) {
if (card.getNetCombatDamage() + powerBonus <= 1
|| !canBeBlocked
|| !ComputerUtilCombat.canAttackNextTurn(card)) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 1
&& canBeBlocked
&& ComputerUtilCombat.canAttackNextTurn(card);
} else if (keyword.equals("Infect")) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| !ComputerUtilCombat.canAttackNextTurn(card)) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& ComputerUtilCombat.canAttackNextTurn(card);
} else if (keyword.equals("Vigilance")) {
if (card.getNetCombatDamage() + powerBonus <= 0
|| !ComputerUtilCombat.canAttackNextTurn(card)
|| !CombatUtil.canBlock(card, true)) {
return false;
}
return card.getNetCombatDamage() + powerBonus > 0
&& ComputerUtilCombat.canAttackNextTurn(card)
&& CombatUtil.canBlock(card, true);
} else if (keyword.equals("Reach")) {
if (card.hasKeyword(Keyword.FLYING) || !CombatUtil.canBlock(card, true)) {
return false;
}
} else if (keyword.endsWith("CARDNAME can block an additional creature each combat.")) {
if (!CombatUtil.canBlock(card, true) || card.hasKeyword("CARDNAME can block any number of creatures.")
|| card.hasKeyword("CARDNAME can block an additional ninety-nine creatures each combat.")) {
return false;
}
return !card.hasKeyword(Keyword.FLYING) && CombatUtil.canBlock(card, true);
} else if (keyword.equals("CARDNAME can attack as though it didn't have defender.")) {
if (!card.hasKeyword(Keyword.DEFENDER) || card.getNetCombatDamage() + powerBonus <= 0) {
return false;
}
return card.hasKeyword(Keyword.DEFENDER) && card.getNetCombatDamage() + powerBonus > 0;
} else if (keyword.equals("Shroud") || keyword.equals("Hexproof")) {
if (card.hasKeyword(Keyword.SHROUD) || card.hasKeyword(Keyword.HEXPROOF)) {
return false;
}
} else if (keyword.equals("Defender")) {
return false;
}
return true;
return !card.hasKeyword(Keyword.SHROUD) && !card.hasKeyword(Keyword.HEXPROOF);
} else return !keyword.equals("Defender");
}
/**
@@ -1650,17 +1615,11 @@ public class AttachAi extends SpellAbilityAi {
if (keyword.endsWith("CARDNAME can't attack.") || keyword.equals("Defender")
|| keyword.endsWith("CARDNAME can't attack or block.")) {
if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) {
return false;
}
return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1;
} else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) {
if (!ComputerUtilCombat.canAttackNextTurn(card) || !CombatUtil.canBlock(card, true) || ai.getCreaturesInPlay().isEmpty()) {
return false;
}
return ComputerUtilCombat.canAttackNextTurn(card) && CombatUtil.canBlock(card, true) && !ai.getCreaturesInPlay().isEmpty();
} else if (keyword.endsWith("CARDNAME can't block.") || keyword.contains("CantBlock")) {
if (!CombatUtil.canBlock(card, true)) {
return false;
}
return CombatUtil.canBlock(card, true);
} else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) {
for (SpellAbility ability : card.getSpellAbilities()) {
if (ability.isAbility()) {
@@ -1669,18 +1628,12 @@ public class AttachAi extends SpellAbilityAi {
}
return false;
} else if (keyword.endsWith("Prevent all combat damage that would be dealt by CARDNAME.")) {
if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 1) {
return false;
}
return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1;
} else if (keyword.endsWith("Prevent all combat damage that would be dealt to and dealt by CARDNAME.")
|| keyword.endsWith("Prevent all damage that would be dealt to and dealt by CARDNAME.")) {
if (!ComputerUtilCombat.canAttackNextTurn(card) || card.getNetCombatDamage() < 2) {
return false;
}
return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 2;
} else if (keyword.endsWith("CARDNAME doesn't untap during your untap step.")) {
if (card.isUntapped()) {
return false;
}
return !card.isUntapped();
}
return true;
}
@@ -1704,12 +1657,8 @@ public class AttachAi extends SpellAbilityAi {
return true;
}
if (sa.getHostCard().isEquipment() && ComputerUtilCard.isUselessCreature(ai, c)) {
// useless to equip a creature that can't attack or block.
return false;
}
return true;
// useless to equip a creature that can't attack or block.
return !sa.getHostCard().isEquipment() || !ComputerUtilCard.isUselessCreature(ai, c);
}
public static Card doPumpOrCurseAILogic(final Player ai, final SpellAbility sa, final List<Card> list, final String type) {
@@ -1755,12 +1704,12 @@ public class AttachAi extends SpellAbilityAi {
}
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
return attachToCardAIPreferences(ai, sa, true);
}
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
return attachToPlayerAIPreferences(ai, sa, true);
}
}

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
@@ -17,7 +16,7 @@ public class BalanceAi extends SpellAbilityAi {
int diff = 0;
// TODO Add support for multiplayer logic
final Player opp = ComputerUtil.getOpponentFor(aiPlayer);
final Player opp = aiPlayer.getWeakestOpponent();
final CardCollectionView humPerms = opp.getCardsIn(ZoneType.Battlefield);
final CardCollectionView compPerms = aiPlayer.getCardsIn(ZoneType.Battlefield);

View File

@@ -2,7 +2,6 @@ package forge.ai.ability;
import java.util.List;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -25,7 +24,7 @@ public class BidLifeAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
if (tgt.canTgtCreature()) {
List<Card> list = CardLists.getTargetableCards(ComputerUtil.getOpponentFor(aiPlayer).getCardsIn(ZoneType.Battlefield), sa);
List<Card> list = CardLists.getTargetableCards(aiPlayer.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), sa);
list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa);
if (list.isEmpty()) {
return false;

View File

@@ -17,6 +17,8 @@
*/
package forge.ai.ability;
import java.util.Map;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -50,7 +52,7 @@ public final class BondAi extends SpellAbilityAi {
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
return ComputerUtilCard.getBestCreatureAI(options);
}

View File

@@ -0,0 +1,66 @@
package forge.ai.ability;
import forge.ai.SpellAbilityAi;
import forge.game.GameEntity;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import java.util.Collection;
import java.util.Map;
public class ChangeCombatantsAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
// TODO: Extend this if possible for cards that have this as an activated ability
return false;
}
@Override
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
return mandatory || canPlayAI(aiPlayer, sa);
}
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#chkAIDrawback(java.util.Map, forge.card.spellability.SpellAbility, forge.game.player.Player)
*/
@Override
public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) {
final String logic = sa.getParamOrDefault("AILogic", "");
if (logic.equals("WeakestOppExceptCtrl")) {
PlayerCollection targetableOpps = aiPlayer.getOpponents();
targetableOpps.remove(sa.getHostCard().getController());
if (targetableOpps.isEmpty()) {
return false;
}
return true;
}
return false;
}
@Override
public <T extends GameEntity> T chooseSingleEntity(Player ai, SpellAbility sa, Collection<T> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
PlayerCollection targetableOpps = new PlayerCollection();
for (GameEntity p : options) {
if (p instanceof Player && !p.equals(sa.getHostCard().getController())) {
Player pp = (Player)p;
if (pp.isOpponentOf(ai)) {
targetableOpps.add(pp);
}
}
}
Player weakestTargetableOpp = targetableOpps.filter(PlayerPredicates.isTargetableBy(sa))
.min(PlayerPredicates.compareByLife());
return (T)weakestTargetableOpp;
}
}

View File

@@ -10,6 +10,7 @@ import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
@@ -18,6 +19,7 @@ import forge.game.combat.Combat;
import forge.game.cost.Cost;
import forge.game.cost.CostDiscard;
import forge.game.cost.CostPart;
import forge.game.cost.CostPutCounter;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -26,6 +28,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
@@ -70,6 +73,29 @@ public class ChangeZoneAi extends SpellAbilityAi {
return false;
}
}
} else if (aiLogic.equals("NoSameCreatureType")) {
final List<ZoneType> origin = Lists.newArrayList();
if (sa.hasParam("Origin")) {
origin.addAll(ZoneType.listValueOf(sa.getParam("Origin")));
} else if (sa.hasParam("TgtZone")) {
origin.addAll(ZoneType.listValueOf(sa.getParam("TgtZone")));
}
CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(origin),
sa.getTargetRestrictions().getValidTgts(), ai, sa.getHostCard(), sa);
final List<String> creatureTypes = Lists.newArrayList();
for (Card c : list) {
creatureTypes.addAll(c.getType().getCreatureTypes());
}
for (String type : creatureTypes) {
int freq = Collections.frequency(creatureTypes, type);
if (freq > 1) {
return false;
}
}
return true;
}
return super.checkAiLogic(ai, sa, aiLogic);
@@ -96,6 +122,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
return SpecialCardAi.LivingDeath.consider(aiPlayer, sa);
} else if (aiLogic.equals("TheScarabGod")) {
return SpecialCardAi.TheScarabGod.consider(aiPlayer, sa);
} else if (aiLogic.equals("SorinVengefulBloodlord")) {
return SpecialCardAi.SorinVengefulBloodlord.consider(aiPlayer, sa);
} else if (aiLogic.equals("Intuition")) {
// This logic only fills the multiple cards array, the decision to play is made
// separately in hiddenOriginCanPlayAI later.
@@ -114,7 +142,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
* </p>
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
*
*
* @return a boolean.
*/
@Override
@@ -142,7 +170,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
* a {@link forge.game.spellability.SpellAbility} object.
* @param mandatory
* a boolean.
*
*
* @return a boolean.
*/
@Override
@@ -202,7 +230,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
final Card source = sa.getHostCard();
final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa);
ZoneType origin = null;
final Player opponent = ComputerUtil.getOpponentFor(ai);
final Player opponent = ai.getWeakestOpponent();
boolean activateForCost = ComputerUtil.activateForCost(sa, ai);
if (sa.hasParam("Origin")) {
@@ -316,6 +344,11 @@ public class ChangeZoneAi extends SpellAbilityAi {
for (final Player p : pDefined) {
CardCollectionView list = p.getCardsIn(origin);
// remove cards that won't be seen if library can't be searched
if (!ai.canSearchLibraryWith(sa, p)) {
list = CardLists.filter(list, Predicates.not(CardPredicates.inZone(ZoneType.Library)));
}
if (type != null && p == ai) {
// AI only "knows" about his information
list = CardLists.getValidCards(list, type, source.getController(), source);
@@ -323,9 +356,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
@Override
public boolean apply(final Card c) {
if (c.getType().isLegendary()) {
if (ai.isCardInPlay(c.getName())) {
return false;
}
return !ai.isCardInPlay(c.getName());
}
return true;
}
@@ -339,10 +370,10 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (!activateForCost && list.isEmpty()) {
return false;
}
if ("Atarka's Command".equals(sourceName)
&& (list.size() < 2 || ai.getLandsPlayedThisTurn() < 1)) {
// be strict on playing lands off charms
return false;
if ("Atarka's Command".equals(sourceName)
&& (list.size() < 2 || ai.getLandsPlayedThisTurn() < 1)) {
// be strict on playing lands off charms
return false;
}
String num = sa.getParam("ChangeNum");
@@ -354,7 +385,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
source.setSVar("PayX", Integer.toString(xPay));
}
}
if (sourceName.equals("Temur Sabertooth")) {
// activated bounce + pump
if (ComputerUtilCard.shouldPumpCard(ai, sa.getSubAbility(), source, 0, 0, Arrays.asList("Indestructible")) ||
@@ -369,9 +400,9 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
}
if (ComputerUtil.playImmediately(ai, sa)) {
return true;
return true;
}
// don't use fetching to top of library/graveyard before main2
@@ -387,9 +418,9 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
if (ComputerUtil.waitForBlocking(sa)) {
return false;
return false;
}
final AbilitySub subAb = sa.getSubAbility();
return subAb == null || SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb);
}
@@ -407,7 +438,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
// if putting cards from hand to library and parent is drawing cards
// make sure this will actually do something:
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Player opp = ComputerUtil.getOpponentFor(aiPlayer);
final Player opp = aiPlayer.getWeakestOpponent();
if (tgt != null && tgt.canTgtPlayer()) {
boolean isCurse = sa.isCurse();
if (isCurse && sa.canTarget(opp)) {
@@ -452,7 +483,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
}
List<ZoneType> origin = new ArrayList<ZoneType>();
List<ZoneType> origin = new ArrayList<>();
if (sa.hasParam("Origin")) {
origin = ZoneType.listValueOf(sa.getParam("Origin"));
}
@@ -468,7 +499,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
Iterable<Player> pDefined;
final TargetRestrictions tgt = sa.getTargetRestrictions();
if ((tgt != null) && tgt.canTgtPlayer()) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
if (sa.isCurse()) {
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
@@ -520,14 +551,14 @@ public class ChangeZoneAi extends SpellAbilityAi {
* basicManaFixing.
* </p>
* @param ai
*
*
* @param list
* a List<Card> object.
* @return a {@link forge.game.card.Card} object.
*/
private static Card basicManaFixing(final Player ai, final List<Card> list) { // Search for a Basic Land
final CardCollectionView combined = CardCollection.combine(ai.getCardsIn(ZoneType.Battlefield), ai.getCardsIn(ZoneType.Hand));
final List<String> basics = new ArrayList<String>();
final List<String> basics = new ArrayList<>();
// what types can I go get?
for (final String name : MagicColor.Constant.BASIC_LANDS) {
@@ -553,7 +584,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (minType != null) {
result = CardLists.getType(list, minType);
}
// pick dual lands if available
if (Iterables.any(result, Predicates.not(CardPredicates.Presets.BASIC_LANDS))) {
result = CardLists.filter(result, Predicates.not(CardPredicates.Presets.BASIC_LANDS));
@@ -566,7 +597,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
* <p>
* areAllBasics.
* </p>
*
*
* @param types
* a {@link java.lang.String} object.
* @return a boolean.
@@ -586,8 +617,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
* @return Card
*/
private static Card chooseCreature(final Player ai, CardCollection list) {
// Creating a new combat for testing purposes.
final Player opponent = ComputerUtil.getOpponentFor(ai);
// Creating a new combat for testing purposes.
final Player opponent = ai.getWeakestOpponent();
Combat combat = new Combat(opponent);
for (Card att : opponent.getCreaturesInPlay()) {
combat.addAttacker(att, ai);
@@ -671,7 +702,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
// only use blink or bounce effects
if (!(destination.equals(ZoneType.Exile) && (subApi == ApiType.DelayedTrigger || subApi == ApiType.ChangeZone))
if (!(destination.equals(ZoneType.Exile)
&& (subApi == ApiType.DelayedTrigger || subApi == ApiType.ChangeZone || "DelayedBlink".equals(sa.getParam("AILogic"))))
&& !destination.equals(ZoneType.Hand)) {
return false;
}
@@ -705,16 +737,12 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
final AbilitySub subAb = sa.getSubAbility();
if (subAb != null && !SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb)) {
return false;
}
return true;
return subAb == null || SpellApiToAi.Converter.get(subAb.getApi()).chkDrawbackWithSubs(ai, subAb);
}
/*
* (non-Javadoc)
*
*
* @see
* forge.ai.SpellAbilityAi#checkPhaseRestrictions(forge.game.player.Player,
* forge.game.spellability.SpellAbility, forge.game.phase.PhaseHandler)
@@ -753,7 +781,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
return false;
}
}
//don't unearth after attacking is possible
if (sa.hasParam("Unearth") && ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false;
@@ -831,7 +859,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
list = CardLists.getTargetableCards(list, sa);
// Filter AI-specific targets if provided
list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true);
list = ComputerUtil.filterAITgts(sa, ai, list, true);
if (sa.hasParam("AITgtsOnlyBetterThanSelf")) {
list = CardLists.filter(list, new Predicate<Card>() {
@Override
@@ -867,7 +895,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) {
return false;
}
immediately |= ComputerUtil.playImmediately(ai, sa);
// Narrow down the list:
@@ -898,11 +926,11 @@ public class ChangeZoneAi extends SpellAbilityAi {
CardCollection blockers = currCombat.getBlockers(attacker);
// Save my attacker by bouncing a blocker
if (attacker.getController().equals(ai) && attacker.getShieldCount() == 0
&& ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, currCombat)
&& ComputerUtilCombat.attackerWouldBeDestroyed(ai, attacker, currCombat)
&& !currCombat.getBlockers(attacker).isEmpty()) {
ComputerUtilCard.sortByEvaluateCreature(blockers);
Combat combat = new Combat(ai);
combat.addAttacker(attacker, ComputerUtil.getOpponentFor(ai));
combat.addAttacker(attacker, ai.getWeakestOpponent());
for (Card blocker : blockers) {
combat.addBlocker(attacker, blocker);
}
@@ -931,7 +959,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
// if it's blink or bounce, try to save my about to die stuff
final boolean blink = (destination.equals(ZoneType.Exile) && (subApi == ApiType.DelayedTrigger
|| (subApi == ApiType.ChangeZone && subAffected.equals("Remembered"))));
|| "DelayedBlink".equals(sa.getParam("AILogic")) || (subApi == ApiType.ChangeZone && subAffected.equals("Remembered"))));
if ((destination.equals(ZoneType.Hand) || blink) && (tgt.getMinTargets(sa.getHostCard(), sa) <= 1)) {
// save my about to die stuff
Card tobounce = canBouncePermanent(ai, sa, list);
@@ -942,9 +970,9 @@ public class ChangeZoneAi extends SpellAbilityAi {
sa.getTargets().add(tobounce);
boolean saheeliFelidarCombo = sa.getHostCard().getName().equals("Felidar Guardian")
boolean saheeliFelidarCombo = sa.getHostCard().getName().equals("Felidar Guardian")
&& tobounce.getName().equals("Saheeli Rai")
&& CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Felidar Guardian")).size() <
&& CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Felidar Guardian")).size() <
CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Creature")).size() + ai.getOpponentsGreatestLifeTotal() + 10;
// remember that the card was bounced already unless it's a special combo case
@@ -957,24 +985,20 @@ public class ChangeZoneAi extends SpellAbilityAi {
// bounce opponent's stuff
list = CardLists.filterControlledBy(list, ai.getOpponents());
if (!CardLists.getNotType(list, "Land").isEmpty()) {
// When bouncing opponents stuff other than lands, don't bounce cards with CMC 0
list = CardLists.filter(list, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
for (Card aura : c.getEnchantedBy()) {
if (aura.getController().isOpponentOf(ai)) {
return true;
} else {
return false;
}
}
if (blink) {
return c.isToken();
} else {
return c.isToken() || c.getCMC() > 0;
}
}
});
// When bouncing opponents stuff other than lands, don't bounce cards with CMC 0
list = CardLists.filter(list, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
for (Card aura : c.getEnchantedBy()) {
return aura.getController().isOpponentOf(ai);
}
if (blink) {
return c.isToken();
} else {
return c.isToken() || c.getCMC() > 0;
}
}
});
}
// TODO: Blink permanents with ETB triggers
/*else if (!sa.isTrigger() && SpellAbilityAi.playReusable(ai, sa)) {
@@ -999,7 +1023,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
} else if (origin.contains(ZoneType.Graveyard)) {
if (destination.equals(ZoneType.Exile) || destination.equals(ZoneType.Library)) {
if (destination.equals(ZoneType.Exile) || destination.equals(ZoneType.Library)) {
// Don't use these abilities before main 2 if possible
if (!immediately && game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)
&& !sa.hasParam("ActivationPhases") && !ComputerUtil.castSpellInMain1(ai, sa)) {
@@ -1011,7 +1035,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
&& !ComputerUtil.activateForCost(sa, ai)) {
return false;
}
} else if (destination.equals(ZoneType.Hand)) {
} else if (destination.equals(ZoneType.Hand)) {
// only retrieve cards from computer graveyard
list = CardLists.filterControlledBy(list, ai);
} else if (sa.hasParam("AttachedTo")) {
@@ -1041,8 +1065,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (destination.equals(ZoneType.Exile) || origin.contains(ZoneType.Battlefield)) {
// don't rush bouncing stuff when not going to attack
if (!immediately && sa.getPayCosts() != null
&& game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)
if (!immediately && game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)
&& game.getPhaseHandler().isPlayerTurn(ai)
&& ai.getCreaturesInPlay().isEmpty()) {
return false;
@@ -1073,13 +1096,17 @@ public class ChangeZoneAi extends SpellAbilityAi {
// Only care about combatants during combat
if (game.getPhaseHandler().inCombat() && origin.contains(ZoneType.Battlefield)) {
CardCollection newList = CardLists.getValidCards(list, "Card.attacking,Card.blocking", null, null);
if (!newList.isEmpty() || !sa.isTrigger()) {
list = newList;
}
CardCollection newList = CardLists.getValidCards(list, "Card.attacking,Card.blocking", null, null);
if (!newList.isEmpty() || !sa.isTrigger()) {
list = newList;
}
}
if (list.isEmpty()) {
boolean doWithoutTarget = sa.hasParam("Planeswalker") && sa.usesTargeting()
&& sa.getTargetRestrictions().getMinTargets(source, sa) == 0
&& sa.getPayCosts().hasSpecificCostType(CostPutCounter.class);
if (list.isEmpty() && !doWithoutTarget) {
return false;
}
@@ -1161,7 +1188,11 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (!mandatory) {
sa.resetTargets();
}
return false;
if (!doWithoutTarget) {
return false;
} else {
break;
}
} else {
if (!sa.isTrigger() && !ComputerUtil.shouldCastLessThanMax(ai, source)) {
boolean aiTgtsOK = false;
@@ -1187,6 +1218,15 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
}
// honor the Same Creature Type restriction
if (tgt.isWithSameCreatureType()) {
Card firstTarget = sa.getTargetCard();
if (firstTarget != null && !choice.sharesCreatureTypeWith(firstTarget)) {
list.remove(choice);
continue;
}
}
list.remove(choice);
sa.getTargets().add(choice);
}
@@ -1211,7 +1251,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
return true;
}
/**
* Checks if a permanent threatened by a stack ability or in combat can
* be saved by bouncing.
@@ -1225,6 +1265,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
// filter out untargetables
CardCollectionView aiPermanents = CardLists
.filterControlledBy(list, ai);
CardCollection aiPlaneswalkers = CardLists.filter(aiPermanents, Presets.PLANESWALKERS);
// Felidar Guardian + Saheeli Rai combo support
if (sa.getHostCard().getName().equals("Felidar Guardian")) {
@@ -1240,7 +1281,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
final List<GameObject> objects = ComputerUtil
.predictThreatenedObjects(ai, sa);
final List<Card> threatenedTargets = new ArrayList<Card>();
final List<Card> threatenedTargets = new ArrayList<>();
for (final Card c : aiPermanents) {
if (objects.contains(c)) {
@@ -1268,6 +1309,33 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
}
}
// Reload planeswalkers
else if (!aiPlaneswalkers.isEmpty() && (sa.getHostCard().isSorcery() || !game.getPhaseHandler().isPlayerTurn(ai))) {
int maxLoyaltyToConsider = 2;
int loyaltyDiff = 2;
int chance = 30;
if (ai.getController().isAI()) {
AiController aic = ((PlayerControllerAi) ai.getController()).getAi();
maxLoyaltyToConsider = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_MAX_LOYALTY);
loyaltyDiff = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_LOYALTY_DIFF);
chance = aic.getIntProperty(AiProps.BLINK_RELOAD_PLANESWALKER_CHANCE);
}
if (MyRandom.percentTrue(chance)) {
Collections.sort(aiPlaneswalkers, new Comparator<Card>() {
@Override
public int compare(final Card a, final Card b) {
return a.getCounters(CounterEnumType.LOYALTY) - b.getCounters(CounterEnumType.LOYALTY);
}
});
for (Card pw : aiPlaneswalkers) {
int curLoyalty = pw.getCounters(CounterEnumType.LOYALTY);
int freshLoyalty = Integer.valueOf(pw.getCurrentState().getBaseLoyalty());
if (freshLoyalty - curLoyalty >= loyaltyDiff && curLoyalty <= maxLoyaltyToConsider) {
return pw;
}
}
}
}
return null;
}
@@ -1393,16 +1461,12 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (!list.isEmpty()) {
final Card attachedTo = list.get(0);
// This code is for the Dragon auras
if (attachedTo.getController().isOpponentOf(ai)) {
return false;
}
return !attachedTo.getController().isOpponentOf(ai);
}
}
} else if (isPreferredTarget(ai, sa, mandatory, true)) {
// do nothing
} else if (!isUnpreferredTarget(ai, sa, mandatory)) {
return false;
}
} else return isUnpreferredTarget(ai, sa, mandatory);
return true;
}
@@ -1421,6 +1485,8 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
} else if ("WorstCard".equals(logic)) {
return ComputerUtilCard.getWorstAI(fetchList);
} else if ("BestCard".equals(logic)) {
return ComputerUtilCard.getBestAI(fetchList); // generally also means the most expensive one or close to it
} else if ("Mairsil".equals(logic)) {
return SpecialCardAi.MairsilThePretender.considerCardFromList(fetchList);
} else if ("SurvivalOfTheFittest".equals(logic)) {
@@ -1440,10 +1506,10 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (type == null) {
type = "Card";
}
Card c = null;
final Player activator = sa.getActivatingPlayer();
CardLists.shuffle(fetchList);
// Save a card as a default, in case we can't find anything suitable.
Card first = fetchList.get(0);
@@ -1452,9 +1518,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
@Override
public boolean apply(final Card c) {
if (c.getType().isLegendary()) {
if (decider.isCardInPlay(c.getName())) {
return false;
}
return !decider.isCardInPlay(c.getName());
}
return true;
}
@@ -1463,10 +1527,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
fetchList = CardLists.filter(fetchList, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
if (ComputerUtilCard.isCardRemAIDeck(c) || ComputerUtilCard.isCardRemRandomDeck(c)) {
return false;
}
return true;
return !ComputerUtilCard.isCardRemAIDeck(c) && !ComputerUtilCard.isCardRemRandomDeck(c);
}
});
}
@@ -1553,19 +1614,19 @@ public class ChangeZoneAi extends SpellAbilityAi {
// AI was never asked
return true;
}
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
// Called when looking for creature to attach aura or equipment
return ComputerUtilCard.getBestAI(options);
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#chooseSinglePlayer(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List)
*/
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
// Currently only used by Curse of Misfortunes, so this branch should never get hit
// But just in case it does, just select the first option
return Iterables.getFirst(options, null);
@@ -1638,9 +1699,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
@Override
public boolean apply(final Card c) {
if (c.getType().isLegendary()) {
if (ai.isCardInPlay(c.getName())) {
return false;
}
return !ai.isCardInPlay(c.getName());
}
return true;
}
@@ -1730,8 +1789,9 @@ public class ChangeZoneAi extends SpellAbilityAi {
}
public boolean doReturnCommanderLogic(SpellAbility sa, Player aiPlayer) {
Map<String, Object> originalParams = (Map<String, Object>)sa.getReplacingObject("OriginalParams");
SpellAbility causeSa = (SpellAbility)originalParams.get("Cause");
@SuppressWarnings("unchecked")
Map<AbilityKey, Object> originalParams = (Map<AbilityKey, Object>)sa.getReplacingObject(AbilityKey.OriginalParams);
SpellAbility causeSa = (SpellAbility)originalParams.get(AbilityKey.Cause);
SpellAbility causeSub = null;
// Squee, the Immortal: easier to recast it (the call below has to be "contains" since SA is an intrinsic effect)
@@ -1741,27 +1801,23 @@ public class ChangeZoneAi extends SpellAbilityAi {
if (causeSa != null && (causeSub = causeSa.getSubAbility()) != null) {
ApiType subApi = causeSub.getApi();
if (subApi == ApiType.ChangeZone && "Exile".equals(causeSub.getParam("Origin"))
&& "Battlefield".equals(causeSub.getParam("Destination"))) {
// A blink effect implemented using ChangeZone API
return false;
} else if (subApi == ApiType.DelayedTrigger) {
} else // This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to
// return the commander to the Command zone.
if (subApi == ApiType.DelayedTrigger) {
SpellAbility exec = causeSub.getAdditionalAbility("Execute");
if (exec != null && exec.getApi() == ApiType.ChangeZone) {
if ("Exile".equals(exec.getParam("Origin")) && "Battlefield".equals(exec.getParam("Destination"))) {
// A blink effect implemented using a delayed trigger
return false;
}
// A blink effect implemented using a delayed trigger
return !"Exile".equals(exec.getParam("Origin")) || !"Battlefield".equals(exec.getParam("Destination"));
}
} else if (causeSa.getHostCard() != null && causeSa.getHostCard().equals((Card)sa.getReplacingObject("Card"))
&& causeSa.getActivatingPlayer().equals(aiPlayer)) {
// This is an intrinsic effect that blinks the card (e.g. Obzedat, Ghost Council), no need to
// return the commander to the Command zone.
return false;
}
} else return causeSa.getHostCard() == null || !causeSa.getHostCard().equals(sa.getReplacingObject(AbilityKey.Card))
|| !causeSa.getActivatingPlayer().equals(aiPlayer);
}
// Normally we want the commander back in Command zone to recast him later
return true;
}

View File

@@ -1,5 +1,6 @@
package forge.ai.ability;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.*;
@@ -57,6 +58,11 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
CardCollectionView oppType = CardLists.filterControlledBy(game.getCardsIn(origin), ai.getOpponents());
CardCollectionView computerType = ai.getCardsIn(origin);
// remove cards that won't be seen in AI's own library if it can't be searched
if (!ai.canSearchLibraryWith(sa, ai)) {
computerType = CardLists.filter(computerType, Predicates.not(CardPredicates.inZone(ZoneType.Library)));
}
// Ugin check need to be done before filterListByType because of ChosenX
// Ugin AI: always try to sweep before considering +1
if (sourceName.equals("Ugin, the Spirit Dragon")) {
@@ -329,11 +335,8 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
return true;
// if AI creature is better than Human Creature
if (ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard
.evaluateCreatureList(humanCards)) {
return true;
}
return false;
return ComputerUtilCard.evaluateCreatureList(aiCards) >= ComputerUtilCard
.evaluateCreatureList(humanCards);
}
return true;
}
@@ -435,29 +438,21 @@ public class ChangeZoneAllAi extends SpellAbilityAi {
if (sa.getParam("GainControl") != null) {
// Check if the cards are valuable enough
if ((CardLists.getNotType(humanType, "Creature").size() == 0) && (CardLists.getNotType(computerType, "Creature").size() == 0)) {
if ((ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard
.evaluateCreatureList(humanType)) < 1) {
return false;
}
return (ComputerUtilCard.evaluateCreatureList(computerType) + ComputerUtilCard
.evaluateCreatureList(humanType)) >= 1;
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are less valuable
else if ((ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard
.evaluatePermanentList(humanType)) < 1) {
return false;
}
else return (ComputerUtilCard.evaluatePermanentList(computerType) + ComputerUtilCard
.evaluatePermanentList(humanType)) >= 1;
} else {
// don't activate if human gets more back than AI does
if ((CardLists.getNotType(humanType, "Creature").isEmpty()) && (CardLists.getNotType(computerType, "Creature").isEmpty())) {
if (ComputerUtilCard.evaluateCreatureList(computerType) <= ComputerUtilCard
.evaluateCreatureList(humanType)) {
return false;
}
return ComputerUtilCard.evaluateCreatureList(computerType) > ComputerUtilCard
.evaluateCreatureList(humanType);
} // otherwise evaluate both lists by CMC and pass only if human
// permanents are less valuable
else if (ComputerUtilCard.evaluatePermanentList(computerType) <= ComputerUtilCard
.evaluatePermanentList(humanType)) {
return false;
}
else return ComputerUtilCard.evaluatePermanentList(computerType) > ComputerUtilCard
.evaluatePermanentList(humanType);
}
}

View File

@@ -11,6 +11,7 @@ import forge.util.MyRandom;
import forge.util.collect.FCollection;
import java.util.List;
import java.util.Map;
public class CharmAi extends SpellAbilityAi {
@Override
@@ -232,7 +233,7 @@ public class CharmAi extends SpellAbilityAi {
}
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> opponents) {
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> opponents, Map<String, Object> params) {
return Aggregates.random(opponents);
}
}

View File

@@ -2,13 +2,13 @@ package forge.ai.ability;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilCard;
@@ -21,7 +21,7 @@ import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
import forge.game.card.CounterType;
import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseType;
@@ -72,21 +72,15 @@ public class ChooseCardAi extends SpellAbilityAi {
choices = CardLists.filterControlledBy(choices, ai.getOpponents());
}
if (aiLogic.equals("AtLeast1") || aiLogic.equals("OppPreferred")) {
if (choices.isEmpty()) {
return false;
}
return !choices.isEmpty();
} else if (aiLogic.equals("AtLeast2") || aiLogic.equals("BestBlocker")) {
if (choices.size() < 2) {
return false;
}
return choices.size() >= 2;
} else if (aiLogic.equals("Clone") || aiLogic.equals("Vesuva")) {
final String filter = aiLogic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary"
: "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva";
choices = CardLists.getValidCards(choices, filter, host.getController(), host);
if (choices.isEmpty()) {
return false;
}
return !choices.isEmpty();
} else if (aiLogic.equals("Never")) {
return false;
} else if (aiLogic.equals("NeedsPrevention")) {
@@ -104,11 +98,9 @@ public class ChooseCardAi extends SpellAbilityAi {
return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > ref;
}
});
if (choices.isEmpty()) {
return false;
}
return !choices.isEmpty();
} else if (aiLogic.equals("Ashiok")) {
final int loyalty = host.getCounters(CounterType.LOYALTY) - 1;
final int loyalty = host.getCounters(CounterEnumType.LOYALTY) - 1;
for (int i = loyalty; i >= 0; i--) {
host.setSVar("ChosenX", "Number$" + i);
choices = ai.getGame().getCardsIn(choiceZone);
@@ -118,16 +110,12 @@ public class ChooseCardAi extends SpellAbilityAi {
}
}
if (choices.isEmpty()) {
return false;
}
return !choices.isEmpty();
} else if (aiLogic.equals("RandomNonLand")) {
if (CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty()) {
return false;
}
return !CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty();
} else if (aiLogic.equals("Duneblast")) {
CardCollection aiCreatures = ai.getCreaturesInPlay();
CardCollection oppCreatures = ComputerUtil.getOpponentFor(ai).getCreaturesInPlay();
CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay();
aiCreatures = CardLists.getNotKeyword(aiCreatures, Keyword.INDESTRUCTIBLE);
oppCreatures = CardLists.getNotKeyword(oppCreatures, Keyword.INDESTRUCTIBLE);
@@ -140,10 +128,8 @@ public class ChooseCardAi extends SpellAbilityAi {
aiCreatures.remove(chosen);
int minGain = 200;
if ((ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) >= ComputerUtilCard
.evaluateCreatureList(oppCreatures)) {
return false;
}
return (ComputerUtilCard.evaluateCreatureList(aiCreatures) + minGain) < ComputerUtilCard
.evaluateCreatureList(oppCreatures);
}
return true;
}
@@ -155,12 +141,12 @@ public class ChooseCardAi extends SpellAbilityAi {
}
return checkApiLogic(ai, sa);
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.card.spellability.SpellAbility, java.util.List, boolean)
*/
@Override
public Card chooseSingleCard(final Player ai, final SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(final Player ai, final SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
final Card host = sa.getHostCard();
final Player ctrl = host.getController();
final String logic = sa.getParam("AILogic");
@@ -206,7 +192,7 @@ public class ChooseCardAi extends SpellAbilityAi {
if (combat == null || !combat.isAttacking(c, ai) || !combat.isUnblocked(c)) {
return false;
}
int ref = ComputerUtilAbility.getAbilitySourceName(sa).equals("Forcefield") ? 1 : 0;
int ref = ComputerUtilAbility.getAbilitySourceName(sa).equals("Forcefield") ? 1 : 0;
return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > ref;
}
});
@@ -248,7 +234,7 @@ public class ChooseCardAi extends SpellAbilityAi {
return false;
}
for (SpellAbility sa : c.getAllSpellAbilities()) {
if (sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) {
if (sa.getPayCosts().hasTapCost()) {
return false;
}
}

View File

@@ -1,6 +1,7 @@
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -23,7 +24,6 @@ public class ChooseCardNameAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
Card source = sa.getHostCard();
if (sa.hasParam("AILogic")) {
// Don't tap creatures that may be able to block
if (ComputerUtil.waitForBlocking(sa)) {
@@ -41,7 +41,7 @@ public class ChooseCardNameAi extends SpellAbilityAi {
if (tgt != null) {
sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
sa.getTargets().add(ai.getWeakestOpponent());
} else {
sa.getTargets().add(ai);
}
@@ -60,7 +60,7 @@ public class ChooseCardNameAi extends SpellAbilityAi {
* @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.card.spellability.SpellAbility, java.util.List, boolean)
*/
@Override
public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
return ComputerUtilCard.getBestAI(options);
}
@@ -86,7 +86,7 @@ public class ChooseCardNameAi extends SpellAbilityAi {
if (rules.getSplitType() == CardSplitType.Split) {
Card copy = CardUtil.getLKICopy(card);
// for calcing i need only one split side
// for calcing i need only one split side
if (isOther) {
copy.getCurrentState().copyFrom(card.getState(CardStateName.RightSplit), true);
} else {

View File

@@ -8,10 +8,7 @@ import forge.ai.SpecialCardAi;
import forge.ai.SpellAbilityAi;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.*;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -52,16 +49,13 @@ public class ChooseColorAi extends SpellAbilityAi {
}
if ("Addle".equals(sourceName)) {
if (ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).isEmpty()) {
return false;
}
return true;
return !ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) && !ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).isEmpty();
}
if (logic.equals("MostExcessOpponentControls")) {
for (byte color : MagicColor.WUBRG) {
CardCollectionView ailist = ai.getCardsIn(ZoneType.Battlefield);
CardCollectionView opplist = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield);
CardCollectionView opplist = ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield);
ailist = CardLists.filter(ailist, CardPredicates.isColor(color));
opplist = CardLists.filter(opplist, CardPredicates.isColor(color));
@@ -72,9 +66,7 @@ public class ChooseColorAi extends SpellAbilityAi {
}
}
return false;
}
if (logic.equals("MostProminentInComputerDeck")) {
} else if (logic.equals("MostProminentInComputerDeck")) {
if ("Astral Cornucopia".equals(sourceName)) {
// activate in Main 2 hoping that the extra mana surplus will make a difference
// if there are some nonland permanents in hand
@@ -83,6 +75,11 @@ public class ChooseColorAi extends SpellAbilityAi {
return permanents.size() > 0 && ph.is(PhaseType.MAIN2, ai);
}
} else if (logic.equals("HighestDevotionToColor")) {
// currently only works more or less reliably in Main2 to cast own spells
if (!ph.is(PhaseType.MAIN2, ai)) {
return false;
}
}
boolean chance = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());

View File

@@ -0,0 +1,29 @@
package forge.ai.ability;
import com.google.common.collect.Lists;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class ChooseCompanionAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.card.spellability.SpellAbility, java.util.List, boolean)
*/
@Override
public Card chooseSingleCard(final Player ai, final SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
List<Card> cards = Lists.newArrayList(options);
if (cards.isEmpty()) {
return null;
}
Collections.shuffle(cards);
return cards.get(0);
}
}

View File

@@ -33,9 +33,7 @@ public class ChooseDirectionAi extends SpellAbilityAi {
CardCollection right = CardLists.filterControlledBy(all, game.getNextPlayerAfter(ai, Direction.Right));
int leftValue = Aggregates.sum(left, CardPredicates.Accessors.fnGetCmc);
int rightValue = Aggregates.sum(right, CardPredicates.Accessors.fnGetCmc);
if (aiValue > leftValue || aiValue > rightValue) {
return false;
}
return aiValue <= leftValue && aiValue <= rightValue;
}
}
return true;
@@ -48,6 +46,6 @@ public class ChooseDirectionAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
return canPlayAI(ai, sa);
return mandatory || canPlayAI(ai, sa);
}
}

View File

@@ -0,0 +1,36 @@
package forge.ai.ability;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
public class ChooseEvenOddAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
if (!sa.hasParam("AILogic")) {
return false;
}
TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
Player opp = aiPlayer.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else {
return false;
}
}
boolean chance = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
return chance;
}
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
return mandatory || canPlayAI(ai, sa);
}
}

View File

@@ -1,28 +1,14 @@
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
import forge.ai.SpellApiToAi;
import forge.ai.*;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.*;
import forge.game.card.CardPredicates.Presets;
import forge.game.card.CardUtil;
import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
@@ -35,6 +21,9 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.collect.FCollection;
import java.util.List;
import java.util.Map;
public class ChooseGenericEffectAi extends SpellAbilityAi {
@@ -50,6 +39,8 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
return true;
}
}
} else if ("GideonBlackblade".equals(aiLogic)) {
return SpecialCardAi.GideonBlackblade.consider(ai, sa);
}
return false;
}
@@ -95,7 +86,9 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
return spells.get(0);
} else if ("Random".equals(logic)) {
return Aggregates.random(spells);
} else if ("Phasing".equals(logic)) { // Teferi's Realm : keep aggressive
} else if ("GideonBlackblade".equals(logic)) {
return SpecialCardAi.GideonBlackblade.chooseSpellAbility(player, sa, spells);
} else if ("Phasing".equals(logic)) { // Teferi's Realm : keep aggressive
List<SpellAbility> filtered = Lists.newArrayList(Iterables.filter(spells, new Predicate<SpellAbility>() {
@Override
public boolean apply(final SpellAbility sp) {
@@ -110,7 +103,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
Cost unless = new Cost(unlessCost, false);
SpellAbility paycost = new SpellAbility.EmptySa(sa.getHostCard(), player);
paycost.setPayCosts(unless);
if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection<Player>(player))
if (ComputerUtilCost.willPayUnlessCost(sp, player, unless, false, new FCollection<>(player))
&& ComputerUtilCost.canPayCost(paycost, player)) {
return sp;
}
@@ -187,25 +180,25 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
Card imprinted = host.getImprintedCards().getFirst();
int dmg = imprinted.getCMC();
Player owner = imprinted.getOwner();
//useless cards in hand
if (imprinted.getName().equals("Bridge from Below") ||
imprinted.getName().equals("Haakon, Stromgald Scourge")) {
return allow;
}
//bad cards when are thrown from the library to the graveyard, but Yixlid can prevent that
if (!player.getGame().isCardInPlay("Yixlid Jailer") && (
imprinted.getName().equals("Gaea's Blessing") ||
imprinted.getName().equals("Narcomoeba"))) {
return allow;
}
// milling against Tamiyo is pointless
if (owner.isCardInCommand("Emblem - Tamiyo, the Moon Sage")) {
return allow;
}
// milling a land against Gitrog result in card draw
if (imprinted.isLand() && owner.isCardInPlay("The Gitrog Monster")) {
// try to mill owner
@@ -214,19 +207,19 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
}
return allow;
}
// milling a creature against Sidisi result in more creatures
if (imprinted.isCreature() && owner.isCardInPlay("Sidisi, Brood Tyrant")) {
return allow;
}
//if Iona does prevent from casting, allow it to draw
//if Iona does prevent from casting, allow it to draw
for (final Card io : player.getCardsIn(ZoneType.Battlefield, "Iona, Shield of Emeria")) {
if (CardUtil.getColors(imprinted).hasAnyColor(MagicColor.fromName(io.getChosenColor()))) {
return allow;
}
}
if (dmg == 0) {
// If CMC = 0, mill it!
return deny;
@@ -251,7 +244,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
SpellAbility counterSA = spells.get(0), tokenSA = spells.get(1);
// check for something which might prevent the counters to be placed on host
if (!host.canReceiveCounters(CounterType.P1P1)) {
if (!host.canReceiveCounters(CounterEnumType.P1P1)) {
return tokenSA;
}
@@ -263,7 +256,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
// need a copy for one with extra +1/+1 counter boost,
// without causing triggers to run
final Card copy = CardUtil.getLKICopy(host);
copy.setCounters(CounterType.P1P1, copy.getCounters(CounterType.P1P1) + n);
copy.setCounters(CounterEnumType.P1P1, copy.getCounters(CounterEnumType.P1P1) + n);
copy.setZone(host.getZone());
// if host would put into the battlefield attacking
@@ -288,10 +281,10 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
// TODO check for trigger to turn token ETB into +1/+1 counter for host
// TODO check for trigger to turn token ETB into damage or life loss for opponent
// in this cases Token might be prefered even if they would not survive
final Card tokenCard = TokenAi.spawnToken(player, tokenSA, true);
final Card tokenCard = TokenAi.spawnToken(player, tokenSA);
// Token would not survive
if (tokenCard.getNetToughness() < 1) {
// Token would not survive
if (!tokenCard.isCreature() || tokenCard.getNetToughness() < 1) {
return counterSA;
}
@@ -343,7 +336,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
filtered.add(sp);
}
}
// TODO find better way to check
if (!filtered.isEmpty()) {
return filtered.get(0);
@@ -369,7 +362,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
game.getAction().checkStaticAbilities(false);
// can't gain counters, use Haste
if (!copy.canReceiveCounters(CounterType.P1P1)) {
if (!copy.canReceiveCounters(CounterEnumType.P1P1)) {
return true;
}
@@ -392,9 +385,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
final Player opp = player.getWeakestOpponent();
if (opp != null) {
// TODO add predict Combat Damage?
if (opp.getLife() < copy.getNetPower()) {
return true;
}
return opp.getLife() < copy.getNetPower();
}
// haste might not be good enough?

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -17,7 +16,7 @@ public class ChooseNumberAi extends SpellAbilityAi {
TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
Player opp = ComputerUtil.getOpponentFor(aiPlayer);
Player opp = aiPlayer.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else {

View File

@@ -9,6 +9,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.List;
import java.util.Map;
public class ChoosePlayerAi extends SpellAbilityAi {
@Override
@@ -27,7 +28,7 @@ public class ChoosePlayerAi extends SpellAbilityAi {
}
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> choices) {
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> choices, Map<String, Object> params) {
Player chosen = null;
if ("Curse".equals(sa.getParam("AILogic"))) {
for (Player pc : choices) {

View File

@@ -1,13 +1,13 @@
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCombat;
import forge.ai.ComputerUtilCost;
@@ -68,7 +68,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
Player opp = ComputerUtil.getOpponentFor(ai);
Player opp = ai.getWeakestOpponent();
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else {
@@ -98,10 +98,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
return false;
}
int dmg = AbilityUtils.calculateAmount(threatSource, topStack.getParam("NumDmg"), topStack);
if (ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) <= 0) {
return false;
}
return true;
return ComputerUtilCombat.predictDamageTo(ai, dmg, threatSource, false) > 0;
}
if (game.getPhaseHandler().getPhase() != PhaseType.COMBAT_DECLARE_BLOCKERS) {
return false;
@@ -120,9 +117,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
return ComputerUtilCombat.damageIfUnblocked(c, ai, combat, true) > 0;
}
});
if (choices.isEmpty()) {
return false;
}
return !choices.isEmpty();
}
}
@@ -132,7 +127,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
@Override
public Card chooseSingleCard(final Player aiChoser, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(final Player aiChoser, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
if ("NeedsPrevention".equals(sa.getParam("AILogic"))) {
final Player ai = sa.getActivatingPlayer();
final Game game = ai.getGame();

View File

@@ -1,6 +1,8 @@
package forge.ai.ability;
import java.util.Map;
import com.google.common.collect.Iterables;
import forge.ai.ComputerUtilCard;
@@ -56,7 +58,7 @@ public class ClashAi extends SpellAbilityAi {
* forge.game.spellability.SpellAbility, java.lang.Iterable)
*/
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
for (Player p : options) {
if (p.getCardsIn(ZoneType.Library).size() == 0)
return p;
@@ -82,7 +84,7 @@ public class ClashAi extends SpellAbilityAi {
PlayerCollection players = ai.getOpponents().filter(PlayerPredicates.isTargetableBy(sa));
// use chooseSinglePlayer function to the select player
Player chosen = chooseSinglePlayer(ai, sa, players);
Player chosen = chooseSinglePlayer(ai, sa, players, null);
if (chosen != null) {
sa.resetTargets();
sa.getTargets().add(chosen);

View File

@@ -12,16 +12,15 @@ import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import java.util.List;
import java.util.Map;
public class CloneAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
final Game game = source.getGame();
@@ -39,27 +38,13 @@ public class CloneAi extends SpellAbilityAi {
// TODO - add some kind of check for during human turn to answer
// "Can I use this to block something?"
if (!checkPhaseRestrictions(ai, sa, ai.getGame().getPhaseHandler())) {
return false;
}
PhaseHandler phase = game.getPhaseHandler();
// don't use instant speed clone abilities outside computers
// Combat_Begin step
if (!phase.is(PhaseType.COMBAT_BEGIN)
&& phase.isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)
&& !sa.hasParam("ActivationPhases") && !sa.hasParam("Permanent")) {
return false;
}
// don't use instant speed clone abilities outside humans
// Combat_Declare_Attackers_InstantAbility step
if (!phase.is(PhaseType.COMBAT_DECLARE_ATTACKERS) || phase.isPlayerTurn(ai) || game.getCombat().getAttackers().isEmpty()) {
return false;
}
// don't activate during main2 unless this effect is permanent
if (phase.is(PhaseType.MAIN2) && !sa.hasParam("Permanent")) {
return false;
}
if (null == tgt) {
if (!sa.usesTargeting()) {
final List<Card> defined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
boolean bFlag = false;
@@ -131,7 +116,7 @@ public class CloneAi extends SpellAbilityAi {
* <p>
* cloneTgtAI.
* </p>
*
*
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
* @return a boolean.
@@ -155,7 +140,7 @@ public class CloneAi extends SpellAbilityAi {
// a good target
return false;
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String)
*/
@@ -178,27 +163,46 @@ public class CloneAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#chooseSingleCard(forge.game.player.Player,
* forge.game.spellability.SpellAbility, java.lang.Iterable, boolean,
* forge.game.player.Player)
*/
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional,
Player targetedPlayer) {
Player targetedPlayer, Map<String, Object> params) {
final Card host = sa.getHostCard();
final Player ctrl = host.getController();
final boolean isVesuva = "Vesuva".equals(host.getName());
final Card cloneTarget = getCloneTarget(sa);
final boolean isOpp = cloneTarget.getController().isOpponentOf(sa.getActivatingPlayer());
final String filter = !isVesuva ? "Permanent.YouDontCtrl,Permanent.nonLegendary"
final boolean isVesuva = "Vesuva".equals(host.getName());
final boolean canCloneLegendary = "True".equalsIgnoreCase(sa.getParam("NonLegendary"));
String filter = !isVesuva ? "Permanent.YouDontCtrl,Permanent.nonLegendary"
: "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva";
// TODO: rewrite this block so that this is done somehow more elegantly
if (canCloneLegendary) {
filter = filter.replace(".nonLegendary+", ".").replace(".nonLegendary", "");
}
CardCollection newOptions = CardLists.getValidCards(options, filter.split(","), ctrl, host, sa);
if (!newOptions.isEmpty()) {
options = newOptions;
}
Card choice = ComputerUtilCard.getBestAI(options);
if (sa.hasParam("AiChoiceLogic")) {
final String logic = sa.getParam("AiChoiceLogic");
if ("BestOppCtrl".equals(logic)) {
options = CardLists.filterControlledBy(options, ctrl.getOpponents());
}
}
Card choice = isOpp ? ComputerUtilCard.getWorstAI(options) : ComputerUtilCard.getBestAI(options);
if (isVesuva && "Vesuva".equals(choice.getName())) {
choice = null;
}
@@ -206,4 +210,41 @@ public class CloneAi extends SpellAbilityAi {
return choice;
}
protected Card getCloneTarget(final SpellAbility sa) {
final Card host = sa.getHostCard();
Card tgtCard = host;
if (sa.hasParam("CloneTarget")) {
final List<Card> cloneTargets = AbilityUtils.getDefinedCards(host, sa.getParam("CloneTarget"), sa);
if (!cloneTargets.isEmpty()) {
tgtCard = cloneTargets.get(0);
}
} else if (sa.hasParam("Choices") && sa.usesTargeting()) {
tgtCard = sa.getTargets().getFirstTargetedCard();
}
return tgtCard;
}
/*
* (non-Javadoc)
* @see forge.ai.SpellAbilityAi#checkPhaseRestrictions(forge.game.player.Player, forge.game.spellability.SpellAbility, forge.game.phase.PhaseHandler)
*/
protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) {
// don't use instant speed clone abilities outside computers
// Combat_Begin step
if (!ph.is(PhaseType.COMBAT_BEGIN)
&& ph.isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa)
&& !sa.hasParam("ActivationPhases") && !sa.hasParam("Permanent")) {
return false;
}
// don't use instant speed clone abilities outside humans
// Combat_Declare_Attackers_InstantAbility step
if (!ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) || ph.isPlayerTurn(ai) || ph.getCombat().getAttackers().isEmpty()) {
return false;
}
// don't activate during main2 unless this effect is permanent
return !ph.is(PhaseType.MAIN2) || sa.hasParam("Permanent");
}
}

View File

@@ -3,7 +3,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
@@ -30,7 +29,7 @@ public class ControlExchangeAi extends SpellAbilityAi {
sa.resetTargets();
CardCollection list =
CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa);
// AI won't try to grab cards that are filtered out of AI decks on
// purpose
list = CardLists.filter(list, new Predicate<Card>() {

View File

@@ -18,6 +18,7 @@
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
@@ -34,12 +35,12 @@ import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.collect.FCollectionView;
//AB:GainControl|ValidTgts$Creature|TgtPrompt$Select target legendary creature|LoseControl$Untap,LoseControl|SpellDescription$Gain control of target xxxxxxx
@@ -54,8 +55,6 @@ import forge.util.collect.FCollectionView;
// (as a "&"-separated list; like Haste, Sacrifice CARDNAME at EOT, any standard keyword)
// OppChoice - set to True if opponent chooses creature (for Preacher) - not implemented yet
// Untap - set to True if target card should untap when control is taken
// DestroyTgt - actions upon which the tgt should be destroyed. same list as LoseControl
// NoRegen - set if destroyed creature can't be regenerated. used only with DestroyTgt
/**
* <p>
@@ -77,16 +76,14 @@ public class ControlGainAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Game game = ai.getGame();
final FCollectionView<Player> opponents = ai.getOpponents();
final PlayerCollection opponents = ai.getOpponents();
// if Defined, then don't worry about targeting
if (tgt == null) {
if (sa.hasParam("AllValid")) {
CardCollectionView tgtCards = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), opponents);
tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa);
if (tgtCards.isEmpty()) {
return false;
}
return !tgtCards.isEmpty();
}
return true;
} else {
@@ -96,18 +93,19 @@ public class ControlGainAi extends SpellAbilityAi {
sa.setTargetingPlayer(targetingPlayer);
return targetingPlayer.getController().chooseTargetsFor(sa);
}
if (tgt.isRandomTarget()) {
sa.getTargets().add(Aggregates.random(tgt.getAllCandidates(sa, false)));
}
if (tgt.canOnlyTgtOpponent()) {
List<Player> oppList = Lists
.newArrayList(Iterables.filter(opponents, PlayerPredicates.isTargetableBy(sa)));
List<Player> oppList = opponents.filter(PlayerPredicates.isTargetableBy(sa));
if (oppList.isEmpty()) {
return false;
}
sa.getTargets().add(oppList.get(0));
if (tgt.isRandomTarget()) {
sa.getTargets().add(Aggregates.random(oppList));
} else {
sa.getTargets().add(oppList.get(0));
}
}
}
@@ -247,7 +245,7 @@ public class ControlGainAi extends SpellAbilityAi {
break;
}
}
};
}
if (t != null) {
sa.getTargets().add(t);
@@ -296,19 +294,16 @@ public class ControlGainAi extends SpellAbilityAi {
lose.addAll(Lists.newArrayList(sa.getParam("LoseControl").split(",")));
}
if (lose.contains("EOT")
&& game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
return false;
}
return !lose.contains("EOT")
|| !game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS);
} else {
return this.canPlayAI(ai, sa);
}
return true;
} // pumpDrawbackAI()
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
final List<Card> cards = Lists.newArrayList();
for (Player p : options) {
cards.addAll(p.getCreaturesInPlay());

View File

@@ -0,0 +1,82 @@
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
/**
* <p>
* AbilityFactory_GainControlVariant class.
* </p>
*
* @author Forge
* @version $Id: AbilityFactoryGainControl.java 17764 2012-10-29 11:04:18Z Sloth $
*/
public class ControlGainVariantAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(final Player ai, final SpellAbility sa) {
String logic = sa.getParam("AILogic");
if ("GainControlOwns".equals(logic)) {
List<Card> list = CardLists.filter(ai.getGame().getCardsIn(ZoneType.Battlefield), new Predicate<Card>() {
@Override
public boolean apply(final Card crd) {
return crd.isCreature() && !crd.getController().equals(crd.getOwner());
}
});
if (list.isEmpty()) {
return false;
}
for (final Card c : list) {
if (ai.equals(c.getController())) {
return false;
}
}
}
return true;
}
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
Iterable<Card> otherCtrl = CardLists.filter(options, Predicates.not(CardPredicates.isController(ai)));
if (Iterables.isEmpty(otherCtrl)) {
return ComputerUtilCard.getWorstAI(options);
} else {
return ComputerUtilCard.getBestAI(otherCtrl);
}
}
}

View File

@@ -5,6 +5,7 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import forge.ai.*;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.card.*;
import forge.game.card.CardPredicates.Presets;
@@ -18,13 +19,13 @@ import forge.game.zone.ZoneType;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class CopyPermanentAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
// Card source = sa.getHostCard();
// TODO - I'm sure someone can do this AI better
Card source = sa.getHostCard();
PhaseHandler ph = aiPlayer.getGame().getPhaseHandler();
String aiLogic = sa.getParamOrDefault("AILogic", "");
@@ -38,6 +39,11 @@ public class CopyPermanentAi extends SpellAbilityAi {
return ph.is(PhaseType.END_OF_TURN);
} else if ("AtOppEOT".equals(aiLogic)) {
return ph.is(PhaseType.END_OF_TURN) && ph.getPlayerTurn() != aiPlayer;
} else if ("DuplicatePerms".equals(aiLogic)) {
final List<Card> valid = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
if (valid.size() < 2) {
return false;
}
}
if (sa.hasParam("AtEOT") && !aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1)) {
@@ -46,7 +52,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
if (sa.hasParam("Defined")) {
// If there needs to be an imprinted card, don't activate the ability if nothing was imprinted yet (e.g. Mimic Vat)
if (sa.getParam("Defined").equals("Imprinted.ExiledWithSource") && sa.getHostCard().getImprintedCards().isEmpty()) {
if (sa.getParam("Defined").equals("Imprinted.ExiledWithSource") && source.getImprintedCards().isEmpty()) {
return false;
}
}
@@ -60,9 +66,32 @@ public class CopyPermanentAi extends SpellAbilityAi {
if (sa.usesTargeting() && sa.hasParam("TargetingPlayer")) {
sa.resetTargets();
Player targetingPlayer = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("TargetingPlayer"), sa).get(0);
Player targetingPlayer = AbilityUtils.getDefinedPlayers(source, sa.getParam("TargetingPlayer"), sa).get(0);
sa.setTargetingPlayer(targetingPlayer);
return targetingPlayer.getController().chooseTargetsFor(sa);
} else if (sa.getTargetRestrictions() != null && sa.getTargetRestrictions().canTgtPlayer()) {
if (!sa.isCurse()) {
if (sa.canTarget(aiPlayer)) {
sa.getTargets().add(aiPlayer);
return true;
} else {
for (Player p : aiPlayer.getTeamMates(true)) {
if (sa.canTarget(p)) {
sa.getTargets().add(p);
return true;
}
}
return false;
}
} else {
for (Player p : aiPlayer.getOpponents()) {
if (sa.canTarget(p)) {
sa.getTargets().add(p);
return true;
}
}
return false;
}
} else {
return this.doTriggerAINoCost(aiPlayer, sa, false);
}
@@ -74,6 +103,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
final Player activator = sa.getActivatingPlayer();
final Game game = host.getGame();
final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa);
final boolean canCopyLegendary = sa.hasParam("NonLegendary");
// ////
@@ -114,7 +144,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
list = CardLists.filter(list, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return !c.getType().isLegendary() || !c.getController().equals(aiPlayer);
return (!c.getType().isLegendary() || canCopyLegendary) || !c.getController().equals(aiPlayer);
}
});
Card choice;
@@ -152,6 +182,13 @@ public class CopyPermanentAi extends SpellAbilityAi {
// if no targeting, it should always be ok
}
if ("TriggeredCardController".equals(sa.getParam("Controller"))) {
Card trigCard = (Card)sa.getTriggeringObject(AbilityKey.Card);
if (!mandatory && trigCard != null && trigCard.getController().isOpponentOf(aiPlayer)) {
return false;
}
}
return true;
}
@@ -168,7 +205,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
* @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List, boolean)
*/
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
// Select a card to attach to
CardCollection betterOptions = getBetterOptions(ai, sa, options, isOptional);
if (!betterOptions.isEmpty()) {
@@ -180,13 +217,14 @@ public class CopyPermanentAi extends SpellAbilityAi {
private CardCollection getBetterOptions(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional) {
final Card host = sa.getHostCard();
final Player ctrl = host.getController();
final String filter = "Permanent.YouDontCtrl,Permanent.nonLegendary";
final boolean canCopyLegendary = sa.hasParam("NonLegendary");
final String filter = canCopyLegendary ? "Permanent" : "Permanent.YouDontCtrl,Permanent.nonLegendary";
// TODO add filter to not select Legendary from Other Player when ai already have a Legendary with that name
return CardLists.getValidCards(options, filter.split(","), ctrl, host, sa);
}
@Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
final List<Card> cards = new PlayerCollection(options).getCreaturesInPlay();
Card chosen = ComputerUtilCard.getBestCreatureAI(cards);
return chosen != null ? chosen.getController() : Iterables.getFirst(options, null);

View File

@@ -29,8 +29,8 @@ public class CopySpellAbilityAi extends SpellAbilityAi {
final SpellAbility top = game.getStack().peekAbility();
if (top != null
&& top.getPayCosts() != null && top.getPayCosts().getCostMana() != null
&& sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null
&& top.getPayCosts().getCostMana() != null
&& sa.getPayCosts().getCostMana() != null
&& top.getPayCosts().getCostMana().getMana().getCMC() >= sa.getPayCosts().getCostMana().getMana().getCMC() + diff) {
// The copied spell has a significantly higher CMC than the copy spell, consider copying
chance = 100;

View File

@@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -26,7 +26,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CounterType;
import forge.game.card.CounterEnumType;
import forge.game.keyword.Keyword;
import forge.util.Aggregates;
@@ -35,7 +35,7 @@ import forge.util.Aggregates;
* <p>
* AbilityFactory_Counters class.
* </p>
*
*
* @author Forge
* @version $Id$
*/
@@ -46,7 +46,7 @@ public abstract class CountersAi {
* <p>
* chooseCursedTarget.
* </p>
*
*
* @param list
* a {@link forge.CardList} object.
* @param type
@@ -77,7 +77,7 @@ public abstract class CountersAi {
* <p>
* chooseBoonTarget.
* </p>
*
*
* @param list
* a {@link forge.CardList} object.
* @param type
@@ -97,7 +97,7 @@ public abstract class CountersAi {
final CardCollection boon = CardLists.filter(list, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
return c.getCounters(CounterType.DIVINITY) == 0;
return c.getCounters(CounterEnumType.DIVINITY) == 0;
}
});
choice = ComputerUtilCard.getMostExpensivePermanentAI(boon, null, false);

View File

@@ -42,14 +42,14 @@ public class CountersMoveAi extends SpellAbilityAi {
protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) {
final Card host = sa.getHostCard();
final String type = sa.getParam("CounterType");
final CounterType cType = "Any".equals(type) ? null : CounterType.valueOf(type);
final CounterType cType = "Any".equals(type) ? null : CounterType.getType(type);
// Don't tap creatures that may be able to block
if (ComputerUtil.waitForBlocking(sa)) {
return false;
}
if (CounterType.P1P1.equals(cType) && sa.hasParam("Source")) {
if (CounterEnumType.P1P1.equals(cType) && sa.hasParam("Source")) {
int amount = calcAmount(sa, cType);
final List<Card> srcCards = AbilityUtils.getDefinedCards(host, sa.getParam("Source"), sa);
if (ph.getPlayerTurn().isOpponentOf(ai)) {
@@ -90,11 +90,9 @@ public class CountersMoveAi extends SpellAbilityAi {
}
// for Simic Fluxmage and other
if (!ph.getNextTurn().equals(ai) || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) {
return false;
}
return ph.getNextTurn().equals(ai) && !ph.getPhase().isBefore(PhaseType.END_OF_TURN);
} else if (CounterType.P1P1.equals(cType) && sa.hasParam("Defined")) {
} else if (CounterEnumType.P1P1.equals(cType) && sa.hasParam("Defined")) {
// something like Cyptoplast Root-kin
if (ph.getPlayerTurn().isOpponentOf(ai)) {
if (ph.inCombat() && ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
@@ -107,9 +105,7 @@ public class CountersMoveAi extends SpellAbilityAi {
}
// Make sure that removing the last counter doesn't kill the creature
if ("Self".equals(sa.getParam("Source"))) {
if (host != null && host.getNetToughness() - 1 <= 0) {
return false;
}
return host == null || host.getNetToughness() - 1 > 0;
}
}
return true;
@@ -119,6 +115,7 @@ public class CountersMoveAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(final Player ai, SpellAbility sa, boolean mandatory) {
if (sa.usesTargeting()) {
sa.resetTargets();
if (!moveTgtAI(ai, sa) && !mandatory) {
return false;
@@ -146,7 +143,7 @@ public class CountersMoveAi extends SpellAbilityAi {
final Card host = sa.getHostCard();
final String type = sa.getParam("CounterType");
final CounterType cType = "Any".equals(type) ? null : CounterType.valueOf(type);
final CounterType cType = "Any".equals(type) ? null : CounterType.getType(type);
final List<Card> srcCards = AbilityUtils.getDefinedCards(host, sa.getParam("Source"), sa);
final List<Card> destCards = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
@@ -193,9 +190,7 @@ public class CountersMoveAi extends SpellAbilityAi {
// check for some specific AI preferences
if ("DontMoveCounterIfLethal".equals(sa.getParam("AILogic"))) {
if (cType == CounterType.P1P1 && src.getNetToughness() - src.getTempToughnessBoost() - 1 <= 0) {
return false;
}
return !cType.is(CounterEnumType.P1P1) || src.getNetToughness() - src.getTempToughnessBoost() - 1 > 0;
}
}
// no target
@@ -207,9 +202,7 @@ public class CountersMoveAi extends SpellAbilityAi {
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
if (sa.usesTargeting()) {
sa.resetTargets();
if (!moveTgtAI(ai, sa)) {
return false;
}
return moveTgtAI(ai, sa);
}
return true;
@@ -242,7 +235,7 @@ public class CountersMoveAi extends SpellAbilityAi {
final Card host = sa.getHostCard();
final Game game = ai.getGame();
final String type = sa.getParam("CounterType");
final CounterType cType = "Any".equals(type) ? null : CounterType.valueOf(type);
final CounterType cType = "Any".equals(type) || "All".equals(type) ? null : CounterType.getType(type);
List<Card> tgtCards = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa);
@@ -286,11 +279,8 @@ public class CountersMoveAi extends SpellAbilityAi {
// do not steal a P1P1 from Undying if it would die
// this way
if (CounterType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) {
if (srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken()) {
return true;
}
return false;
if (CounterEnumType.P1P1.equals(cType) && srcCardCpy.getNetToughness() <= 0) {
return srcCardCpy.getCounters(cType) > 0 || !card.hasKeyword(Keyword.UNDYING) || card.isToken();
}
return true;
}
@@ -332,13 +322,13 @@ public class CountersMoveAi extends SpellAbilityAi {
}
// try to remove P1P1 from undying or evolve
if (CounterType.P1P1.equals(cType)) {
if (CounterEnumType.P1P1.equals(cType)) {
if (card.hasKeyword(Keyword.UNDYING) || card.hasKeyword(Keyword.EVOLVE)
|| card.hasKeyword(Keyword.ADAPT)) {
return true;
}
}
if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) {
if (CounterEnumType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) {
return true;
}
@@ -393,10 +383,10 @@ public class CountersMoveAi extends SpellAbilityAi {
}
if (cType != null) {
if (CounterType.P1P1.equals(cType) && card.hasKeyword(Keyword.UNDYING)) {
if (CounterEnumType.P1P1.equals(cType) && card.hasKeyword(Keyword.UNDYING)) {
return false;
}
if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) {
if (CounterEnumType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) {
return false;
}
@@ -404,7 +394,7 @@ public class CountersMoveAi extends SpellAbilityAi {
return false;
}
}
return false;
return true;
}
});
@@ -463,7 +453,7 @@ public class CountersMoveAi extends SpellAbilityAi {
// or for source -> multiple defined
@Override
protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional,
Player targetedPlayer) {
Player targetedPlayer, Map<String, Object> params) {
if (sa.hasParam("AiLogic")) {
String logic = sa.getParam("AiLogic");

View File

@@ -16,6 +16,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -48,6 +49,7 @@ public class CountersMultiplyAi extends SpellAbilityAi {
if (!c.canReceiveCounters(counterType)) {
return false;
}
} else {
for (Map.Entry<CounterType, Integer> e : c.getCounters().entrySet()) {
// has negative counter it would double
@@ -76,7 +78,7 @@ public class CountersMultiplyAi extends SpellAbilityAi {
protected boolean checkPhaseRestrictions(final Player ai, final SpellAbility sa, final PhaseHandler ph) {
final CounterType counterType = getCounterType(sa);
if (!CounterType.P1P1.equals(counterType) && counterType != null) {
if (!CounterEnumType.P1P1.equals(counterType) && counterType != null) {
if (!sa.hasParam("ActivationPhases")) {
// Don't use non P1P1/M1M1 counters before main 2 if possible
if (ph.getPhase().isBefore(PhaseType.MAIN2) && !ComputerUtil.castSpellInMain1(ai, sa)) {
@@ -96,10 +98,7 @@ public class CountersMultiplyAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
if (sa.usesTargeting() && !setTargets(ai, sa) && !mandatory) {
return false;
}
return true;
return !sa.usesTargeting() || setTargets(ai, sa) || mandatory;
}
private CounterType getCounterType(SpellAbility sa) {
@@ -149,15 +148,15 @@ public class CountersMultiplyAi extends SpellAbilityAi {
if (!aiList.isEmpty()) {
// counter type list to check
// first loyalty, then P1P!, then Charge Counter
List<CounterType> typeList = Lists.newArrayList(CounterType.LOYALTY, CounterType.P1P1, CounterType.CHARGE);
for (CounterType type : typeList) {
List<CounterEnumType> typeList = Lists.newArrayList(CounterEnumType.LOYALTY, CounterEnumType.P1P1, CounterEnumType.CHARGE);
for (CounterEnumType type : typeList) {
// enough targets
if (!sa.canAddMoreTarget()) {
break;
}
if (counterType == null || counterType == type) {
addTargetsByCounterType(ai, sa, aiList, type);
if (counterType == null || counterType.is(type)) {
addTargetsByCounterType(ai, sa, aiList, CounterType.get(type));
}
}
}
@@ -166,7 +165,7 @@ public class CountersMultiplyAi extends SpellAbilityAi {
if (!oppList.isEmpty()) {
// not enough targets
if (sa.canAddMoreTarget()) {
final CounterType type = CounterType.M1M1;
final CounterType type = CounterType.get(CounterEnumType.M1M1);
if (counterType == null || counterType == type) {
addTargetsByCounterType(ai, sa, oppList, type);
}

View File

@@ -1,15 +1,21 @@
package forge.ai.ability;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.GameEntity;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.card.CardUtil;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -27,16 +33,20 @@ public class CountersProliferateAi extends SpellAbilityAi {
for (final Player p : allies) {
// player has experience or energy counter
if (p.getCounters(CounterType.EXPERIENCE) + p.getCounters(CounterType.ENERGY) >= 1) {
if (p.getCounters(CounterEnumType.EXPERIENCE) + p.getCounters(CounterEnumType.ENERGY) >= 1) {
allyExpOrEnergy = true;
}
cperms.addAll(CardLists.filter(p.getCardsIn(ZoneType.Battlefield), new Predicate<Card>() {
@Override
public boolean apply(final Card crd) {
if (crd.hasCounters()) {
if (!crd.hasCounters()) {
return false;
}
if (crd.isPlaneswalker()) {
return true;
}
// iterate only over existing counters
for (final Map.Entry<CounterType, Integer> e : crd.getCounters().entrySet()) {
if (e.getValue() >= 1 && !ComputerUtil.isNegativeCounter(e.getKey(), crd)) {
@@ -56,7 +66,11 @@ public class CountersProliferateAi extends SpellAbilityAi {
hperms.addAll(CardLists.filter(o.getCardsIn(ZoneType.Battlefield), new Predicate<Card>() {
@Override
public boolean apply(final Card crd) {
if (crd.hasCounters()) {
if (!crd.hasCounters()) {
return false;
}
if (crd.isPlaneswalker()) {
return false;
}
@@ -70,12 +84,9 @@ public class CountersProliferateAi extends SpellAbilityAi {
}
}));
}
if (cperms.isEmpty() && hperms.isEmpty() && !opponentPoison && !allyExpOrEnergy) {
return false;
}
return true;
return !cperms.isEmpty() || !hperms.isEmpty() || opponentPoison || allyExpOrEnergy;
}
@Override
@@ -92,7 +103,70 @@ public class CountersProliferateAi extends SpellAbilityAi {
*/
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
return canPlayAI(ai, sa);
if ("Always".equals(sa.getParam("AILogic"))) {
return true;
}
return checkApiLogic(ai, sa);
}
/*
* (non-Javadoc)
* @see forge.ai.SpellAbilityAi#chooseSingleEntity(forge.game.player.Player, forge.game.spellability.SpellAbility, java.util.Collection, boolean, forge.game.player.Player)
*/
@SuppressWarnings("unchecked")
@Override
public <T extends GameEntity> T chooseSingleEntity(Player ai, SpellAbility sa, Collection<T> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
// Proliferate is always optional for all, no need to select best
final CounterType poison = CounterType.get(CounterEnumType.POISON);
// because countertype can't be chosen anymore, only look for posion counters
for (final Player p : Iterables.filter(options, Player.class)) {
if (p.isOpponentOf(ai)) {
if (p.getCounters(poison) > 0 && p.canReceiveCounters(poison)) {
return (T)p;
}
} else {
if (p.getCounters(poison) <= 5 || p.canReceiveCounters(poison)) {
return (T)p;
}
}
}
for (final Card c : Iterables.filter(options, Card.class)) {
// AI planeswalker always, opponent planeswalkers never
if (c.isPlaneswalker()) {
if (c.getController().isOpponentOf(ai)) {
continue;
} else {
return (T)c;
}
}
final Card lki = CardUtil.getLKICopy(c);
// update all the counters there
boolean hasNegative = false;
for (final CounterType ct : c.getCounters().keySet()) {
hasNegative = hasNegative || ComputerUtil.isNegativeCounter(ct, c);
lki.setCounters(ct, lki.getCounters(ct) + 1);
}
// TODO need more logic there?
// it tries to evaluate the creatures
if (c.isCreature()) {
if (c.getController().isOpponentOf(ai) ==
(ComputerUtilCard.evaluateCreature(lki, true, false)
< ComputerUtilCard.evaluateCreature(c, true, false))) {
return (T)c;
}
} else {
if (!c.getController().isOpponentOf(ai) && !hasNegative) {
return (T)c;
}
}
}
return null;
}
}

View File

@@ -35,7 +35,7 @@ public class CountersPutAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#willPayCosts(forge.game.player.Player,
* forge.game.spellability.SpellAbility, forge.game.cost.Cost,
* forge.game.card.Card)
@@ -56,17 +56,17 @@ public class CountersPutAi extends SpellAbilityAi {
if (part instanceof CostRemoveCounter) {
final CostRemoveCounter remCounter = (CostRemoveCounter) part;
final CounterType counterType = remCounter.counter;
if (counterType.name().equals(type) && !aiLogic.startsWith("MoveCounter")) {
if (counterType.getName().equals(type) && !aiLogic.startsWith("MoveCounter")) {
return false;
}
if (!part.payCostFromSource()) {
if (counterType.equals(CounterType.P1P1)) {
if (counterType.is(CounterEnumType.P1P1)) {
return false;
}
continue;
}
// don't kill the creature
if (counterType.equals(CounterType.P1P1) && source.getLethalDamage() <= 1) {
if (counterType.is(CounterEnumType.P1P1) && source.getLethalDamage() <= 1) {
return false;
}
}
@@ -77,7 +77,7 @@ public class CountersPutAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see
* forge.ai.SpellAbilityAi#checkPhaseRestrictions(forge.game.player.Player,
* forge.game.spellability.SpellAbility, forge.game.phase.PhaseHandler)
@@ -109,7 +109,7 @@ public class CountersPutAi extends SpellAbilityAi {
}
}
int maxLevel = Integer.parseInt(sa.getParam("MaxLevel"));
return source.getCounters(CounterType.LEVEL) < maxLevel;
return source.getCounters(CounterEnumType.LEVEL) < maxLevel;
}
return super.checkPhaseRestrictions(ai, sa, ph);
@@ -146,7 +146,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (abTgt.canTgtPlayer()) {
// try to kill opponent with Poison
PlayerCollection oppList = ai.getOpponents().filter(PlayerPredicates.isTargetableBy(sa));
PlayerCollection poisonList = oppList.filter(PlayerPredicates.hasCounter(CounterType.POISON, 9));
PlayerCollection poisonList = oppList.filter(PlayerPredicates.hasCounter(CounterEnumType.POISON, 9));
if (!poisonList.isEmpty()) {
sa.getTargets().add(poisonList.max(PlayerPredicates.compareByLife()));
return true;
@@ -157,13 +157,13 @@ public class CountersPutAi extends SpellAbilityAi {
// try to kill creature with -1/-1 counters if it can
// receive counters, execpt it has undying
CardCollection oppCreat = CardLists.getTargetableCards(ai.getOpponents().getCreaturesInPlay(), sa);
CardCollection oppCreatM1 = CardLists.filter(oppCreat, CardPredicates.hasCounter(CounterType.M1M1));
CardCollection oppCreatM1 = CardLists.filter(oppCreat, CardPredicates.hasCounter(CounterEnumType.M1M1));
oppCreatM1 = CardLists.getNotKeyword(oppCreatM1, Keyword.UNDYING);
oppCreatM1 = CardLists.filter(oppCreatM1, new Predicate<Card>() {
@Override
public boolean apply(Card input) {
return input.getNetToughness() <= 1 && input.canReceiveCounters(CounterType.M1M1);
return input.getNetToughness() <= 1 && input.canReceiveCounters(CounterType.get(CounterEnumType.M1M1));
}
});
@@ -220,6 +220,10 @@ public class CountersPutAi extends SpellAbilityAi {
if ("Never".equals(logic)) {
return false;
} else if ("AlwaysWithNoTgt".equals(logic)) {
return true;
} else if ("AristocratCounters".equals(logic)) {
return PumpAi.doAristocratWithCountersLogic(sa, ai);
} else if ("PayEnergy".equals(logic)) {
return true;
} else if ("PayEnergyConservatively".equals(logic)) {
@@ -240,7 +244,7 @@ public class CountersPutAi extends SpellAbilityAi {
int totBlkPower = Aggregates.sum(blocked, CardPredicates.Accessors.fnGetNetPower);
int totBlkToughness = Aggregates.min(blocked, CardPredicates.Accessors.fnGetNetToughness);
int numActivations = ai.getCounters(CounterType.ENERGY) / sa.getPayCosts().getCostEnergy().convertAmount();
int numActivations = ai.getCounters(CounterEnumType.ENERGY) / sa.getPayCosts().getCostEnergy().convertAmount();
if (sa.getHostCard().getNetToughness() + numActivations > totBlkPower
|| sa.getHostCard().getNetPower() + numActivations >= totBlkToughness) {
return true;
@@ -255,7 +259,7 @@ public class CountersPutAi extends SpellAbilityAi {
AiCardMemory.rememberCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN);
return true;
}
} else if (ai.getCounters(CounterType.ENERGY) > ComputerUtilCard.getMaxSAEnergyCostOnBattlefield(ai) + sa.getPayCosts().getCostEnergy().convertAmount()) {
} else if (ai.getCounters(CounterEnumType.ENERGY) > ComputerUtilCard.getMaxSAEnergyCostOnBattlefield(ai) + sa.getPayCosts().getCostEnergy().convertAmount()) {
// outside of combat, this logic only works if the relevant AI profile option is enabled
// and if there is enough energy saved
if (!onlyInCombat) {
@@ -289,7 +293,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (sa.getConditions() != null && !sa.getConditions().areMet(sa) && sa.getSubAbility() == null) {
return false;
}
if (sourceName.equals("Feat of Resistance")) { // sub-ability should take precedence
CardCollection prot = ProtectAi.getProtectCreatures(ai, sa.getSubAbility());
if (!prot.isEmpty()) {
@@ -311,13 +315,20 @@ public class CountersPutAi extends SpellAbilityAi {
return false;
}
if (sa.hasParam("Adapt") && source.getCounters(CounterType.P1P1) > 0) {
return false;
}
// TODO handle proper calculation of X values based on Cost
int amount = AbilityUtils.calculateAmount(source, amountStr, sa);
if (sa.hasParam("Adapt")) {
Game game = ai.getGame();
Combat combat = game.getCombat();
if (!source.canReceiveCounters(CounterType.get(CounterEnumType.P1P1)) || source.getCounters(CounterEnumType.P1P1) > 0) {
return false;
} else if (combat != null && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
return doCombatAdaptLogic(source, amount, combat);
}
}
if ("Fight".equals(logic)) {
int nPump = 0;
if (type.equals("P1P1")) {
@@ -325,7 +336,7 @@ public class CountersPutAi extends SpellAbilityAi {
}
return FightAi.canFightAi(ai, sa, nPump, nPump);
}
if (amountStr.equals("X")) {
if (source.getSVar(amountStr).equals("Count$xPaid")) {
// By default, set PayX here to maximum value (used for most SAs of this type).
@@ -334,7 +345,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (isClockwork) {
// Clockwork Avian and other similar cards: do not tap all mana for X,
// instead only rewind to max allowed value when the power gets low enough.
int curCtrs = source.getCounters(CounterType.P1P0);
int curCtrs = source.getCounters(CounterEnumType.P1P0);
int maxCtrs = Integer.parseInt(sa.getParam("MaxFromEffect"));
// This will "rewind" clockwork cards when they fall to 50% power or below, consider improving
@@ -385,7 +396,7 @@ public class CountersPutAi extends SpellAbilityAi {
return true;
}
}
if (!ai.getGame().getStack().isEmpty() && !SpellAbilityAi.isSorcerySpeed(sa)) {
final TargetRestrictions abTgt = sa.getTargetRestrictions();
// only evaluates case where all tokens are placed on a single target
@@ -406,8 +417,8 @@ public class CountersPutAi extends SpellAbilityAi {
// Targeting
if (sa.usesTargeting()) {
sa.resetTargets();
sa.resetTargets();
final boolean sacSelf = ComputerUtilCost.isSacrificeSelfCost(abCost);
if (sa.isCurse()) {
@@ -424,7 +435,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (sacSelf && c.equals(source)) {
return false;
}
return sa.canTarget(c) && c.canReceiveCounters(CounterType.valueOf(type));
return sa.canTarget(c) && c.canReceiveCounters(CounterType.getType(type));
}
});
@@ -443,7 +454,6 @@ public class CountersPutAi extends SpellAbilityAi {
// but try to do it in Main 2 then so that the AI has a chance to play creatures first.
if (list.isEmpty()
&& sa.hasParam("Planeswalker")
&& sa.getPayCosts() != null
&& sa.getPayCosts().hasOnlySpecificCostType(CostPutCounter.class)
&& sa.isTargetNumberValid()
&& sa.getTargets().getNumTargeted() == 0
@@ -460,7 +470,7 @@ public class CountersPutAi extends SpellAbilityAi {
int left = amount;
for (Card c : list) {
if (ComputerUtilCard.shouldPumpCard(ai, sa, c, i, i,
Lists.<String>newArrayList())) {
Lists.newArrayList())) {
sa.getTargets().add(c);
abTgt.addDividedAllocation(c, i);
left -= i;
@@ -478,7 +488,7 @@ public class CountersPutAi extends SpellAbilityAi {
}
return false;
}
// target loop
while (sa.canAddMoreTarget()) {
if (list.isEmpty()) {
@@ -497,7 +507,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (type.equals("P1P1") && !SpellAbilityAi.isSorcerySpeed(sa)) {
for (Card c : list) {
if (ComputerUtilCard.shouldPumpCard(ai, sa, c, amount, amount,
Lists.<String>newArrayList())) {
Lists.newArrayList())) {
choice = c;
break;
}
@@ -548,7 +558,7 @@ public class CountersPutAi extends SpellAbilityAi {
return false;
}
final int currCounters = cards.get(0).getCounters(CounterType.valueOf(type));
final int currCounters = cards.get(0).getCounters(CounterType.get(type));
// each non +1/+1 counter on the card is a 10% chance of not
// activating this ability.
@@ -564,11 +574,11 @@ public class CountersPutAi extends SpellAbilityAi {
}
boolean immediately = ComputerUtil.playImmediately(ai, sa);
if (abCost != null && !ComputerUtilCost.checkSacrificeCost(ai, abCost, source, sa, immediately)) {
return false;
}
if (immediately) {
return true;
}
@@ -586,7 +596,7 @@ public class CountersPutAi extends SpellAbilityAi {
if (ComputerUtil.waitForBlocking(sa)) {
return false;
}
return true;
}
@@ -602,7 +612,7 @@ public class CountersPutAi extends SpellAbilityAi {
final boolean divided = sa.hasParam("DividedAsYouChoose");
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa);
final boolean isMandatoryTrigger = (sa.isTrigger() && !sa.isOptionalTrigger())
final boolean isMandatoryTrigger = (sa.isTrigger() && !sa.isOptionalTrigger())
|| (sa.getRootAbility().isTrigger() && !sa.getRootAbility().isOptionalTrigger());
if (sa.usesTargeting()) {
@@ -682,12 +692,12 @@ public class CountersPutAi extends SpellAbilityAi {
final boolean divided = sa.hasParam("DividedAsYouChoose");
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa);
int left = amount;
if (!sa.usesTargeting()) {
// No target. So must be defined
list = new CardCollection(AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa));
if (amountStr.equals("X")
if (amountStr.equals("X")
&& !source.hasSVar("PayX") /* SubAbility on something that already had set PayX, e.g. Endless One ETB counters */
&& ((sa.hasParam(amountStr) && sa.getSVar(amountStr).equals("Count$xPaid")) || source.getSVar(amountStr).equals("Count$xPaid") )) {
@@ -695,7 +705,7 @@ public class CountersPutAi extends SpellAbilityAi {
SpellAbility testSa = sa;
int countX = 0;
int nonXGlyphs = 0;
while (testSa != null && testSa.getPayCosts() != null && countX == 0) {
while (testSa != null && countX == 0) {
countX = testSa.getPayCosts().getTotalMana().countX();
nonXGlyphs = testSa.getPayCosts().getTotalMana().getGlyphCount() - countX;
testSa = testSa.getSubAbility();
@@ -717,12 +727,27 @@ public class CountersPutAi extends SpellAbilityAi {
source.setSVar("PayX", Integer.toString(payX));
}
if (!mandatory) {
// TODO - If Trigger isn't mandatory, when wouldn't we want to
// put a counter?
// things like Powder Keg, which are way too complex for the AI
}
} else if (sa.getTargetRestrictions().canOnlyTgtOpponent() && !sa.getTargetRestrictions().canTgtCreature()) {
// can only target opponent
List<Player> playerList = Lists.newArrayList(Iterables.filter(
sa.getTargetRestrictions().getAllCandidates(sa, true, true), Player.class));
if (playerList.isEmpty() && mandatory) {
return false;
}
// try to choose player with less creatures
Player choice = Collections.min(playerList, PlayerPredicates.compareByZoneSize(ZoneType.Battlefield, CardPredicates.Presets.CREATURES));
if (choice != null) {
sa.getTargets().add(choice);
}
} else {
if (sa.isCurse()) {
list = ai.getOpponents().getCardsIn(ZoneType.Battlefield);
@@ -829,7 +854,7 @@ public class CountersPutAi extends SpellAbilityAi {
List<Card> threatening = CardLists.filter(creats, new Predicate<Card>() {
@Override
public boolean apply(Card c) {
return CombatUtil.canBlock(source, c, !isHaste)
return CombatUtil.canBlock(source, c, !isHaste)
&& (c.getNetToughness() > source.getNetPower() + tributeAmount || c.hasKeyword(Keyword.DEATHTOUCH));
}
});
@@ -864,24 +889,28 @@ public class CountersPutAi extends SpellAbilityAi {
}
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
// used by Tribute, select player with lowest Life
// TODO add more logic using TributeAILogic
List<Player> list = Lists.newArrayList(options);
return Collections.min(list, PlayerPredicates.compareByLife());
}
@Override
protected Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
protected Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
// Bolster does use this
// TODO need more or less logic there?
final CounterType m1m1 = CounterType.get(CounterEnumType.M1M1);
final CounterType p1p1 = CounterType.get(CounterEnumType.P1P1);
// no logic if there is no options or no to choice
if (!isOptional && Iterables.size(options) <= 1) {
return Iterables.getFirst(options, null);
}
final CounterType type = CounterType.valueOf(sa.getParam("CounterType"));
final CounterType type = params.containsKey("CounterType") ? (CounterType)params.get("CounterType")
: CounterType.getType(sa.getParam("CounterType"));
final String amountStr = sa.getParamOrDefault("CounterNum", "1");
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa);
@@ -898,7 +927,7 @@ public class CountersPutAi extends SpellAbilityAi {
return false;
if (ComputerUtilCard.isUselessCreature(ai, input))
return false;
if (CounterType.M1M1.equals(type) && amount >= input.getNetToughness())
if (type.is(CounterEnumType.M1M1) && amount >= input.getNetToughness())
return true;
return ComputerUtil.isNegativeCounter(type, input);
}
@@ -922,6 +951,20 @@ public class CountersPutAi extends SpellAbilityAi {
CardCollection filtered = mine;
// Try to filter out keywords that we already have on cards
if (type.isKeywordCounter()) {
Keyword kw = Keyword.smartValueOf(type.getName());
final CardCollection doNotHaveKeyword = CardLists.filter(filtered, new Predicate<Card>() {
@Override
public boolean apply(Card card) {
return !card.hasKeyword(kw) && card.canBeTargetedBy(sa) && sa.canTarget(card);
}
});
if (doNotHaveKeyword.size() > 0)
filtered = doNotHaveKeyword;
}
final CardCollection notUseless = CardLists.filter(filtered, new Predicate<Card>() {
@Override
public boolean apply(Card input) {
@@ -936,26 +979,26 @@ public class CountersPutAi extends SpellAbilityAi {
}
// some special logic to reload Persist/Undying
if (CounterType.P1P1.equals(type)) {
if (p1p1.equals(type)) {
final CardCollection persist = CardLists.filter(filtered, new Predicate<Card>() {
@Override
public boolean apply(Card input) {
if (!input.hasKeyword(Keyword.PERSIST))
return false;
return input.getCounters(CounterType.M1M1) <= amount;
return input.getCounters(m1m1) <= amount;
}
});
if (!persist.isEmpty()) {
filtered = persist;
}
} else if (CounterType.M1M1.equals(type)) {
} else if (m1m1.equals(type)) {
final CardCollection undying = CardLists.filter(filtered, new Predicate<Card>() {
@Override
public boolean apply(Card input) {
if (!input.hasKeyword(Keyword.UNDYING))
return false;
return input.getCounters(CounterType.P1P1) <= amount && input.getNetToughness() > amount;
return input.getCounters(p1p1) <= amount && input.getNetToughness() > amount;
}
});
@@ -978,8 +1021,8 @@ public class CountersPutAi extends SpellAbilityAi {
if (e instanceof Card) {
Card c = (Card) e;
if (c.getController().isOpponentOf(ai)) {
if (options.contains(CounterType.M1M1) && !c.hasKeyword(Keyword.UNDYING)) {
return CounterType.M1M1;
if (options.contains(CounterType.get(CounterEnumType.M1M1)) && !c.hasKeyword(Keyword.UNDYING)) {
return CounterType.get(CounterEnumType.M1M1);
}
for (CounterType type : options) {
if (ComputerUtil.isNegativeCounter(type, c)) {
@@ -996,12 +1039,12 @@ public class CountersPutAi extends SpellAbilityAi {
} else if (e instanceof Player) {
Player p = (Player) e;
if (p.isOpponentOf(ai)) {
if (options.contains(CounterType.POISON)) {
return CounterType.POISON;
if (options.contains(CounterType.get(CounterEnumType.POISON))) {
return CounterType.get(CounterEnumType.POISON);
}
} else {
if (options.contains(CounterType.EXPERIENCE)) {
return CounterType.EXPERIENCE;
if (options.contains(CounterType.get(CounterEnumType.EXPERIENCE))) {
return CounterType.get(CounterEnumType.EXPERIENCE);
}
}
@@ -1049,4 +1092,39 @@ public class CountersPutAi extends SpellAbilityAi {
return false;
}
private boolean doCombatAdaptLogic(Card source, int amount, Combat combat) {
if (combat.isAttacking(source)) {
if (!combat.isBlocked(source)) {
return true;
} else {
for (Card blockedBy : combat.getBlockers(source)) {
if (blockedBy.getNetToughness() > source.getNetPower()
&& blockedBy.getNetToughness() <= source.getNetPower() + amount) {
return true;
}
}
int totBlkPower = Aggregates.sum(combat.getBlockers(source), CardPredicates.Accessors.fnGetNetPower);
if (source.getNetToughness() <= totBlkPower
&& source.getNetToughness() + amount > totBlkPower) {
return true;
}
}
} else if (combat.isBlocking(source)) {
for (Card blocked : combat.getAttackersBlockedBy(source)) {
if (blocked.getNetToughness() > source.getNetPower()
&& blocked.getNetToughness() <= source.getNetPower() + amount) {
return true;
}
}
int totAtkPower = Aggregates.sum(combat.getAttackersBlockedBy(source), CardPredicates.Accessors.fnGetNetPower);
if (source.getNetToughness() <= totAtkPower
&& source.getNetToughness() + amount > totAtkPower) {
return true;
}
}
return false;
}
}

View File

@@ -2,7 +2,6 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCost;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
@@ -39,8 +38,13 @@ public class CountersPutAllAi extends SpellAbilityAi {
final boolean curse = sa.isCurse();
final TargetRestrictions tgt = sa.getTargetRestrictions();
hList = CardLists.getValidCards(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
if ("OwnCreatsAndOtherPWs".equals(sa.getParam("AILogic"))) {
hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source);
cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source);
} else {
hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
}
if (abCost != null) {
// AI currently disabled for these costs
@@ -68,7 +72,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
}
if (tgt != null) {
Player pl = curse ? ComputerUtil.getOpponentFor(ai) : ai;
Player pl = curse ? ai.getWeakestOpponent() : ai;
sa.getTargets().add(pl);
hList = CardLists.filterControlledBy(hList, pl);
@@ -116,7 +120,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
//Check for cards that could profit from the ability
PhaseHandler phase = ai.getGame().getPhaseHandler();
if (type.equals("P1P1") && sa.isAbility() && source.isCreature()
&& sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()
&& sa.getPayCosts().hasTapCost()
&& sa instanceof AbilitySub
&& (!phase.getNextTurn().equals(ai)
|| phase.getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS))) {
@@ -149,7 +153,7 @@ public class CountersPutAllAi extends SpellAbilityAi {
*/
@Override
public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
return player.getCreaturesInPlay().size() >= ComputerUtil.getOpponentFor(player).getCreaturesInPlay().size();
return player.getCreaturesInPlay().size() >= player.getWeakestOpponent().getCreaturesInPlay().size();
}
@Override

View File

@@ -6,12 +6,12 @@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -36,7 +36,7 @@ import java.util.Map;
* <p>
* AbilityFactory_PutOrRemoveCountersAi class.
* </p>
*
*
* @author Forge
* @version $Id$
*/
@@ -44,7 +44,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#checkApiLogic(forge.game.player.Player,
* forge.game.spellability.SpellAbility)
*/
@@ -75,7 +75,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
if (sa.hasParam("CounterType")) {
// currently only Jhoira's Timebug
final CounterType type = CounterType.valueOf(sa.getParam("CounterType"));
final CounterType type = CounterType.getType(sa.getParam("CounterType"));
CardCollection countersList = CardLists.filter(list, CardPredicates.hasCounter(type, amount));
@@ -100,7 +100,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
if (!ai.isCardInPlay("Marit Lage") || noLegendary) {
CardCollectionView depthsList = CardLists.filter(countersList,
CardPredicates.nameEquals("Dark Depths"), CardPredicates.hasCounter(CounterType.ICE));
CardPredicates.nameEquals("Dark Depths"), CardPredicates.hasCounter(CounterEnumType.ICE));
if (!depthsList.isEmpty()) {
sa.getTargets().add(depthsList.getFirst());
@@ -113,7 +113,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
CardCollection planeswalkerList = CardLists.filter(
CardLists.filterControlledBy(countersList, ai.getOpponents()),
CardPredicates.Presets.PLANESWALKERS,
CardPredicates.hasLessCounter(CounterType.LOYALTY, amount));
CardPredicates.hasLessCounter(CounterEnumType.LOYALTY, amount));
if (!planeswalkerList.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getBestPlaneswalkerAI(planeswalkerList));
@@ -123,7 +123,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
// do as M1M1 part
CardCollection aiList = CardLists.filterControlledBy(countersList, ai);
CardCollection aiM1M1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterType.M1M1));
CardCollection aiM1M1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterEnumType.M1M1));
CardCollection aiPersistList = CardLists.getKeyword(aiM1M1List, Keyword.PERSIST);
if (!aiPersistList.isEmpty()) {
@@ -136,7 +136,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
}
// do as P1P1 part
CardCollection aiP1P1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterType.P1P1));
CardCollection aiP1P1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterEnumType.P1P1));
CardCollection aiUndyingList = CardLists.getKeyword(aiM1M1List, Keyword.UNDYING);
if (!aiUndyingList.isEmpty()) {
@@ -183,7 +183,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#chooseCounterType(java.util.List,
* forge.game.spellability.SpellAbility, java.util.Map)
*/
@@ -199,18 +199,18 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
Card tgt = (Card) params.get("Target");
// planeswalker has high priority for loyalty counters
if (tgt.isPlaneswalker() && options.contains(CounterType.LOYALTY)) {
return CounterType.LOYALTY;
if (tgt.isPlaneswalker() && options.contains(CounterType.get(CounterEnumType.LOYALTY))) {
return CounterType.get(CounterEnumType.LOYALTY);
}
if (tgt.getController().isOpponentOf(ai)) {
// creatures with BaseToughness below or equal zero might be
// killed if their counters are removed
if (tgt.isCreature() && tgt.getBaseToughness() <= 0) {
if (options.contains(CounterType.P1P1)) {
return CounterType.P1P1;
} else if (options.contains(CounterType.M1M1)) {
return CounterType.M1M1;
if (options.contains(CounterType.get(CounterEnumType.P1P1))) {
return CounterType.get(CounterEnumType.P1P1);
} else if (options.contains(CounterType.get(CounterEnumType.M1M1))) {
return CounterType.get(CounterEnumType.M1M1);
}
}
@@ -222,14 +222,14 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
}
} else {
// this counters are treat first to be removed
if ("Dark Depths".equals(tgt.getName()) && options.contains(CounterType.ICE)) {
if ("Dark Depths".equals(tgt.getName()) && options.contains(CounterType.get(CounterEnumType.ICE))) {
if (!ai.isCardInPlay("Marit Lage") || noLegendary) {
return CounterType.ICE;
return CounterType.get(CounterEnumType.ICE);
}
} else if (tgt.hasKeyword(Keyword.UNDYING) && options.contains(CounterType.P1P1)) {
return CounterType.P1P1;
} else if (tgt.hasKeyword(Keyword.PERSIST) && options.contains(CounterType.M1M1)) {
return CounterType.M1M1;
} else if (tgt.hasKeyword(Keyword.UNDYING) && options.contains(CounterType.get(CounterEnumType.P1P1))) {
return CounterType.get(CounterEnumType.P1P1);
} else if (tgt.hasKeyword(Keyword.PERSIST) && options.contains(CounterType.get(CounterEnumType.M1M1))) {
return CounterType.get(CounterEnumType.M1M1);
}
// fallback logic, select positive counter to add more
@@ -246,7 +246,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see
* forge.ai.SpellAbilityAi#chooseBinary(forge.game.player.PlayerController.
* BinaryChoiceType, forge.game.spellability.SpellAbility, java.util.Map)
@@ -262,19 +262,19 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi {
boolean noLegendary = game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule);
if (tgt.getController().isOpponentOf(ai)) {
if (type.equals(CounterType.LOYALTY) && tgt.isPlaneswalker()) {
if (type.is(CounterEnumType.LOYALTY) && tgt.isPlaneswalker()) {
return false;
}
return ComputerUtil.isNegativeCounter(type, tgt);
} else {
if (type.equals(CounterType.ICE) && "Dark Depths".equals(tgt.getName())) {
if (type.is(CounterEnumType.ICE) && "Dark Depths".equals(tgt.getName())) {
if (!ai.isCardInPlay("Marit Lage") || noLegendary) {
return false;
}
} else if (type.equals(CounterType.M1M1) && tgt.hasKeyword(Keyword.PERSIST)) {
} else if (type.is(CounterEnumType.M1M1) && tgt.hasKeyword(Keyword.PERSIST)) {
return false;
} else if (type.equals(CounterType.P1P1) && tgt.hasKeyword(Keyword.UNDYING)) {
} else if (type.is(CounterEnumType.P1P1) && tgt.hasKeyword(Keyword.UNDYING)) {
return false;
}

View File

@@ -6,6 +6,7 @@ import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityUtils;
import forge.game.card.*;
@@ -22,9 +23,17 @@ import java.util.Map;
public class CountersRemoveAi extends SpellAbilityAi {
@Override
protected boolean canPlayWithoutRestrict(final Player ai, final SpellAbility sa) {
if ("Always".equals(sa.getParam("AILogic"))) {
return true;
}
return super.canPlayWithoutRestrict(ai, sa);
}
/*
* (non-Javadoc)
*
*
* @see
* forge.ai.SpellAbilityAi#checkPhaseRestrictions(forge.game.player.Player,
* forge.game.spellability.SpellAbility, forge.game.phase.PhaseHandler)
@@ -41,7 +50,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see
* forge.ai.SpellAbilityAi#checkPhaseRestrictions(forge.game.player.Player,
* forge.game.spellability.SpellAbility, forge.game.phase.PhaseHandler,
@@ -59,7 +68,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#checkApiLogic(forge.game.player.Player,
* forge.game.spellability.SpellAbility)
*/
@@ -73,7 +82,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
}
if (!type.matches("Any") && !type.matches("All")) {
final int currCounters = sa.getHostCard().getCounters(CounterType.valueOf(type));
final int currCounters = sa.getHostCard().getCounters(CounterType.getType(type));
if (currCounters < 1) {
return false;
}
@@ -100,7 +109,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
}
// Filter AI-specific targets if provided
list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, false);
list = ComputerUtil.filterAITgts(sa, ai, list, false);
boolean noLegendary = game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule);
@@ -110,7 +119,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
if (!ai.isCardInPlay("Marit Lage") || noLegendary) {
CardCollectionView depthsList = ai.getCardsIn(ZoneType.Battlefield, "Dark Depths");
depthsList = CardLists.filter(depthsList, CardPredicates.isTargetableBy(sa),
CardPredicates.hasCounter(CounterType.ICE, 3));
CardPredicates.hasCounter(CounterEnumType.ICE, 3));
if (!depthsList.isEmpty()) {
sa.getTargets().add(depthsList.getFirst());
@@ -123,7 +132,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
list = CardLists.filter(list, CardPredicates.isTargetableBy(sa));
CardCollection planeswalkerList = CardLists.filter(list, CardPredicates.Presets.PLANESWALKERS,
CardPredicates.hasCounter(CounterType.LOYALTY, 5));
CardPredicates.hasCounter(CounterEnumType.LOYALTY, 5));
if (!planeswalkerList.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getBestPlaneswalkerAI(planeswalkerList));
@@ -150,11 +159,11 @@ public class CountersRemoveAi extends SpellAbilityAi {
if (!ai.isCardInPlay("Marit Lage") || noLegendary) {
CardCollectionView depthsList = ai.getCardsIn(ZoneType.Battlefield, "Dark Depths");
depthsList = CardLists.filter(depthsList, CardPredicates.isTargetableBy(sa),
CardPredicates.hasCounter(CounterType.ICE));
CardPredicates.hasCounter(CounterEnumType.ICE));
if (!depthsList.isEmpty()) {
Card depth = depthsList.getFirst();
int ice = depth.getCounters(CounterType.ICE);
int ice = depth.getCounters(CounterEnumType.ICE);
if (amount >= ice) {
sa.getTargets().add(depth);
if (xPay) {
@@ -171,7 +180,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
CardCollection planeswalkerList = CardLists.filter(list,
Predicates.and(CardPredicates.Presets.PLANESWALKERS, CardPredicates.isControlledByAnyOf(ai.getOpponents())),
CardPredicates.hasLessCounter(CounterType.LOYALTY, amount));
CardPredicates.hasLessCounter(CounterEnumType.LOYALTY, amount));
if (!planeswalkerList.isEmpty()) {
Card best = ComputerUtilCard.getBestPlaneswalkerAI(planeswalkerList);
@@ -187,7 +196,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
// do as M1M1 part
CardCollection aiList = CardLists.filterControlledBy(list, ai);
CardCollection aiM1M1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterType.M1M1));
CardCollection aiM1M1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterEnumType.M1M1));
CardCollection aiPersistList = CardLists.getKeyword(aiM1M1List, Keyword.PERSIST);
if (!aiPersistList.isEmpty()) {
@@ -200,14 +209,20 @@ public class CountersRemoveAi extends SpellAbilityAi {
}
// do as P1P1 part
CardCollection aiP1P1List = CardLists.filter(aiList, CardPredicates.hasCounter(CounterType.P1P1));
CardCollection aiUndyingList = CardLists.getKeyword(aiM1M1List, Keyword.UNDYING);
CardCollection aiP1P1List = CardLists.filter(aiList, CardPredicates.hasLessCounter(CounterEnumType.P1P1, amount));
CardCollection aiUndyingList = CardLists.getKeyword(aiP1P1List, Keyword.UNDYING);
if (!aiUndyingList.isEmpty()) {
aiP1P1List = aiUndyingList;
sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(aiUndyingList));
return true;
}
if (!aiP1P1List.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(aiP1P1List));
// remove P1P1 counters from opposing creatures
CardCollection oppP1P1List = CardLists.filter(list,
Predicates.and(CardPredicates.Presets.CREATURES, CardPredicates.isControlledByAnyOf(ai.getOpponents())),
CardPredicates.hasCounter(CounterEnumType.P1P1));
if (!oppP1P1List.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(oppP1P1List));
return true;
}
@@ -229,7 +244,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
// no special amount for that one yet
int amount = AbilityUtils.calculateAmount(source, amountStr, sa);
CardCollection aiList = CardLists.filterControlledBy(list, ai);
aiList = CardLists.filter(aiList, CardPredicates.hasCounter(CounterType.M1M1, amount));
aiList = CardLists.filter(aiList, CardPredicates.hasCounter(CounterEnumType.M1M1, amount));
CardCollection aiPersist = CardLists.getKeyword(aiList, Keyword.PERSIST);
if (!aiPersist.isEmpty()) {
@@ -248,7 +263,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
// no special amount for that one yet
int amount = AbilityUtils.calculateAmount(source, amountStr, sa);
list = CardLists.filter(list, CardPredicates.hasCounter(CounterType.P1P1, amount));
list = CardLists.filter(list, CardPredicates.hasCounter(CounterEnumType.P1P1, amount));
// currently only logic for Bloodcrazed Hoplite, but add logic for
// targeting ai creatures too
@@ -294,12 +309,12 @@ public class CountersRemoveAi extends SpellAbilityAi {
amount = AbilityUtils.calculateAmount(source, amountStr, sa);
}
CardCollection timeList = CardLists.filter(list, CardPredicates.hasLessCounter(CounterType.TIME, amount));
CardCollection timeList = CardLists.filter(list, CardPredicates.hasLessCounter(CounterEnumType.TIME, amount));
if (!timeList.isEmpty()) {
Card best = ComputerUtilCard.getBestAI(timeList);
int timeCount = best.getCounters(CounterType.TIME);
int timeCount = best.getCounters(CounterEnumType.TIME);
sa.getTargets().add(best);
if (xPay) {
source.setSVar("PayX", Integer.toString(timeCount));
@@ -320,7 +335,7 @@ public class CountersRemoveAi extends SpellAbilityAi {
CardCollection outlastCreats = CardLists.filter(list, CardPredicates.hasKeyword(Keyword.OUTLAST));
if (!outlastCreats.isEmpty()) {
// outlast cards often benefit from having +1/+1 counters, try not to remove last one
CardCollection betterTargets = CardLists.filter(outlastCreats, CardPredicates.hasCounter(CounterType.P1P1, 2));
CardCollection betterTargets = CardLists.filter(outlastCreats, CardPredicates.hasCounter(CounterEnumType.P1P1, 2));
if (!betterTargets.isEmpty()) {
sa.getTargets().add(ComputerUtilCard.getWorstAI(betterTargets));
@@ -348,19 +363,42 @@ public class CountersRemoveAi extends SpellAbilityAi {
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#chooseNumber(forge.game.player.Player,
* forge.game.spellability.SpellAbility, int, int, java.util.Map)
*/
@Override
public int chooseNumber(Player player, SpellAbility sa, int min, int max, Map<String, Object> params) {
// TODO Auto-generated method stub
GameEntity target = (GameEntity) params.get("Target");
CounterType type = (CounterType) params.get("CounterType");
if (target instanceof Card) {
Card targetCard = (Card) target;
if (targetCard.getController().isOpponentOf(player)) {
return !ComputerUtil.isNegativeCounter(type, targetCard) ? max : min;
} else {
if (targetCard.hasKeyword(Keyword.UNDYING) && type.is(CounterEnumType.P1P1)
&& targetCard.getCounters(CounterEnumType.P1P1) >= max) {
return max;
}
return ComputerUtil.isNegativeCounter(type, targetCard) ? max : min;
}
} else if (target instanceof Player) {
Player targetPlayer = (Player) target;
if (targetPlayer.isOpponentOf(player)) {
return !type.equals(CounterEnumType.POISON) ? max : min;
} else {
return type.equals(CounterEnumType.POISON) ? max : min;
}
}
return super.chooseNumber(player, sa, min, max, params);
}
/*
* (non-Javadoc)
*
*
* @see forge.ai.SpellAbilityAi#chooseCounterType(java.util.List,
* forge.game.spellability.SpellAbility, java.util.Map)
*/
@@ -370,30 +408,49 @@ public class CountersRemoveAi extends SpellAbilityAi {
return super.chooseCounterType(options, sa, params);
}
Player ai = sa.getActivatingPlayer();
Card target = (Card) params.get("Target");
GameEntity target = (GameEntity) params.get("Target");
if (target.getController().isOpponentOf(ai)) {
// if its a Planeswalker try to remove Loyality first
if (target.isPlaneswalker()) {
return CounterType.LOYALTY;
}
for (CounterType type : options) {
if (!ComputerUtil.isNegativeCounter(type, target)) {
return type;
if (target instanceof Card) {
Card targetCard = (Card) target;
if (targetCard.getController().isOpponentOf(ai)) {
// if its a Planeswalker try to remove Loyality first
if (targetCard.isPlaneswalker()) {
return CounterType.get(CounterEnumType.LOYALTY);
}
for (CounterType type : options) {
if (!ComputerUtil.isNegativeCounter(type, targetCard)) {
return type;
}
}
} else {
if (options.contains(CounterType.get(CounterEnumType.M1M1)) && targetCard.hasKeyword(Keyword.PERSIST)) {
return CounterType.get(CounterEnumType.M1M1);
} else if (options.contains(CounterType.get(CounterEnumType.P1P1)) && targetCard.hasKeyword(Keyword.UNDYING)) {
return CounterType.get(CounterEnumType.P1P1);
}
for (CounterType type : options) {
if (ComputerUtil.isNegativeCounter(type, targetCard)) {
return type;
}
}
}
} else {
if (options.contains(CounterType.M1M1) && target.hasKeyword(Keyword.PERSIST)) {
return CounterType.M1M1;
} else if (options.contains(CounterType.P1P1) && target.hasKeyword(Keyword.UNDYING)) {
return CounterType.M1M1;
}
for (CounterType type : options) {
if (ComputerUtil.isNegativeCounter(type, target)) {
return type;
} else if (target instanceof Player) {
Player targetPlayer = (Player) target;
if (targetPlayer.isOpponentOf(ai)) {
for (CounterType type : options) {
if (!type.equals(CounterEnumType.POISON)) {
return type;
}
}
} else {
for (CounterType type : options) {
if (type.equals(CounterEnumType.POISON)) {
return type;
}
}
}
}
return super.chooseCounterType(options, sa, params);
}
}

View File

@@ -1,7 +1,6 @@
package forge.ai.ability;
import com.google.common.collect.Iterables;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -20,7 +19,7 @@ import forge.util.MyRandom;
public abstract class DamageAiBase extends SpellAbilityAi {
protected boolean avoidTargetP(final Player comp, final SpellAbility sa) {
Player enemy = ComputerUtil.getOpponentFor(comp);
Player enemy = comp.getWeakestOpponent();
// Logic for cards that damage owner, like Fireslinger
// Do not target a player if they aren't below 75% of our health.
// Unless Lifelink will cancel the damage to us
@@ -38,9 +37,7 @@ public abstract class DamageAiBase extends SpellAbilityAi {
}
if ("SelfDamage".equals(sa.getParam("AILogic"))) {
if (comp.getLife() * 0.75 < enemy.getLife()) {
if (!lifelink) {
return true;
}
return !lifelink;
}
}
return false;
@@ -54,7 +51,7 @@ public abstract class DamageAiBase extends SpellAbilityAi {
protected boolean shouldTgtP(final Player comp, final SpellAbility sa, final int d, final boolean noPrevention, final boolean noPlaneswalkerRedirection) {
int restDamage = d;
final Game game = comp.getGame();
Player enemy = ComputerUtil.getOpponentFor(comp);
Player enemy = comp.getWeakestOpponent();
boolean dmgByCardsInHand = false;
if ("X".equals(sa.getParam("NumDmg")) && sa.getHostCard() != null && sa.hasSVar(sa.getParam("NumDmg")) &&

View File

@@ -6,7 +6,7 @@ import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.card.CounterType;
import forge.game.card.CounterEnumType;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseType;
@@ -39,7 +39,7 @@ public class DamageAllAi extends SpellAbilityAi {
if (!ai.getGame().getStack().isEmpty()) {
return false;
}
int x = -1;
final String damage = sa.getParam("NumDmg");
int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa);
@@ -50,10 +50,9 @@ public class DamageAllAi extends SpellAbilityAi {
x = ComputerUtilMana.determineLeftoverMana(sa, ai);
}
if (damage.equals("ChosenX")) {
x = source.getCounters(CounterType.LOYALTY);
x = source.getCounters(CounterEnumType.LOYALTY);
}
if (x == -1) {
Player bestOpp = determineOppToKill(ai, sa, source, dmg);
if (determineOppToKill(ai, sa, source, dmg) != null) {
// we already know we can kill a player, so go for it
return true;
@@ -138,7 +137,7 @@ public class DamageAllAi extends SpellAbilityAi {
}
int minGain = 200; // The minimum gain in destroyed creatures
if (sa.getPayCosts() != null && sa.getPayCosts().isReusuableResource()) {
if (sa.getPayCosts().isReusuableResource()) {
if (computerList.isEmpty()) {
minGain = 10; // nothing to lose
// no creatures to lose and player can be damaged
@@ -212,7 +211,7 @@ public class DamageAllAi extends SpellAbilityAi {
}
// Evaluate creatures getting killed
Player enemy = ComputerUtil.getOpponentFor(ai);
Player enemy = ai.getWeakestOpponent();
final CardCollection humanList = getKillableCreatures(sa, enemy, dmg);
CardCollection computerList = getKillableCreatures(sa, ai, dmg);
final TargetRestrictions tgt = sa.getTargetRestrictions();
@@ -294,7 +293,7 @@ public class DamageAllAi extends SpellAbilityAi {
}
// Evaluate creatures getting killed
Player enemy = ComputerUtil.getOpponentFor(ai);
Player enemy = ai.getWeakestOpponent();
final CardCollection humanList = getKillableCreatures(sa, enemy, dmg);
CardCollection computerList = getKillableCreatures(sa, ai, dmg);
final TargetRestrictions tgt = sa.getTargetRestrictions();

View File

@@ -1,6 +1,7 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.ai.*;
@@ -11,6 +12,7 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.*;
import forge.game.cost.Cost;
import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana;
import forge.game.cost.CostRemoveCounter;
import forge.game.keyword.Keyword;
@@ -44,9 +46,9 @@ public class DamageDealAi extends DamageAiBase {
if ("MadSarkhanDigDmg".equals(logic)) {
return SpecialCardAi.SarkhanTheMad.considerDig(ai, sa);
}
if (damage.equals("X") && sa.getSVar(damage).equals("Count$ChosenNumber")) {
int energy = ai.getCounters(CounterType.ENERGY);
int energy = ai.getCounters(CounterEnumType.ENERGY);
for (SpellAbility s : source.getSpellAbilities()) {
if ("PayEnergy".equals(s.getParam("AILogic"))) {
energy += AbilityUtils.calculateAmount(source, s.getParam("CounterNum"), sa);
@@ -75,14 +77,11 @@ public class DamageDealAi extends DamageAiBase {
// Set PayX here to maximum value.
dmg = ComputerUtilMana.determineLeftoverMana(sa, ai);
source.setSVar("PayX", Integer.toString(dmg));
} else if (sa.getSVar(damage).equals("Count$CardsInYourHand") && source.getZone().is(ZoneType.Hand)) {
} else if (sa.getSVar(damage).equals("Count$CardsInYourHand") && source.isInZone(ZoneType.Hand)) {
dmg--; // the card will be spent casting the spell, so actual damage is 1 less
}
}
if (!this.damageTargetAI(ai, sa, dmg, true)) {
return false;
}
return true;
return this.damageTargetAI(ai, sa, dmg, true);
}
@Override
@@ -115,7 +114,7 @@ public class DamageDealAi extends DamageAiBase {
// Set PayX here to maximum value. It will be adjusted later depending on the target.
source.setSVar("PayX", Integer.toString(dmg));
} else if (sa.getSVar(damage).contains("InYourHand") && source.getZone().is(ZoneType.Hand)) {
} else if (sa.getSVar(damage).contains("InYourHand") && source.isInZone(ZoneType.Hand)) {
dmg = CardFactoryUtil.xCount(source, sa.getSVar(damage)) - 1; // the card will be spent casting the spell, so actual damage is 1 less
} else if (sa.getSVar(damage).equals("TargetedPlayer$CardsInHand")) {
// cards that deal damage by the number of cards in target player's hand, e.g. Sudden Impact
@@ -146,7 +145,7 @@ public class DamageDealAi extends DamageAiBase {
if (sourceName.equals("Crater's Claws") && ai.hasFerocious()) {
dmg += 2;
}
String logic = sa.getParamOrDefault("AILogic", "");
if ("DiscardLands".equals(logic)) {
dmg = 2;
@@ -158,7 +157,7 @@ public class DamageDealAi extends DamageAiBase {
}
}
}
if (ai.getAttackedWithCreatureThisTurn()) {
if (!ai.getCreaturesAttackedThisTurn().isEmpty()) {
dmg = Integer.parseInt(logic.substring(logic.indexOf(".") + 1));
}
} else if ("WildHunt".equals(logic)) {
@@ -166,7 +165,7 @@ public class DamageDealAi extends DamageAiBase {
List<Card> wolves = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.Wolf+untapped+YouCtrl+Other", ai, source);
dmg = Aggregates.sum(wolves, CardPredicates.Accessors.fnGetNetPower);
} else if ("Triskelion".equals(logic)) {
final int n = source.getCounters(CounterType.P1P1);
final int n = source.getCounters(CounterEnumType.P1P1);
if (n > 0) {
if (ComputerUtil.playImmediately(ai, sa)) {
/*
@@ -197,9 +196,9 @@ public class DamageDealAi extends DamageAiBase {
}
return false;
}
if (sourceName.equals("Sorin, Grim Nemesis")) {
int loyalty = source.getCounters(CounterType.LOYALTY);
int loyalty = source.getCounters(CounterEnumType.LOYALTY);
for (; loyalty > 0; loyalty--) {
if (this.damageTargetAI(ai, sa, loyalty, false)) {
dmg = ComputerUtilCombat.getEnoughDamageToKill(sa.getTargetCard(), loyalty, source, false, false);
@@ -229,7 +228,7 @@ public class DamageDealAi extends DamageAiBase {
if (!ComputerUtilCost.checkRemoveCounterCost(abCost, source)) {
return false;
}
if ("DiscardLands".equals(sa.getParam("AILogic")) && !ComputerUtilCost.checkDiscardCost(ai, abCost, source)) {
return false;
}
@@ -271,11 +270,11 @@ public class DamageDealAi extends DamageAiBase {
sourceName.equals("Crater's Claws")){
// If I can kill my target by paying less mana, do it
if (sa.usesTargeting() && !sa.getTargets().isTargetingAnyPlayer() && !sa.hasParam("DividedAsYouChoose")) {
int actualPay = 0;
int actualPay = dmg;
final boolean noPrevention = sa.hasParam("NoPrevention");
for (final Card c : sa.getTargets().getTargetCards()) {
final int adjDamage = ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention);
if ((adjDamage > actualPay) && (adjDamage <= dmg)) {
if (adjDamage < actualPay) {
actualPay = adjDamage;
}
}
@@ -286,6 +285,23 @@ public class DamageDealAi extends DamageAiBase {
}
}
if ("XCountersDamage".equals(logic)) {
// Check to ensure that we have enough counters to remove per the defined PayX
for (CostPart part : sa.getPayCosts().getCostParts()) {
if (part instanceof CostRemoveCounter) {
if (source.getCounters(((CostRemoveCounter) part).counter) < Integer.valueOf(source.getSVar("PayX"))) {
return false;
}
break;
}
}
}
if ("DiscardCMCX".equals(sa.getParam("AILogic"))) {
final int CMC = Integer.parseInt(source.getSVar("PayX"));
return !CardLists.filter(ai.getCardsIn(ZoneType.Hand), CardPredicates.hasCMC(CMC)).isEmpty();
}
return true;
}
@@ -293,7 +309,7 @@ public class DamageDealAi extends DamageAiBase {
* <p>
* dealDamageChooseTgtC.
* </p>
*
*
* @param d
* a int.
* @param noPrevention
@@ -429,19 +445,19 @@ public class DamageDealAi extends DamageAiBase {
// As of right now, ranks planeswalkers by their Current Loyalty * 10 + Big buff if close to "Ultimate"
int bestScore = 0;
for (Card pw : pws) {
int curLoyalty = pw.getCounters(CounterType.LOYALTY);
int curLoyalty = pw.getCounters(CounterEnumType.LOYALTY);
int pwScore = curLoyalty * 10;
for (SpellAbility sa : pw.getSpellAbilities()) {
if (sa.hasParam("Ultimate") && sa.getPayCosts() != null) {
int loyaltyCost = 0;
if (sa.hasParam("Ultimate")) {
Integer loyaltyCost = 0;
CostRemoveCounter remLoyalty = sa.getPayCosts().getCostPartByType(CostRemoveCounter.class);
if (remLoyalty != null) {
// if remLoyalty is null, generally there's an AddCounter<0/LOYALTY> cost, like for Gideon Jura.
loyaltyCost = remLoyalty.convertAmount();
}
if (loyaltyCost != 0 && loyaltyCost - curLoyalty <= 1) {
if (loyaltyCost != null && loyaltyCost != 0 && loyaltyCost - curLoyalty <= 1) {
// Will ultimate soon
pwScore += 10000;
}
@@ -457,6 +473,22 @@ public class DamageDealAi extends DamageAiBase {
return bestTgt;
}
private Card getWorstPlaneswalkerToDamage(final List<Card> pws) {
Card bestTgt = null;
int bestScore = Integer.MAX_VALUE;
for (Card pw : pws) {
int curLoyalty = pw.getCounters(CounterEnumType.LOYALTY);
if (curLoyalty < bestScore) {
bestScore = curLoyalty;
bestTgt = pw;
}
}
return bestTgt;
}
private List<Card> getTargetableCards(Player ai, SpellAbility sa, Player pl, TargetRestrictions tgt, Player activator, Card source, Game game) {
List<Card> hPlay = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), activator, source, sa);
@@ -472,9 +504,7 @@ public class DamageDealAi extends DamageAiBase {
for (final Object o : objects) {
if (o instanceof Card) {
final Card c = (Card) o;
if (hPlay.contains(c)) {
hPlay.remove(c);
}
hPlay.remove(c);
}
}
hPlay = CardLists.getTargetableCards(hPlay, sa);
@@ -485,7 +515,7 @@ public class DamageDealAi extends DamageAiBase {
* <p>
* damageTargetAI.
* </p>
*
*
* @param saMe
* a {@link forge.game.spellability.SpellAbility} object.
* @param dmg
@@ -513,7 +543,7 @@ public class DamageDealAi extends DamageAiBase {
* <p>
* damageChoosingTargets.
* </p>
*
*
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
* @param tgt
@@ -534,7 +564,7 @@ public class DamageDealAi extends DamageAiBase {
final boolean oppTargetsChoice = sa.hasParam("TargetingPlayer");
final String logic = sa.getParamOrDefault("AILogic", "");
Player enemy = ComputerUtil.getOpponentFor(ai);
Player enemy = ai.getWeakestOpponent();
if ("PowerDmg".equals(logic)) {
// check if it is better to target the player instead, the original target is already set in PumpAi.pumpTgtAI()
@@ -543,6 +573,13 @@ public class DamageDealAi extends DamageAiBase {
sa.getTargets().add(enemy);
}
return true;
} else if ("DamageAfterPutCounter".equals(logic)
&& sa.getParent() != null
&& "P1P1".equals(sa.getParent().getParam("CounterType"))) {
// assuming the SA parent is of PutCounter type. Perhaps it's possible to predict counter multipliers here somehow?
final String amountStr = sa.getParent().getParamOrDefault("CounterNum", "1");
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), amountStr, sa);
dmg += amount;
}
// AssumeAtLeastOneTarget is used for cards with funky targeting implementation like Fight with Fire which would
@@ -550,10 +587,13 @@ public class DamageDealAi extends DamageAiBase {
if (tgt.getMaxTargets(source, sa) <= 0 && !logic.equals("AssumeAtLeastOneTarget")) {
return false;
}
immediately |= ComputerUtil.playImmediately(ai, sa);
sa.resetTargets();
if (!(sa.getParent() != null && sa.getParent().isTargetNumberValid())) {
sa.resetTargets();
}
// target loop
TargetChoices tcs = sa.getTargets();
@@ -583,7 +623,7 @@ public class DamageDealAi extends DamageAiBase {
continue;
}
final int assignedDamage = ComputerUtilCombat.getEnoughDamageToKill(humanCreature, dmg, source, false, noPrevention);
if (assignedDamage <= dmg
if (assignedDamage <= dmg
&& humanCreature.getShieldCount() == 0 && !ComputerUtil.canRegenerate(humanCreature.getController(), humanCreature)) {
tcs.add(humanCreature);
tgt.addDividedAllocation(humanCreature, assignedDamage);
@@ -635,10 +675,9 @@ public class DamageDealAi extends DamageAiBase {
if (c != null && !this.shouldTgtP(ai, sa, dmg, noPrevention, true)) {
tcs.add(c);
if (divided) {
final int assignedDamage = ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention);
if (assignedDamage <= dmg) {
tgt.addDividedAllocation(c, assignedDamage);
}
int assignedDamage = ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention);
assignedDamage = Math.min(dmg, assignedDamage);
tgt.addDividedAllocation(c, assignedDamage);
dmg = dmg - assignedDamage;
if (dmg <= 0) {
break;
@@ -705,8 +744,7 @@ public class DamageDealAi extends DamageAiBase {
}
if (phase.is(PhaseType.MAIN2) && sa.isAbility()) {
if (sa.getRestrictions().isPwAbility()
|| source.hasSVar("EndOfTurnLeavePlay"))
if (sa.isPwAbility() || source.hasSVar("EndOfTurnLeavePlay"))
freePing = true;
}
}
@@ -718,7 +756,7 @@ public class DamageDealAi extends DamageAiBase {
break;
}
}
} else if (tgt.canTgtCreature() || tgt.canTgtPlaneswalker()) {
final Card c = this.dealDamageChooseTgtC(ai, sa, dmg, noPrevention, enemy, mandatory);
if (c != null) {
@@ -756,8 +794,7 @@ public class DamageDealAi extends DamageAiBase {
if (((phase.is(PhaseType.END_OF_TURN) && phase.getNextTurn().equals(ai))
|| (SpellAbilityAi.isSorcerySpeed(sa) && phase.is(PhaseType.MAIN2))
|| ("PingAfterAttack".equals(logic) && phase.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.isPlayerTurn(ai))
|| sa.getPayCosts() == null || immediately
|| this.shouldTgtP(ai, sa, dmg, noPrevention)) &&
|| immediately || shouldTgtP(ai, sa, dmg, noPrevention)) &&
(!avoidTargetP(ai, sa))) {
tcs.add(enemy);
if (divided) {
@@ -774,7 +811,7 @@ public class DamageDealAi extends DamageAiBase {
return false;
} else {
// If the trigger is mandatory, gotta choose my own stuff now
return this.damageChooseRequiredTargets(ai, sa, tgt, dmg, mandatory);
return this.damageChooseRequiredTargets(ai, sa, tgt, dmg);
}
} else {
// TODO is this good enough? for up to amounts?
@@ -788,8 +825,8 @@ public class DamageDealAi extends DamageAiBase {
* <p>
* damageChooseNontargeted.
* </p>
* @param ai
*
* @param ai
*
* @param saMe
* a {@link forge.game.spellability.SpellAbility} object.
* @param dmg
@@ -844,27 +881,24 @@ public class DamageDealAi extends DamageAiBase {
* <p>
* damageChooseRequiredTargets.
* </p>
*
*
* @param sa
* a {@link forge.game.spellability.SpellAbility} object.
* @param tgt
* a {@link forge.game.spellability.TargetRestrictions} object.
* @param dmg
* a int.
* @param mandatory
* a boolean.
* @return a boolean.
*/
private boolean damageChooseRequiredTargets(final Player ai, final SpellAbility sa, final TargetRestrictions tgt, final int dmg,
final boolean mandatory) {
private boolean damageChooseRequiredTargets(final Player ai, final SpellAbility sa, final TargetRestrictions tgt, final int dmg) {
// this is for Triggered targets that are mandatory
final boolean noPrevention = sa.hasParam("NoPrevention");
final boolean divided = sa.hasParam("DividedAsYouChoose");
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) {
if (tgt.canTgtPlaneswalker()) {
final Card c = this.dealDamageChooseTgtPW(ai, sa, dmg, noPrevention, ai, mandatory);
final Card c = this.dealDamageChooseTgtPW(ai, sa, dmg, noPrevention, ai, true);
if (c != null) {
sa.getTargets().add(c);
if (divided) {
@@ -877,7 +911,7 @@ public class DamageDealAi extends DamageAiBase {
// TODO: This currently also catches planeswalkers that can be killed (still necessary? Or can be removed?)
if (tgt.canTgtCreature()) {
final Card c = this.dealDamageChooseTgtC(ai, sa, dmg, noPrevention, ai, mandatory);
final Card c = this.dealDamageChooseTgtC(ai, sa, dmg, noPrevention, ai, true);
if (c != null) {
sa.getTargets().add(c);
if (divided) {
@@ -898,6 +932,32 @@ public class DamageDealAi extends DamageAiBase {
}
}
// See if there's an indestructible target that can be used
CardCollection indestructible = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield),
Predicates.and(CardPredicates.Presets.CREATURES, CardPredicates.Presets.PLANESWALKERS, CardPredicates.hasKeyword(Keyword.INDESTRUCTIBLE), CardPredicates.isTargetableBy(sa)));
if (!indestructible.isEmpty()) {
Card c = ComputerUtilCard.getWorstPermanentAI(indestructible, false, false, false, false);
sa.getTargets().add(c);
if (divided) {
tgt.addDividedAllocation(c, dmg);
break;
}
continue;
}
else if (tgt.canTgtPlaneswalker()) {
// Second pass for planeswalkers: choose AI's worst planeswalker
final Card c = getWorstPlaneswalkerToDamage(CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Predicates.and(CardPredicates.Presets.PLANESWALKERS), CardPredicates.isTargetableBy(sa)));
if (c != null) {
sa.getTargets().add(c);
if (divided) {
tgt.addDividedAllocation(c, dmg);
break;
}
continue;
}
}
if (sa.canTarget(ai)) {
if (sa.getTargets().add(ai)) {
if (divided) {
@@ -936,9 +996,7 @@ public class DamageDealAi extends DamageAiBase {
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// If it's not mandatory check a few things
if (!mandatory && !this.damageChooseNontargeted(ai, sa, dmg)) {
return false;
}
return mandatory || this.damageChooseNontargeted(ai, sa, dmg);
} else {
if (!this.damageChoosingTargets(ai, sa, tgt, dmg, mandatory, true) && !mandatory) {
return false;
@@ -948,7 +1006,7 @@ public class DamageDealAi extends DamageAiBase {
// If I can kill my target by paying less mana, do it
int actualPay = 0;
final boolean noPrevention = sa.hasParam("NoPrevention");
//target is a player
if (!sa.getTargets().isTargetingAnyCard()) {
actualPay = dmg;
@@ -979,15 +1037,15 @@ public class DamageDealAi extends DamageAiBase {
Player opponent = ai.getOpponents().min(PlayerPredicates.compareByLife());
// TODO: somehow account for the possible cost reduction?
// TODO: somehow account for the possible cost reduction?
int dmg = ComputerUtilMana.determineLeftoverMana(sa, ai, saTgt.getParam("XColor"));
while (!ComputerUtilMana.canPayManaCost(sa, ai, dmg) && dmg > 0) {
// TODO: ideally should never get here, currently put here as a precaution for complex mana base cases where the miscalculation might occur. Will remove later if it proves to never trigger.
dmg--;
System.out.println("Warning: AI could not pay mana cost for a XLifeDrain logic spell. Reducing X value to "+dmg);
}
// set the color map for black X for the purpose of Soul Burn
// TODO: somehow generalize this calculation to allow other potential similar cards to function in the future
if ("Soul Burn".equals(sourceName)) {
@@ -1008,7 +1066,7 @@ public class DamageDealAi extends DamageAiBase {
int toughness = c.getNetToughness();
boolean canDie = !(c.hasKeyword(Keyword.INDESTRUCTIBLE) || ComputerUtil.canRegenerate(c.getController(), c));
// Currently will target creatures with toughness 3+ (or power 5+)
// Currently will target creatures with toughness 3+ (or power 5+)
// and only if the creature can actually die, do not "underdrain"
// unless the creature has high power
if (canDie && toughness <= dmg && ((toughness == dmg && toughness >= 3) || power >= 5)) {
@@ -1067,8 +1125,7 @@ public class DamageDealAi extends DamageAiBase {
continue;
}
// currently works only with cards that don't have additional costs (only mana is supported)
if (ab.getPayCosts() != null
&& (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) {
if (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class)) {
String dmgDef = "0";
if (ab.getApi() == ApiType.DealDamage) {
dmgDef = ab.getParamOrDefault("NumDmg", "0");
@@ -1080,7 +1137,7 @@ public class DamageDealAi extends DamageAiBase {
continue; // not a toughness debuff
}
}
if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs
if (StringUtils.isNumeric(dmgDef)) { // currently doesn't work for X and other dependent costs
if (sa.usesTargeting() && ab.usesTargeting()) {
// Ensure that the chained spell can target at least the same things (or more) as the current one
TargetRestrictions tgtSa = sa.getTargetRestrictions();
@@ -1092,7 +1149,7 @@ public class DamageDealAi extends DamageAiBase {
}
// FIXME: should it also check restrictions for targeting players?
ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST;
ManaCost costSa = sa.getPayCosts().getTotalMana();
ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above
ManaCost total = ManaCost.combine(costSa, costAb);
SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false));

View File

@@ -100,7 +100,7 @@ public class DamagePreventAi extends SpellAbilityAi {
tcs.add(ai);
chance = true;
}
final List<Card> threatenedTargets = new ArrayList<Card>();
final List<Card> threatenedTargets = new ArrayList<>();
// filter AIs battlefield by what I can target
List<Card> targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard, sa);
targetables = CardLists.getTargetableCards(targetables, sa);

View File

@@ -4,7 +4,6 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
@@ -125,7 +124,7 @@ public class DebuffAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
sa.resetTargets();
CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.<String>newArrayList() : kws);
CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws);
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa);
// several uses here:
@@ -177,7 +176,7 @@ public class DebuffAi extends SpellAbilityAi {
* @return a CardCollection.
*/
private CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final List<String> kws) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
CardCollection list = CardLists.getTargetableCards(opp.getCreaturesInPlay(), sa);
if (!list.isEmpty()) {
list = CardLists.filter(list, new Predicate<Card>() {
@@ -217,7 +216,7 @@ public class DebuffAi extends SpellAbilityAi {
list.remove(c);
}
final CardCollection pref = CardLists.filterControlledBy(list, ComputerUtil.getOpponentFor(ai));
final CardCollection pref = CardLists.filterControlledBy(list, ai.getWeakestOpponent());
final CardCollection forced = CardLists.filterControlledBy(list, ai);
final Card source = sa.getHostCard();
@@ -267,7 +266,7 @@ public class DebuffAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final List<String> kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList<String>();
final List<String> kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList<>();
if (sa.getTargetRestrictions() == null) {
if (mandatory) {

View File

@@ -27,7 +27,7 @@ public class DelayedTriggerAi extends SpellAbilityAi {
trigsa.setActivatingPlayer(ai);
if (trigsa instanceof AbilitySub) {
return SpellApiToAi.Converter.get(((AbilitySub) trigsa).getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa);
return SpellApiToAi.Converter.get(trigsa.getApi()).chkDrawbackWithSubs(ai, (AbilitySub)trigsa);
} else {
return AiPlayDecision.WillPlay == ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(trigsa);
}

View File

@@ -48,7 +48,7 @@ public class DestroyAi extends SpellAbilityAi {
return false;
}
hasXCost = abCost.getCostMana() != null ? abCost.getCostMana().getAmountOfX() > 0 : false;
hasXCost = abCost.getCostMana() != null && abCost.getCostMana().getAmountOfX() > 0;
}
if ("AtOpponentsCombatOrAfter".equals(sa.getParam("AILogic"))) {
@@ -63,7 +63,7 @@ public class DestroyAi extends SpellAbilityAi {
}
} else if ("AtEOTIfNotAttacking".equals(sa.getParam("AILogic"))) {
PhaseHandler ph = ai.getGame().getPhaseHandler();
if (!ph.is(PhaseType.END_OF_TURN) || ai.getAttackedWithCreatureThisTurn()) {
if (!ph.is(PhaseType.END_OF_TURN) || !ai.getCreaturesAttackedThisTurn().isEmpty()) {
return false;
}
}
@@ -101,7 +101,7 @@ public class DestroyAi extends SpellAbilityAi {
return SpecialCardAi.SarkhanTheMad.considerMakeDragon(ai, sa);
} else if (logic != null && logic.startsWith("MinLoyalty.")) {
int minLoyalty = Integer.parseInt(logic.substring(logic.indexOf(".") + 1));
if (source.getCounters(CounterType.LOYALTY) < minLoyalty) {
if (source.getCounters(CounterEnumType.LOYALTY) < minLoyalty) {
return false;
}
} else if ("Polymorph".equals(logic)) {
@@ -132,7 +132,7 @@ public class DestroyAi extends SpellAbilityAi {
}
// Filter AI-specific targets if provided
list = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, true);
list = ComputerUtil.filterAITgts(sa, ai, list, true);
list = CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE);
if (CardLists.getNotType(list, "Creature").isEmpty()) {
@@ -161,7 +161,7 @@ public class DestroyAi extends SpellAbilityAi {
return false;
}
//Check for undying
return (!c.hasKeyword(Keyword.UNDYING) || c.getCounters(CounterType.P1P1) > 0);
return (!c.hasKeyword(Keyword.UNDYING) || c.getCounters(CounterEnumType.P1P1) > 0);
}
});
}
@@ -231,7 +231,7 @@ public class DestroyAi extends SpellAbilityAi {
}
if ("Pongify".equals(logic)) {
final Card token = TokenAi.spawnToken(choice.getController(), sa.getSubAbility());
if (token == null) {
if (token == null || !token.isCreature() || token.getNetToughness() < 1) {
return true; // becomes Terminate
} else {
if (source.getGame().getPhaseHandler().getPhase()
@@ -256,7 +256,7 @@ public class DestroyAi extends SpellAbilityAi {
}
//option to hold removal instead only applies for single targeted removal
if (!sa.isTrigger() && abTgt.getMaxTargets(sa.getHostCard(), sa) == 1) {
if (!ComputerUtilCard.useRemovalNow(sa, choice, 0, ZoneType.Graveyard)) {
if (choice == null || !ComputerUtilCard.useRemovalNow(sa, choice, 0, ZoneType.Graveyard)) {
return false;
}
}
@@ -277,6 +277,7 @@ public class DestroyAi extends SpellAbilityAi {
SpellAbility sp = aura.getFirstSpellAbility();
if (sp != null && "GainControl".equals(sp.getParam("AILogic"))
&& aura.getController() != ai && sa.canTarget(aura)) {
list.remove(choice);
choice = aura;
}
}
@@ -288,7 +289,7 @@ public class DestroyAi extends SpellAbilityAi {
} else if (sa.hasParam("Defined")) {
list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
if ("WillSkipTurn".equals(logic) && (sa.getHostCard().getController().equals(ai)
|| ai.getCreaturesInPlay().size() < ComputerUtil.getOpponentFor(ai).getCreaturesInPlay().size()
|| ai.getCreaturesInPlay().size() < ai.getWeakestOpponent().getCreaturesInPlay().size()
|| !source.getGame().getPhaseHandler().isPlayerTurn(ai)
|| ai.getLife() <= 5)) {
// Basic ai logic for Lethal Vapors
@@ -296,8 +297,8 @@ public class DestroyAi extends SpellAbilityAi {
}
if (list.isEmpty()
|| !CardLists.filterControlledBy(list, ai).isEmpty()
|| CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) {
|| !CardLists.filterControlledBy(list, ai).isEmpty()
|| CardLists.getNotKeyword(list, Keyword.INDESTRUCTIBLE).isEmpty()) {
return false;
}
}
@@ -342,7 +343,7 @@ public class DestroyAi extends SpellAbilityAi {
}
// Filter AI-specific targets if provided
preferred = ComputerUtil.filterAITgts(sa, ai, (CardCollection)preferred, true);
preferred = ComputerUtil.filterAITgts(sa, ai, preferred, true);
for (final Card c : preferred) {
list.remove(c);
@@ -387,7 +388,7 @@ public class DestroyAi extends SpellAbilityAi {
if (CardLists.getNotType(list, "Creature").isEmpty()) {
if (!sa.getUniqueTargets().isEmpty() && sa.getParent().getApi() == ApiType.Destroy
&& sa.getUniqueTargets().get(0) instanceof Card) {
// basic ai for Diaochan
// basic ai for Diaochan
c = (Card) sa.getUniqueTargets().get(0);
} else {
c = ComputerUtilCard.getWorstCreatureAI(list);
@@ -400,16 +401,11 @@ public class DestroyAi extends SpellAbilityAi {
}
}
if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getHostCard(), sa)) {
return false;
}
return sa.getTargets().getNumTargeted() >= tgt.getMinTargets(sa.getHostCard(), sa);
} else {
if (!mandatory) {
return false;
}
return mandatory;
}
return true;
}
public boolean doLandForLandRemovalLogic(SpellAbility sa, Player ai, Card tgtLand, String logic) {
@@ -417,7 +413,7 @@ public class DestroyAi extends SpellAbilityAi {
Player tgtPlayer = tgtLand.getController();
int oppLandsOTB = tgtPlayer.getLandsInPlay().size();
// AI profile-dependent properties
AiController aic = ((PlayerControllerAi)ai.getController()).getAi();
int amountNoTempoCheck = aic.getIntProperty(AiProps.STRIPMINE_MIN_LANDS_OTB_FOR_NO_TEMPO_CHECK);
@@ -440,7 +436,7 @@ public class DestroyAi extends SpellAbilityAi {
// Non-basic lands are currently not ranked in any way in ComputerUtilCard#getBestLandAI, so if a non-basic land is best target,
// consider killing it off unless there's too much potential tempo loss.
// TODO: actually rank non-basics in that method and then kill off the potentially dangerous (manlands, Valakut) or lucrative
// TODO: actually rank non-basics in that method and then kill off the potentially dangerous (manlands, Valakut) or lucrative
// (dual/triple mana that opens access to a certain color) lands
boolean nonBasicTgt = !tgtLand.isBasicLand();
@@ -452,7 +448,7 @@ public class DestroyAi extends SpellAbilityAi {
boolean isHighPriority = highPriorityIfNoLandDrop && oppSkippedLandDrop;
boolean timingCheck = canManaLock || canColorLock || nonBasicTgt;
boolean tempoCheck = numLandsOTB >= amountNoTempoCheck
boolean tempoCheck = numLandsOTB >= amountNoTempoCheck
|| ((numLandsInHand >= amountLandsInHand || isHighPriority) && ((numLandsInHand + numLandsOTB >= amountNoTimingCheck) || timingCheck));
// For Ghost Quarter, only use it if you have either more lands in play than your opponent

View File

@@ -66,7 +66,7 @@ public class DestroyAllAi extends SpellAbilityAi {
public boolean doMassRemovalLogic(Player ai, SpellAbility sa) {
final Card source = sa.getHostCard();
final String logic = sa.getParamOrDefault("AILogic", "");
Player opponent = ComputerUtil.getOpponentFor(ai); // TODO: how should this AI logic work for multiplayer and getOpponents()?
Player opponent = ai.getWeakestOpponent(); // TODO: how should this AI logic work for multiplayer and getOpponents()?
final int CREATURE_EVAL_THRESHOLD = 200;
@@ -147,7 +147,7 @@ public class DestroyAllAi extends SpellAbilityAi {
block.assignBlockersForCombat(combat);
if (ComputerUtilCombat.lifeInSeriousDanger(ai, combat)) {
return true;
return true;
}
return false;
} // only lands involved
@@ -171,7 +171,6 @@ public class DestroyAllAi extends SpellAbilityAi {
else if ((ComputerUtilCard.evaluatePermanentList(ailist) + 3) >= ComputerUtilCard.evaluatePermanentList(opplist)) {
return false;
}
return true;
}
}

View File

@@ -1,9 +1,17 @@
package forge.ai.ability;
import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import forge.ai.*;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
@@ -20,7 +28,7 @@ public class DigAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Game game = ai.getGame();
Player opp = ComputerUtil.getOpponentFor(ai);
Player opp = ai.getWeakestOpponent();
final Card host = sa.getHostCard();
Player libraryOwner = ai;
@@ -42,7 +50,9 @@ public class DigAi extends SpellAbilityAi {
if ("Never".equals(sa.getParam("AILogic"))) {
return false;
} else if ("AtOppEndOfTurn".equals(sa.getParam("AILogic"))) {
return game.getPhaseHandler().getNextTurn() == ai && game.getPhaseHandler().is(PhaseType.END_OF_TURN);
if (!(game.getPhaseHandler().getNextTurn() == ai && game.getPhaseHandler().is(PhaseType.END_OF_TURN))) {
return false;
}
}
// don't deck yourself
@@ -60,7 +70,8 @@ public class DigAi extends SpellAbilityAi {
}
final String num = sa.getParam("DigNum");
if (num != null && num.equals("X") && host.getSVar(num).equals("Count$xPaid")) {
final boolean payXLogic = sa.hasParam("AILogic") && sa.getParam("AILogic").startsWith("PayX");
if (num != null && (num.equals("X") && host.getSVar(num).equals("Count$xPaid")) || payXLogic) {
// By default, set PayX here to maximum value.
if (!(sa instanceof AbilitySub) || host.getSVar("PayX").equals("")) {
int manaToSave = 0;
@@ -99,7 +110,7 @@ public class DigAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
if (sa.usesTargeting()) {
sa.resetTargets();
if (mandatory && sa.canTarget(opp)) {
@@ -123,7 +134,26 @@ public class DigAi extends SpellAbilityAi {
}
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> valid, boolean isOptional, Player relatedPlayer) {
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> valid, boolean isOptional, Player relatedPlayer, Map<String, Object> params) {
if ("DigForCreature".equals(sa.getParam("AILogic"))) {
Card bestChoice = ComputerUtilCard.getBestCreatureAI(valid);
if (bestChoice == null) {
// no creatures, but maybe there's a morphable card that can be played as a creature?
CardCollection morphs = CardLists.filter(valid, new Predicate<Card>() {
@Override
public boolean apply(Card card) {
return card.hasKeyword(Keyword.MORPH);
}
});
if (!morphs.isEmpty()) {
bestChoice = ComputerUtilCard.getBestAI(morphs);
}
}
// still nothing, so return the worst card since it'll be unplayable from exile (e.g. Vivien, Champion of the Wilds)
return bestChoice != null ? bestChoice : ComputerUtilCard.getWorstAI(valid);
}
if (sa.getActivatingPlayer().isOpponentOf(ai) && relatedPlayer.isOpponentOf(ai)) {
return ComputerUtilCard.getWorstPermanentAI(valid, false, true, false, false);
} else {
@@ -131,6 +161,15 @@ public class DigAi extends SpellAbilityAi {
}
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#chooseSinglePlayer(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List)
*/
@Override
public Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options, Map<String, Object> params) {
// an opponent choose a card from
return Iterables.getFirst(options, null);
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#confirmAction(forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String)
*/

View File

@@ -0,0 +1,101 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
public class DigMultipleAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Game game = ai.getGame();
Player opp = ai.getWeakestOpponent();
final Card host = sa.getHostCard();
Player libraryOwner = ai;
if (sa.usesTargeting()) {
sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
return false;
} else {
sa.getTargets().add(opp);
}
libraryOwner = opp;
}
// return false if nothing to dig into
if (libraryOwner.getCardsIn(ZoneType.Library).isEmpty()) {
return false;
}
if ("Never".equals(sa.getParam("AILogic"))) {
return false;
} else if ("AtOppEndOfTurn".equals(sa.getParam("AILogic"))) {
if (!(game.getPhaseHandler().getNextTurn() == ai && game.getPhaseHandler().is(PhaseType.END_OF_TURN))) {
return false;
}
}
// don't deck yourself
if (sa.hasParam("DestinationZone2") && !"Library".equals(sa.getParam("DestinationZone2"))) {
int numToDig = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa);
if (libraryOwner == ai && ai.getCardsIn(ZoneType.Library).size() <= numToDig + 2) {
return false;
}
}
// Don't use draw abilities before main 2 if possible
if (game.getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2) && !sa.hasParam("ActivationPhases")
&& !sa.hasParam("DestinationZone") && !ComputerUtil.castSpellInMain1(ai, sa)) {
return false;
}
if (SpellAbilityAi.playReusable(ai, sa)) {
return true;
}
if ((!game.getPhaseHandler().getNextTurn().equals(ai)
|| game.getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN))
&& !sa.hasParam("PlayerTurn") && !SpellAbilityAi.isSorcerySpeed(sa)
&& (ai.getCardsIn(ZoneType.Hand).size() > 1 || game.getPhaseHandler().getPhase().isBefore(PhaseType.DRAW))
&& !ComputerUtil.activateForCost(sa, ai)) {
return false;
}
return !ComputerUtil.preventRunAwayActivations(sa);
}
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Player opp = ai.getWeakestOpponent();
if (sa.usesTargeting()) {
sa.resetTargets();
if (mandatory && sa.canTarget(opp)) {
sa.getTargets().add(opp);
} else if (mandatory && sa.canTarget(ai)) {
sa.getTargets().add(ai);
}
}
return true;
}
/* (non-Javadoc)
* @see forge.card.ability.SpellAbilityAi#confirmAction(forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String)
*/
@Override
public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
return true;
}
}

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -36,7 +35,7 @@ public class DigUntilAi extends SpellAbilityAi {
final boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
Player libraryOwner = ai;
Player opp = ComputerUtil.getOpponentFor(ai);
Player opp = ai.getWeakestOpponent();
if ("DontMillSelf".equals(logic)) {
// A card that digs for specific things and puts everything revealed before it into graveyard

View File

@@ -56,7 +56,7 @@ public class DiscardAi extends SpellAbilityAi {
return SpecialCardAi.VolrathsShapeshifter.consider(ai, sa);
}
final boolean humanHasHand = ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Hand).size() > 0;
final boolean humanHasHand = ai.getWeakestOpponent().getCardsIn(ZoneType.Hand).size() > 0;
if (tgt != null) {
if (!discardTargetAI(ai, sa)) {
@@ -87,7 +87,7 @@ public class DiscardAi extends SpellAbilityAi {
if (sa.hasParam("NumCards")) {
if (sa.getParam("NumCards").equals("X") && source.getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value.
final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai)
final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent()
.getCardsIn(ZoneType.Hand).size());
if (cardsToDiscard < 1) {
return false;
@@ -150,14 +150,17 @@ public class DiscardAi extends SpellAbilityAi {
private boolean discardTargetAI(final Player ai, final SpellAbility sa) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
Player opp = ComputerUtil.getOpponentFor(ai);
if (opp.getCardsIn(ZoneType.Hand).isEmpty() && !ComputerUtil.activateForCost(sa, ai)) {
return false;
}
if (tgt != null) {
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
return true;
for (Player opp : ai.getOpponents()) {
if (opp.getCardsIn(ZoneType.Hand).isEmpty() && !ComputerUtil.activateForCost(sa, ai)) {
continue;
} else if (!opp.canDiscardBy(sa)) { // e.g. Tamiyo, Collector of Tales
continue;
}
if (tgt != null) {
if (sa.canTarget(opp)) {
sa.getTargets().add(opp);
return true;
}
}
}
return false;
@@ -169,7 +172,7 @@ public class DiscardAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
Player opp = ComputerUtil.getOpponentFor(ai);
Player opp = ai.getWeakestOpponent();
if (!discardTargetAI(ai, sa)) {
if (mandatory && sa.canTarget(opp)) {
sa.getTargets().add(opp);
@@ -190,7 +193,7 @@ public class DiscardAi extends SpellAbilityAi {
}
if ("X".equals(sa.getParam("RevealNumber")) && sa.getHostCard().getSVar("X").equals("Count$xPaid")) {
// Set PayX here to maximum value.
final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ComputerUtil.getOpponentFor(ai)
final int cardsToDiscard = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), ai.getWeakestOpponent()
.getCardsIn(ZoneType.Hand).size());
sa.getHostCard().setSVar("PayX", Integer.toString(cardsToDiscard));
}

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -19,7 +18,7 @@ public class DrainManaAi extends SpellAbilityAi {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
if (tgt == null) {
@@ -41,7 +40,7 @@ public class DrainManaAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getHostCard();
@@ -52,12 +51,9 @@ public class DrainManaAi extends SpellAbilityAi {
} else {
final List<Player> defined = AbilityUtils.getDefinedPlayers(source, sa.getParam("Defined"), sa);
if (!defined.contains(opp)) {
return false;
}
return defined.contains(opp);
}
return true;
} else {
sa.resetTargets();
sa.getTargets().add(opp);
@@ -82,7 +78,7 @@ public class DrainManaAi extends SpellAbilityAi {
}
} else {
sa.resetTargets();
sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
sa.getTargets().add(ai.getWeakestOpponent());
}
return randomReturn;

View File

@@ -25,6 +25,7 @@ import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
import forge.game.cost.*;
import forge.game.phase.PhaseHandler;
@@ -69,7 +70,7 @@ public class DrawAi extends SpellAbilityAi {
}
if (!canLoot(ai, sa)) {
return false;
return false;
}
return true;
}
@@ -107,7 +108,7 @@ public class DrawAi extends SpellAbilityAi {
}
}
if (!ComputerUtilCost.checkRemoveCounterCost(cost, source)) {
if (!ComputerUtilCost.checkRemoveCounterCost(cost, source, sa)) {
return false;
}
@@ -211,9 +212,11 @@ public class DrawAi extends SpellAbilityAi {
private boolean targetAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Card source = sa.getHostCard();
final boolean drawback = sa.getParent() != null;
final Game game = ai.getGame();
final String logic = sa.getParamOrDefault("AILogic", "");
final boolean considerPrimary = logic.equals("ConsiderPrimary");
final boolean drawback = (sa.getParent() != null) && !considerPrimary;
boolean assumeSafeX = false; // if true, the AI will assume that the X value has been set to a value that is safe to draw
int computerHandSize = ai.getCardsIn(ZoneType.Hand).size();
final int computerLibrarySize = ai.getCardsIn(ZoneType.Library).size();
@@ -241,7 +244,12 @@ public class DrawAi extends SpellAbilityAi {
numCards = Integer.parseInt(source.getSVar("PayX"));
} else {
numCards = ComputerUtilMana.determineLeftoverMana(sa, ai);
// try not to overdraw
int safeDraw = Math.min(computerMaxHandSize - computerHandSize, computerLibrarySize - 3);
if (sa.getHostCard().isInstant() || sa.getHostCard().isSorcery()) { safeDraw++; } // card will be spent
numCards = Math.min(numCards, safeDraw);
source.setSVar("PayX", Integer.toString(numCards));
assumeSafeX = true;
}
xPaid = true;
}
@@ -255,22 +263,20 @@ public class DrawAi extends SpellAbilityAi {
// Draw up to max hand size but leave at least 3 in library
numCards = Math.min(computerMaxHandSize - computerHandSize, computerLibrarySize - 3);
if (sa.getPayCosts() != null) {
if (sa.getPayCosts().hasSpecificCostType(CostPayLife.class)) {
// [Necrologia, Pay X Life : Draw X Cards]
// Don't draw more than what's "safe" and don't risk a near death experience
// Maybe would be better to check for "serious danger" and take more risk?
while ((ComputerUtil.aiLifeInDanger(ai, false, numCards) && (numCards > 0))) {
numCards--;
}
} else if (sa.getPayCosts().hasSpecificCostType(CostSacrifice.class)) {
// [e.g. Krav, the Unredeemed and other cases which say "Sacrifice X creatures: draw X cards]
// TODO: Add special logic to limit/otherwise modify the ChosenX value here
if (sa.getPayCosts().hasSpecificCostType(CostPayLife.class)) {
// [Necrologia, Pay X Life : Draw X Cards]
// Don't draw more than what's "safe" and don't risk a near death experience
// Maybe would be better to check for "serious danger" and take more risk?
while ((ComputerUtil.aiLifeInDanger(ai, false, numCards) && (numCards > 0))) {
numCards--;
}
} else if (sa.getPayCosts().hasSpecificCostType(CostSacrifice.class)) {
// [e.g. Krav, the Unredeemed and other cases which say "Sacrifice X creatures: draw X cards]
// TODO: Add special logic to limit/otherwise modify the ChosenX value here
// Skip this ability if nothing is to be chosen for sacrifice
if (numCards <= 0) {
return false;
}
// Skip this ability if nothing is to be chosen for sacrifice
if (numCards <= 0) {
return false;
}
}
@@ -343,7 +349,7 @@ public class DrawAi extends SpellAbilityAi {
}
// try to make opponent lose to poison
// currently only Caress of Phyrexia
if (getPoison != null && oppA.canReceiveCounters(CounterType.POISON)) {
if (getPoison != null && oppA.canReceiveCounters(CounterType.get(CounterEnumType.POISON))) {
if (oppA.getPoisonCounters() + numCards > 9) {
sa.getTargets().add(oppA);
return true;
@@ -387,7 +393,7 @@ public class DrawAi extends SpellAbilityAi {
}
}
if (getPoison != null && ai.canReceiveCounters(CounterType.POISON)) {
if (getPoison != null && ai.canReceiveCounters(CounterType.get(CounterEnumType.POISON))) {
if (numCards + ai.getPoisonCounters() >= 8) {
aiTarget = false;
}
@@ -402,7 +408,7 @@ public class DrawAi extends SpellAbilityAi {
if (computerHandSize + numCards > computerMaxHandSize && game.getPhaseHandler().isPlayerTurn(ai)) {
if (xPaid) {
numCards = computerMaxHandSize - computerHandSize;
if (sa.getHostCard().getZone().is(ZoneType.Hand)) {
if (sa.getHostCard().isInZone(ZoneType.Hand)) {
numCards++; // the card will be spent
}
source.setSVar("PayX", Integer.toString(numCards));
@@ -446,7 +452,7 @@ public class DrawAi extends SpellAbilityAi {
}
// ally would lose because of poison
if (getPoison != null && ally.canReceiveCounters(CounterType.POISON)) {
if (getPoison != null && ally.canReceiveCounters(CounterType.get(CounterEnumType.POISON))) {
if (ally.getPoisonCounters() + numCards > 9) {
continue;
}
@@ -492,7 +498,8 @@ public class DrawAi extends SpellAbilityAi {
if ((computerHandSize + numCards > computerMaxHandSize)
&& game.getPhaseHandler().isPlayerTurn(ai)
&& !sa.isTrigger()) {
&& !sa.isTrigger()
&& !assumeSafeX) {
// Don't draw too many cards and then risk discarding cards at
// EOT
if (!drawback) {
@@ -506,6 +513,10 @@ public class DrawAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
if (!mandatory && !willPayCosts(ai, sa, sa.getPayCosts(), sa.getHostCard())) {
return false;
}
return targetAI(ai, sa, mandatory);
}

View File

@@ -9,9 +9,9 @@ import com.google.common.collect.Iterables;
import forge.ai.*;
import forge.card.mana.ManaCost;
import forge.game.Game;
import forge.game.GlobalRuleChange;
import forge.game.ability.ApiType;
import forge.game.card.*;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
@@ -113,7 +113,7 @@ public class EffectAi extends SpellAbilityAi {
} else if (logic.equals("SpellCopy")) {
// fetch Instant or Sorcery and AI has reason to play this turn
// does not try to get itself
final ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST;
final ManaCost costSa = sa.getPayCosts().getTotalMana();
final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
@@ -135,7 +135,7 @@ public class EffectAi extends SpellAbilityAi {
AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab);
// see if we can pay both for this spell and for the Effect spell we're considering
if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) {
ManaCost costAb = ab.getPayCosts() != null ? ab.getPayCosts().getTotalMana() : ManaCost.NO_COST;
ManaCost costAb = ab.getPayCosts().getTotalMana();
ManaCost total = ManaCost.combine(costSa, costAb);
SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false));
// can we pay both costs?
@@ -267,7 +267,7 @@ public class EffectAi extends SpellAbilityAi {
final SpellAbility saTop = game.getStack().peekAbility();
final Card host = saTop.getHostCard();
if (saTop.getActivatingPlayer() != ai // from opponent
&& !game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention) // no prevent damage
&& host.canDamagePrevented(false) // no prevent damage
&& host != null && (host.isInstant() || host.isSorcery())
&& !host.hasKeyword("Prevent all damage that would be dealt by CARDNAME.")) { // valid target
final ApiType type = saTop.getApi();
@@ -283,11 +283,7 @@ public class EffectAi extends SpellAbilityAi {
return false;
}
final SpellAbility topStack = game.getStack().peekAbility();
if (topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife) {
return true;
} else {
return false;
}
return topStack.getActivatingPlayer().isOpponentOf(ai) && topStack.getApi() == ApiType.GainLife;
} else if (logic.equals("Fight")) {
return FightAi.canFightAi(ai, sa, 0, 0);
} else if (logic.equals("Burn")) {
@@ -301,11 +297,9 @@ public class EffectAi extends SpellAbilityAi {
return false;
}
if (logic.contains(":")) {
String k[] = logic.split(":");
String[] k = logic.split(":");
Integer i = Integer.valueOf(k[1]);
if (ai.getCreaturesInPlay().size() < i) {
return false;
}
return ai.getCreaturesInPlay().size() >= i;
}
return true;
} else if (logic.equals("CastFromGraveThisTurn")) {
@@ -314,6 +308,16 @@ public class EffectAi extends SpellAbilityAi {
if (!ComputerUtil.targetPlayableSpellCard(ai, list, sa, false)) {
return false;
}
} else if (logic.equals("Bribe")) {
Card host = sa.getHostCard();
Combat combat = game.getCombat();
if (combat != null && combat.isAttacking(host, ai) && !combat.isBlocked(host)
&& game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)
&& !AiCardMemory.isRememberedCard(ai, host, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) {
AiCardMemory.rememberCard(ai, host, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); // ideally needs once per combat or something
return true;
}
return false;
}
} else { //no AILogic
return false;

View File

@@ -18,6 +18,7 @@
package forge.ai.ability;
import java.util.List;
import java.util.Map;
import com.google.common.base.Predicate;
@@ -84,7 +85,7 @@ public final class EncodeAi extends SpellAbilityAi {
* forge.game.player.Player)
*/
@Override
public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
return chooseCard(ai, options, isOptional);
}

View File

@@ -32,7 +32,7 @@ public class FightAi extends SpellAbilityAi {
protected boolean checkApiLogic(final Player ai, final SpellAbility sa) {
sa.resetTargets();
final Card source = sa.getHostCard();
// everything is defined or targeted above, can't do anything there?
if (sa.hasParam("Defined") && !sa.usesTargeting()) {
// TODO extend Logic for cards like Arena or Grothama
@@ -45,6 +45,8 @@ public class FightAi extends SpellAbilityAi {
aiCreatures = ComputerUtil.getSafeTargets(ai, sa, aiCreatures);
List<Card> humCreatures = ai.getOpponents().getCreaturesInPlay();
humCreatures = CardLists.getTargetableCards(humCreatures, sa);
if (humCreatures.isEmpty())
return false; //prevent IndexOutOfBoundsException on MOJHOSTO variant
// assumes the triggered card belongs to the ai
if (sa.hasParam("Defined")) {
@@ -108,6 +110,10 @@ public class FightAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(final SpellAbility sa, final Player aiPlayer) {
if ("Always".equals(sa.getParam("AILogic"))) {
return true; // e.g. Hunt the Weak, the AI logic was already checked through canFightAi
}
return checkApiLogic(aiPlayer, sa);
}
@@ -119,7 +125,7 @@ public class FightAi extends SpellAbilityAi {
if (!mandatory) {
return false;
}
//try to make a good trade or no trade
final Card source = sa.getHostCard();
List<Card> humCreatures = ai.getOpponents().getCreaturesInPlay();
@@ -192,13 +198,36 @@ public class FightAi extends SpellAbilityAi {
toughness += bonus;
}
if ("PowerDmg".equals(sa.getParam("AILogic"))) {
if (FightAi.canKill(aiCreature, humanCreature, power)) {
sa.getTargets().add(aiCreature);
if (!isChandrasIgnition) {
tgtFight.resetTargets();
tgtFight.getTargets().add(humanCreature);
if ("2".equals(sa.getParam("TargetMax"))) {
// Band Together, uses up to two targets to deal damage to a single target
// TODO: Generalize this so that other TargetMax values can be properly accounted for
CardCollection aiCreaturesByPower = new CardCollection(aiCreatures);
CardLists.sortByPowerDesc(aiCreaturesByPower);
Card maxPower = aiCreaturesByPower.getFirst();
if (maxPower != null && maxPower != aiCreature) {
power += maxPower.getNetPower(); // potential bonus from adding a second target
}
if (FightAi.canKill(aiCreature, humanCreature, power)) {
sa.getTargets().add(aiCreature);
if (maxPower != null) {
sa.getTargets().add(maxPower);
}
if (!isChandrasIgnition) {
tgtFight.resetTargets();
tgtFight.getTargets().add(humanCreature);
}
return true;
}
} else {
// Other cards that use AILogic PowerDmg and a single target
if (FightAi.canKill(aiCreature, humanCreature, power)) {
sa.getTargets().add(aiCreature);
if (!isChandrasIgnition) {
tgtFight.resetTargets();
tgtFight.getTargets().add(humanCreature);
}
return true;
}
return true;
}
} else {
if (FightAi.shouldFight(aiCreature, humanCreature, power, toughness)) {
@@ -225,7 +254,7 @@ public class FightAi extends SpellAbilityAi {
for (Trigger t : aiCreature.getTriggers()) {
if (t.getMode() == TriggerType.SpellCast) {
final Map<String, String> params = t.getMapParams();
if ("Card.Self".equals(params.get("TargetsValid")) && "You".equals(params.get("ValidActivatingPlayer"))
if ("Card.Self".equals(params.get("TargetsValid")) && "You".equals(params.get("ValidActivatingPlayer"))
&& params.containsKey("Execute")) {
SpellAbility heroic = AbilityFactory.getAbility(aiCreature.getSVar(params.get("Execute")),aiCreature);
if ("Self".equals(heroic.getParam("Defined")) && "P1P1".equals(heroic.getParam("CounterType"))) {
@@ -246,10 +275,10 @@ public class FightAi extends SpellAbilityAi {
if (!canKill(opponent, fighter, -pumpDefense)) { // can survive
return true;
} else {
if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade
return true;
}
}
if (MyRandom.getRandom().nextInt(20)<(opponent.getCMC() - fighter.getCMC())) { // trade
return true;
}
}
}
return false;
}

View File

@@ -20,9 +20,9 @@ public class FlipACoinAi extends SpellAbilityAi {
if (AILogic.equals("Never")) {
return false;
} else if (AILogic.equals("PhaseOut")) {
if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) {
if (!ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa).contains(sa.getHostCard())) {
return false;
}
}
} else if (AILogic.equals("KillOrcs")) {
if (ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.END_OF_TURN) ) {
return false;

View File

@@ -107,7 +107,7 @@ public class FogAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
final Game game = aiPlayer.getGame();
boolean chance;
if (game.getPhaseHandler().isPlayerTurn(ComputerUtil.getOpponentFor(sa.getActivatingPlayer()))) {
if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer().getWeakestOpponent())) {
chance = game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE);
} else {
chance = game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE);

View File

@@ -1,6 +1,5 @@
package forge.ai.ability;
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -9,7 +8,7 @@ import forge.game.spellability.TargetRestrictions;
public class GameLossAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Player opp = ComputerUtil.getOpponentFor(ai);
final Player opp = ai.getWeakestOpponent();
if (opp.cantLose()) {
return false;
}
@@ -34,15 +33,16 @@ public class GameLossAi extends SpellAbilityAi {
// Phage the Untouchable
// (Final Fortune would need to attach it's delayed trigger to a
// specific turn, which can't be done yet)
Player opp = ai.getWeakestOpponent();
if (!mandatory && ComputerUtil.getOpponentFor(ai).cantLose()) {
if (!mandatory && opp.cantLose()) {
return false;
}
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
sa.resetTargets();
sa.getTargets().add(ComputerUtil.getOpponentFor(ai));
sa.getTargets().add(opp);
}
return true;

View File

@@ -11,9 +11,7 @@ public class GameWinAi extends SpellAbilityAi {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
if (ai.cantWin()) {
return false;
}
return !ai.cantWin();
// TODO Check conditions are met on card (e.g. Coalition Victory)
@@ -21,7 +19,6 @@ public class GameWinAi extends SpellAbilityAi {
// In general, don't return true.
// But this card wins the game, I can make an exception for that
return true;
}
@Override

View File

@@ -0,0 +1,27 @@
package forge.ai.ability;
import forge.ai.SpellAbilityAi;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
public class InvestigateAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
*/
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
PhaseHandler ph = aiPlayer.getGame().getPhaseHandler();
return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == aiPlayer;
}
@Override
public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
return true;
}
}

View File

@@ -1,9 +1,11 @@
package forge.ai.ability;
import java.util.Map;
import com.google.common.collect.Iterables;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.card.CounterEnumType;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -23,7 +25,7 @@ public class LegendaryRuleAi extends SpellAbilityAi {
@Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer, Map<String, Object> params) {
// Choose a single legendary/planeswalker card to keep
Card firstOption = Iterables.getFirst(options, null);
boolean choosingFromPlanewalkers = firstOption.isPlaneswalker();
@@ -38,16 +40,16 @@ public class LegendaryRuleAi extends SpellAbilityAi {
if (firstOption.getName().equals("Dark Depths")) {
Card best = firstOption;
for (Card c : options) {
if (c.getCounters(CounterType.ICE) < best.getCounters(CounterType.ICE)) {
if (c.getCounters(CounterEnumType.ICE) < best.getCounters(CounterEnumType.ICE)) {
best = c;
}
}
return best;
} else if (firstOption.getCounters(CounterType.KI) > 0) {
} else if (firstOption.getCounters(CounterEnumType.KI) > 0) {
// Extra Rule for KI counter
Card best = firstOption;
for (Card c : options) {
if (c.getCounters(CounterType.KI) > best.getCounters(CounterType.KI)) {
if (c.getCounters(CounterEnumType.KI) > best.getCounters(CounterEnumType.KI)) {
best = c;
}
}

Some files were not shown because too many files have changed in this diff Show More