Compare commits

...

574 Commits

Author SHA1 Message Date
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
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
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
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
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
Alessandro Coli
762481e28a Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-13 17:58:46 +02:00
Alessandro Coli
25194c7abe Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-12 11:07:46 +02:00
Alessandro Coli
967af29c47 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-11 18:34:39 +02:00
Alessandro Coli
ae9ee57d79 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-10 19:50:02 +02:00
Alessandro Coli
17706bd5e4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-09 22:20:15 +02:00
Alessandro Coli
9ed54f726c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-08 14:11:00 +02: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
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
Alessandro Coli
9fce28bed7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-04 23:13:19 +02:00
Alessandro Coli
0bcc0e9248 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-03 20:44:18 +02:00
Alessandro Coli
aecee3cea2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-02 13:30:06 +02:00
Alessandro Coli
3432b9fdcd Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-10-01 18:56:14 +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
Alessandro Coli
67c596726f Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-22 16:15:23 +02:00
Alessandro Coli
60fb1c0d02 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-21 12:28:37 +02:00
Alessandro Coli
3261e1a260 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-18 19:51:31 +02:00
Alessandro Coli
2e1fa8fa40 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-15 14:10:20 +02:00
Alessandro Coli
cadb2ae791 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-09-08 09:19:21 +02:00
Alessandro Coli
2d3990df81 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-31 18:28:27 +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
Alessandro Coli
f66f51b25e Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-23 14:33:15 +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
Alessandro Coli
132aa8d49a Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-19 12:49:07 +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
Alessandro Coli
941e3a7537 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-13 15:42:20 +02:00
Alessandro Coli
4487952c28 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-10 23:21:59 +02:00
Alessandro Coli
5089663b07 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-08-09 19:32:29 +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
Alessandro Coli
adb1ef35d9 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-20 13:12:50 +02:00
Alessandro Coli
df85278a44 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-18 12:51:43 +02:00
Alessandro Coli
7a04669560 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-18 09:09:03 +02:00
Alessandro Coli
2e24a1bde4 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-14 13:35:09 +02:00
Alessandro Coli
16134cb857 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-14 09:03:33 +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
Alessandro Coli
7617b95fae Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-10 20:23:03 +02:00
Alessandro Coli
ecdda5b678 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-07 15:55:17 +02:00
Alessandro Coli
2a16a29ea2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-07-02 19:15:49 +02:00
Alessandro Coli
81d7bec2cd Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-29 10:10:20 +02:00
Alessandro Coli
87ffbe4c20 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-22 17:22:36 +02:00
Alessandro Coli
94a0fb20d2 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-16 08:54:25 +02:00
Alessandro Coli
7313670d8f Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-12 18:32:48 +02:00
Alessandro Coli
5047e7732c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-06-01 18:48:35 +02:00
Alessandro Coli
98a459ac9c Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-30 12:34:52 +02:00
Alessandro Coli
eec3f05dc7 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-28 13:29:02 +02: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
Alessandro Coli
36b9689cf8 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-25 17:17:16 +02:00
Alessandro Coli
c5b09815e3 Merge branch 'master' of https://git.cardforge.org/core-developers/forge.git 2019-05-24 13:40:56 +02: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
628 changed files with 33225 additions and 4321 deletions

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.30-SNAPSHOT</version>
<version>1.6.31</version>
</parent>
<artifactId>forge-ai</artifactId>

View File

@@ -1281,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;

View File

@@ -109,7 +109,7 @@ public class ComputerUtil {
if (chooseTargets != null) {
chooseTargets.run();
}
if (sa.hasParam("Bestow")) {
if (sa.isBestow()) {
sa.getHostCard().animateBestow();
}

View File

@@ -643,7 +643,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 "";
}
@@ -964,6 +964,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);

View File

@@ -11,10 +11,7 @@ import forge.game.Game;
import forge.game.GameEntity;
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,6 +21,7 @@ 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;
@@ -244,7 +242,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);
}
}
}
@@ -271,6 +269,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");
}
@@ -362,6 +364,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) {
@@ -1202,6 +1210,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);

View File

@@ -502,12 +502,11 @@ public class PlayerControllerAi extends PlayerController {
}
@Override
public String chooseSomeType(String kindOfType, SpellAbility sa, List<String> validTypes, List<String> invalidTypes, boolean isOptional) {
public String chooseSomeType(String kindOfType, SpellAbility sa, Collection<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");
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;

View File

@@ -1031,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

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;
@@ -69,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
@@ -80,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

@@ -1,6 +1,8 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import forge.ai.*;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -157,6 +159,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) {
// 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

@@ -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")) {

View File

@@ -63,6 +63,7 @@ public class SacrificeAi extends SpellAbilityAi {
final boolean destroy = sa.hasParam("Destroy");
Player opp = ai.getWeakestOpponent();
if (tgt != null) {
sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
@@ -74,8 +75,16 @@ public class SacrificeAi extends SpellAbilityAi {
num = (num == null) ? "1" : num;
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa);
List<Card> list =
CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
List<Card> list = null;
try {
list = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
} catch (NullPointerException e) {
return false;
} finally {
if (list == null)
return false;
}//prevent NPE on MoJhoSto
for (Card c : list) {
if (c.hasSVar("SacMe") && Integer.parseInt(c.getSVar("SacMe")) > 3) {
return false;
@@ -131,15 +140,31 @@ public class SacrificeAi extends SpellAbilityAi {
amount = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), amount);
}
List<Card> humanList =
CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
List<Card> humanList = null;
try {
humanList = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
} catch (NullPointerException e) {
return false;
} finally {
if (humanList == null)
return false;
}//prevent NPE on MoJhoSto
// Since all of the cards have AI:RemoveDeck:All, I enabled 1 for 1
// (or X for X) trades for special decks
return humanList.size() >= amount;
} else if (defined.equals("You")) {
List<Card> computerList =
CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
List<Card> computerList = null;
try {
computerList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa);
} catch (NullPointerException e) {
return false;
} finally {
if (computerList == null)
return false;
}//prevent NPE on MoJhoSto
for (Card c : computerList) {
if (c.hasSVar("SacMe") || ComputerUtilCard.evaluateCreature(c) <= 135) {
return true;

View File

@@ -29,6 +29,13 @@ public class GameStateEvaluator {
if (phase.isAfter(PhaseType.COMBAT_DAMAGE) || evalGame.isGameOver()) {
return null;
}
// If the current player has no creatures in play, there won't be any combat. This avoids
// an expensive game copy operation.
// Note: This is is safe to do because the simulation is based on the current game state,
// so there isn't a chance to play creatures in between.
if (evalGame.getPhaseHandler().getPlayerTurn().getCreaturesInPlay().isEmpty()) {
return null;
}
GameCopier copier = new GameCopier(evalGame);
Game gameCopy = copier.makeCopy();
gameCopy.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_DAMAGE);

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.30-SNAPSHOT</version>
<version>1.6.31</version>
</parent>
<artifactId>forge-core</artifactId>
@@ -21,7 +21,7 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
<version>3.8.1</version>
</dependency>
</dependencies>

View File

@@ -111,7 +111,18 @@ public final class ImageKeys {
file = findFile(dir, TextUtil.fastReplace(filename, "AE", "Ae"));
if (file != null) { return file; }
}
//try fullborder...
if (filename.contains(".full")) {
file = findFile(dir, TextUtil.fastReplace(filename, ".full", ".fullborder"));
if (file != null) { return file; }
}
//if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder
if (!filename.contains(".full")) {
file = findFile(dir, TextUtil.addSuffix(filename,".full"));
if (file != null) { return file; }
file = findFile(dir, TextUtil.addSuffix(filename,".fullborder"));
if (file != null) { return file; }
}
// some S00 cards are really part of 6ED
String s2kAlias = getSetFolder("S00");
if (filename.startsWith(s2kAlias)) {

View File

@@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils;
public abstract class LobbyPlayer {
protected String name;
private int avatarIndex = -1;
private int sleeveIndex = -1;
private String avatarCardImageKey;
public LobbyPlayer(String name) {
@@ -59,9 +60,15 @@ public abstract class LobbyPlayer {
public int getAvatarIndex() {
return avatarIndex;
}
public int getSleeveIndex() {
return sleeveIndex;
}
public void setAvatarIndex(int avatarIndex) {
this.avatarIndex = avatarIndex;
}
public void setSleeveIndex(int sleeveIndex) {
this.sleeveIndex = sleeveIndex;
}
public String getAvatarCardImageKey() {
return avatarCardImageKey;

View File

@@ -35,6 +35,7 @@ public class StaticData {
private Predicate<PaperCard> standardPredicate;
private Predicate<PaperCard> brawlPredicate;
private Predicate<PaperCard> pioneerPredicate;
private Predicate<PaperCard> modernPredicate;
private Predicate<PaperCard> commanderPredicate;
private Predicate<PaperCard> oathbreakerPredicate;
@@ -197,13 +198,13 @@ public class StaticData {
public TokenDb getAllTokens() { return allTokens; }
public Predicate<PaperCard> getStandardPredicate() {
return standardPredicate;
}
public void setStandardPredicate(Predicate<PaperCard> standardPredicate) { this.standardPredicate = standardPredicate; }
public void setModernPredicate(Predicate<PaperCard> modernPredicate) { this.modernPredicate = standardPredicate; }
public void setPioneerPredicate(Predicate<PaperCard> pioneerPredicate) { this.pioneerPredicate = pioneerPredicate; }
public void setModernPredicate(Predicate<PaperCard> modernPredicate) { this.modernPredicate = modernPredicate; }
public void setCommanderPredicate(Predicate<PaperCard> commanderPredicate) { this.commanderPredicate = commanderPredicate; }
@@ -211,9 +212,11 @@ public class StaticData {
public void setBrawlPredicate(Predicate<PaperCard> brawlPredicate) { this.brawlPredicate = brawlPredicate; }
public Predicate<PaperCard> getModernPredicate() {
return modernPredicate;
}
public Predicate<PaperCard> getStandardPredicate() { return standardPredicate; }
public Predicate<PaperCard> getPioneerPredicate() { return pioneerPredicate; }
public Predicate<PaperCard> getModernPredicate() { return modernPredicate; }
public Predicate<PaperCard> getCommanderPredicate() { return commanderPredicate; }

View File

@@ -553,6 +553,23 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
return Lists.newArrayList(Iterables.filter(this.roAllCards, predicate));
}
// Do I want a foiled version of these cards?
@Override
public List<PaperCard> getAllCardsFromEdition(CardEdition edition) {
List<PaperCard> cards = Lists.newArrayList();
for(CardInSet cis : edition.getCards()) {
PaperCard card = this.getCard(cis.name, edition.getCode());
if (card == null) {
// Just in case the card is listed in the edition file but Forge doesn't support it
continue;
}
cards.add(card);
}
return cards;
}
@Override
public boolean contains(String name) {
return allCardsByName.containsKey(getName(name));

View File

@@ -110,6 +110,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
private Type type;
private String name;
private String alias = null;
private String prerelease = null;
private boolean whiteBorder = false;
private FoilType foilType = FoilType.NOT_SUPPORTED;
private double foilChanceInBooster = 0;
@@ -178,6 +179,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
public Type getType() { return type; }
public String getName() { return name; }
public String getAlias() { return alias; }
public String getPrerelease() { return prerelease; }
public FoilType getFoilType() { return foilType; }
public double getFoilChanceInBooster() { return foilChanceInBooster; }
public boolean getFoilAlwaysInCommonSlot() { return foilAlwaysInCommonSlot; }
@@ -303,7 +305,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
tokenNormalized
);
FileSection section = FileSection.parse(contents.get("metadata"), "=");
FileSection section = FileSection.parse(contents.get("metadata"), FileSection.EQUALS_KV_SEPARATOR);
res.name = section.get("name");
res.date = parseDate(section.get("date"));
res.code = section.get("code");
@@ -333,6 +335,7 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
}
}
res.type = enumType;
res.prerelease = section.get("Prerelease", null);
switch(section.get("foil", "newstyle").toLowerCase()) {
case "notsupported":
@@ -413,6 +416,16 @@ public final class CardEdition implements Comparable<CardEdition> { // immutable
return res;
}
public Iterable<CardEdition> getPrereleaseEditions() {
List<CardEdition> res = Lists.newArrayList(this);
return Iterables.filter(res, new Predicate<CardEdition>() {
@Override
public boolean apply(final CardEdition edition) {
return edition.getPrerelease() != null;
}
});
}
public CardEdition getEditionByCodeOrThrow(final String code) {
final CardEdition set = this.get(code);
if (null == set) {

View File

@@ -606,13 +606,13 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
public static class Constant {
public static final Settable LOADED = new Settable();
public static final List<String> BASIC_TYPES = Lists.newArrayList();
public static final List<String> LAND_TYPES = Lists.newArrayList();
public static final List<String> CREATURE_TYPES = Lists.newArrayList();
public static final List<String> SPELL_TYPES = Lists.newArrayList();
public static final List<String> ENCHANTMENT_TYPES = Lists.newArrayList();
public static final List<String> ARTIFACT_TYPES = Lists.newArrayList();
public static final List<String> WALKER_TYPES = Lists.newArrayList();
public static final Set<String> BASIC_TYPES = Sets.newHashSet();
public static final Set<String> LAND_TYPES = Sets.newHashSet();
public static final Set<String> CREATURE_TYPES = Sets.newHashSet();
public static final Set<String> SPELL_TYPES = Sets.newHashSet();
public static final Set<String> ENCHANTMENT_TYPES = Sets.newHashSet();
public static final Set<String> ARTIFACT_TYPES = Sets.newHashSet();
public static final Set<String> WALKER_TYPES = Sets.newHashSet();
// singular -> plural
public static final BiMap<String,String> pluralTypes = HashBiMap.create();
@@ -699,12 +699,12 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
return sortedSubTypes;
}
public static List<String> getBasicTypes() {
return Collections.unmodifiableList(Constant.BASIC_TYPES);
public static Collection<String> getBasicTypes() {
return Collections.unmodifiableCollection(Constant.BASIC_TYPES);
}
public static List<String> getAllCreatureTypes() {
return Collections.unmodifiableList(Constant.CREATURE_TYPES);
public static Collection<String> getAllCreatureTypes() {
return Collections.unmodifiableCollection(Constant.CREATURE_TYPES);
}
public static List<String> getAllLandTypes() {
return ImmutableList.<String>builder()

View File

@@ -28,6 +28,8 @@ public interface ICardDatabase extends Iterable<PaperCard> {
List<PaperCard> getAllCards(String cardName);
List<PaperCard> getAllCards(Predicate<PaperCard> predicate);
List<PaperCard> getAllCardsFromEdition(CardEdition edition);
Predicate<? super PaperCard> wasPrintedInSets(List<String> allowedSetCodes);
}

View File

@@ -21,7 +21,6 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import forge.StaticData;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
@@ -37,8 +36,11 @@ import forge.util.TextUtil;
import org.apache.commons.lang3.Range;
import org.apache.commons.lang3.tuple.ImmutablePair;
import java.util.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
/**
* GameType is an enum to determine the type of current game. :)
@@ -324,23 +326,32 @@ public enum DeckFormat {
}
final int maxCopies = getMaxCardCopies();
if (maxCopies < Integer.MAX_VALUE) {
//Must contain no more than 4 of the same card
//shared among the main deck and sideboard, except
//basic lands, Shadowborn Apostle, Relentless Rats and Rat Colony
//Must contain no more than 4 of the same card
//shared among the main deck and sideboard, except
//basic lands, Shadowborn Apostle, Relentless Rats and Rat Colony
// Seven Dwarves can have 7 in the deck. More than 7 in deck + sb is ok in Limited
final CardPool allCards = deck.getAllCardsInASinglePool(hasCommander());
final CardPool allCards = deck.getAllCardsInASinglePool(hasCommander());
// should group all cards by name, so that different editions of same card are really counted as the same card
for (final Entry<String, Integer> cp : Aggregates.groupSumBy(allCards, PaperCard.FN_GET_NAME)) {
final IPaperCard simpleCard = StaticData.instance().getCommonCards().getCard(cp.getKey());
if (simpleCard == null) {
return TextUtil.concatWithSpace("contains the nonexisting card", cp.getKey());
}
// should group all cards by name, so that different editions of same card are really counted as the same card
for (final Entry<String, Integer> cp : Aggregates.groupSumBy(allCards, PaperCard.FN_GET_NAME)) {
final IPaperCard simpleCard = StaticData.instance().getCommonCards().getCard(cp.getKey());
// Might cause issues since it ignores "Special" Cards
if (simpleCard == null) {
return TextUtil.concatWithSpace("contains the nonexisting card", cp.getKey());
}
if (!canHaveAnyNumberOf(simpleCard) && cp.getValue() > maxCopies) {
return TextUtil.concatWithSpace("must not contain more than", String.valueOf(maxCopies), "copies of the card", cp.getKey());
}
if (canHaveAnyNumberOf(simpleCard)) {
continue;
}
Integer cardCopies = canHaveSpecificNumberInDeck(simpleCard);
if (cardCopies != null && deck.getMain().countByName(cp.getKey(), true) > cardCopies) {
return TextUtil.concatWithSpace("must not contain more than", String.valueOf(cardCopies), "copies of the card", cp.getKey());
}
if (cardCopies == null && cp.getValue() > maxCopies) {
return TextUtil.concatWithSpace("must not contain more than", String.valueOf(maxCopies), "copies of the card", cp.getKey());
}
}
@@ -362,6 +373,16 @@ public enum DeckFormat {
"A deck can have any number of cards named CARDNAME.");
}
public static Integer canHaveSpecificNumberInDeck(final IPaperCard card) {
// Ideally, this would be parsed during card parsing and set this value
if (Iterables.contains(card.getRules().getMainPart().getKeywords(),
"A deck can have up to seven cards named CARDNAME.")) {
return 7;
}
return null;
}
public static String getPlaneSectionConformanceProblem(final CardPool planes) {
//Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton.
if (planes == null || planes.countAll() < 10) {

View File

@@ -27,7 +27,7 @@ public class DeckSerializer {
}
final List<String> metadata = map.get("metadata");
if (metadata != null) {
return new DeckFileHeader(FileSection.parse(metadata, "="));
return new DeckFileHeader(FileSection.parse(metadata, FileSection.EQUALS_KV_SEPARATOR));
}
final List<String> general = map.get("general");
if (general != null) {

View File

@@ -108,7 +108,7 @@ public class PreconDeck implements InventoryItemFromSet {
// To be able to read "shops" section in overloads
protected PreconDeck getPreconDeckFromSections(final Map<String, List<String>> sections) {
FileSection kv = FileSection.parse(sections.get("metadata"), "=");
FileSection kv = FileSection.parse(sections.get("metadata"), FileSection.EQUALS_KV_SEPARATOR);
String imageFilename = kv.get("Image");
String description = kv.get("Description");
String deckEdition = kv.get("set");

View File

@@ -1,9 +1,6 @@
package forge.card;
package forge.util;
import com.esotericsoftware.minlog.Log;
import com.google.common.base.Charsets;
import forge.properties.ForgeConstants;
import forge.util.LineReader;
import java.io.FileInputStream;
import java.io.IOException;
@@ -15,12 +12,12 @@ public class CardTranslation {
private static Map <String, String> translatednames;
private static Map <String, String> translatedtypes;
private static Map <String, String> translatedoracles;
private static String languageSelected;
private static String languageSelected = "en-US";
private static void readTranslationFile(String language) {
private static void readTranslationFile(String language, String languagesDirectory) {
String filename = "cardnames-" + language + ".txt";
try (LineReader translationFile = new LineReader(new FileInputStream(ForgeConstants.LANG_DIR + filename), Charsets.UTF_8)) {
try (LineReader translationFile = new LineReader(new FileInputStream(languagesDirectory + filename), Charsets.UTF_8)) {
for (String line : translationFile.readLines()) {
String[] matches = line.split("\\|");
if (matches.length >= 2) {
@@ -34,7 +31,7 @@ public class CardTranslation {
}
}
} catch (IOException e) {
Log.error("Error reading translation file: cardnames-" + language + ".txt");
System.err.println("Error reading translation file: cardnames-" + language + ".txt");
}
}
@@ -66,7 +63,7 @@ public class CardTranslation {
}
public static HashMap<String, String> getTranslationTexts(String cardname, String altcardname) {
HashMap<String, String> translations = new HashMap<String, String>();
HashMap<String, String> translations = new HashMap<>();
translations.put("name", getTranslatedName(cardname));
translations.put("oracle", getTranslatedOracle(cardname));
translations.put("altname", getTranslatedName(altcardname));
@@ -78,14 +75,14 @@ public class CardTranslation {
return !languageSelected.equals("en-US");
}
public static void preloadTranslation(String language) {
public static void preloadTranslation(String language, String languagesDirectory) {
languageSelected = language;
if (needsTranslation()) {
translatednames = new HashMap<>();
translatedtypes = new HashMap<>();
translatedoracles = new HashMap<>();
readTranslationFile(languageSelected);
readTranslationFile(languageSelected, languagesDirectory);
}
}
}

View File

@@ -17,9 +17,12 @@
*/
package forge.util;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -56,34 +59,40 @@ public class FileSection {
protected FileSection(Map<String, String> lines0) {
lines = lines0;
}
/**
* Parses the.
*
* @param line the line
* @param kvSeparator the kv separator
* @param pairSeparator the pair separator
* @return the file section
*/
public static FileSection parse(final String line, final String kvSeparator, final String pairSeparator) {
Map<String, String> map = parseToMap(line, kvSeparator, pairSeparator);
return new FileSection(map);
}
public static Map<String, String> parseToMap(final String line, final String kvSeparator, final String pairSeparator) {
Map<String, String> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
if (!StringUtils.isEmpty(line)) {
final String[] pairs = line.split(Pattern.quote(pairSeparator));
final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator));
for (final String dd : pairs) {
final String[] v = splitter.split(dd, 2);
result.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}
public static final Pattern DOLLAR_SIGN_KV_SEPARATOR = Pattern.compile(Pattern.quote("$"));
public static final Pattern ARROW_KV_SEPARATOR = Pattern.compile(Pattern.quote("->"));
public static final Pattern EQUALS_KV_SEPARATOR = Pattern.compile(Pattern.quote("="));
public static final Pattern COLON_KV_SEPARATOR = Pattern.compile(Pattern.quote(":"));
private static final String BAR_PAIR_SPLITTER = Pattern.quote("|");
private static Table<String, Pattern, Map<String, String>> parseToMapCache = HashBasedTable.create();
public static Map<String, String> parseToMap(final String line, final Pattern kvSeparator) {
Map<String, String> result = parseToMapCache.get(line, kvSeparator);
if (result != null) {
return result;
}
result = parseToMapImpl(line, kvSeparator);
parseToMapCache.put(line, kvSeparator, result);
return result;
}
private static Map<String, String> parseToMapImpl(final String line, final Pattern kvSeparator) {
if (StringUtils.isEmpty(line)) {
return Collections.emptyMap();
}
final Map<String, String> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
final String[] pairs = line.split(BAR_PAIR_SPLITTER);
for (final String dd : pairs) {
final String[] v = kvSeparator.split(dd, 2);
result.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}
return Collections.unmodifiableMap(result);
}
/**
* Parses the.
*
@@ -91,11 +100,10 @@ public class FileSection {
* @param kvSeparator the kv separator
* @return the file section
*/
public static FileSection parse(final Iterable<String> lines, final String kvSeparator) {
public static FileSection parse(final Iterable<String> lines, final Pattern kvSeparator) {
final FileSection result = new FileSection();
final Pattern splitter = Pattern.compile(Pattern.quote(kvSeparator));
for (final String dd : lines) {
final String[] v = splitter.split(dd, 2);
final String[] v = kvSeparator.split(dd, 2);
result.lines.put(v[0].trim(), v.length > 1 ? v[1].trim() : "");
}

View File

@@ -6,7 +6,7 @@
<parent>
<artifactId>forge</artifactId>
<groupId>forge</groupId>
<version>1.6.30-SNAPSHOT</version>
<version>1.6.31</version>
</parent>
<artifactId>forge-game</artifactId>
@@ -32,8 +32,8 @@
</dependency>
<dependency>
<groupId>io.sentry</groupId>
<artifactId>sentry-log4j</artifactId>
<version>1.7.5</version>
<artifactId>sentry-log4j2</artifactId>
<version>1.7.27</version>
</dependency>
</dependencies>

View File

@@ -73,7 +73,8 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView {
}
public final String getParamOrDefault(String key, String defaultValue) {
return hasParam(key) ? getParam(key) : defaultValue;
String param = mapParams.get(key);
return param != null ? param : defaultValue;
}
public String getParam(String key) {

View File

@@ -701,7 +701,9 @@ public class GameAction {
// Run triggers
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(c);
runParams.put(AbilityKey.Cause, cause);
runParams.put(AbilityKey.Origin, origin.getZoneType().name());
if (origin != null) { // is generally null when adding via dev mode
runParams.put(AbilityKey.Origin, origin.getZoneType().name());
}
if (params != null) {
runParams.putAll(params);
}

View File

@@ -75,7 +75,7 @@ public final class GameActionUtil {
Card source = sa.getHostCard();
final Game game = source.getGame();
if (sa.isSpell()) {
if (sa.isSpell() && !source.isInZone(ZoneType.Battlefield)) {
boolean lkicheck = false;
// need to be done before so it works with Vivien and Zoetic Cavern
@@ -88,7 +88,7 @@ public final class GameActionUtil {
lkicheck = true;
}
if (sa.hasParam("Bestow") && !source.isBestowed() && !source.isInZone(ZoneType.Battlefield)) {
if (sa.isBestow() && !source.isBestowed() && !source.isInZone(ZoneType.Battlefield)) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
@@ -102,7 +102,7 @@ public final class GameActionUtil {
}
source.turnFaceDownNoUpdate();
lkicheck = true;
} else if (sa.isAdventure() && !source.isInZone(ZoneType.Battlefield)) {
} else if (sa.isAdventure()) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
@@ -146,6 +146,7 @@ public final class GameActionUtil {
if (lkicheck) {
// double freeze tracker, so it doesn't update view
game.getTracker().freeze();
source.clearChangedCardKeywords(false);
CardCollection preList = new CardCollection(source);
game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList);
}
@@ -207,6 +208,57 @@ public final class GameActionUtil {
alternatives.add(newSA);
}
// need to be done there before static abilities does reset the card
if (sa.isBasicSpell()) {
for (final KeywordInterface inst : source.getKeywords()) {
final String keyword = inst.getOriginal();
if (keyword.startsWith("Escape")) {
final String[] k = keyword.split(":");
final Cost escapeCost = new Cost(k[1], true);
final SpellAbility newSA = sa.copyWithDefinedCost(escapeCost);
newSA.getMapParams().put("PrecostDesc", "Escape—");
newSA.getMapParams().put("CostDesc", escapeCost.toString());
// makes new SpellDescription
final StringBuilder desc = new StringBuilder();
desc.append(newSA.getCostDescription());
desc.append("(").append(inst.getReminderText()).append(")");
newSA.setDescription(desc.toString());
// Stack Description only for Permanent or it might crash
if (source.isPermanent()) {
final StringBuilder sbStack = new StringBuilder();
sbStack.append(sa.getStackDescription()).append(" (Escaped)");
newSA.setStackDescription(sbStack.toString());
}
newSA.setAlternativeCost(AlternativeCost.Escape);
newSA.getRestrictions().setZone(ZoneType.Graveyard);
alternatives.add(newSA);
} else if (keyword.startsWith("Flashback")) {
// if source has No Mana cost, and flashback doesn't have own one,
// flashback can't work
if (keyword.equals("Flashback") && source.getManaCost().isNoCost()) {
continue;
}
final SpellAbility flashback = sa.copy(activator);
flashback.setAlternativeCost(AlternativeCost.Flashback);
flashback.getRestrictions().setZone(ZoneType.Graveyard);
// there is a flashback cost (and not the cards cost)
if (keyword.contains(":")) {
final String[] k = keyword.split(":");
flashback.setPayCosts(new Cost(k[1], false));
}
alternatives.add(flashback);
}
}
}
// reset static abilities
if (lkicheck) {
game.getAction().checkStaticAbilities(false);
@@ -244,28 +296,6 @@ public final class GameActionUtil {
alternatives.add(newSA);
}
for (final KeywordInterface inst : source.getKeywords()) {
final String keyword = inst.getOriginal();
if (sa.isSpell() && keyword.startsWith("Flashback")) {
// if source has No Mana cost, and flashback doesn't have own one,
// flashback can't work
if (keyword.equals("Flashback") && source.getManaCost().isNoCost()) {
continue;
}
final SpellAbility flashback = sa.copy(activator);
flashback.setFlashBackAbility(true);
flashback.getRestrictions().setZone(ZoneType.Graveyard);
// there is a flashback cost (and not the cards cost)
if (keyword.contains(":")) {
final String[] k = keyword.split(":");
flashback.setPayCosts(new Cost(k[1], false));
}
alternatives.add(flashback);
}
}
return alternatives;
}

View File

@@ -47,7 +47,7 @@ import java.util.Map.Entry;
public class GameFormat implements Comparable<GameFormat> {
private final String name;
public enum FormatType {Sanctioned, Casual, Historic, Digital, Custom}
public enum FormatSubType {Block, Standard, Extended, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Custom}
public enum FormatSubType {Block, Standard, Extended, Pioneer, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Custom}
// contains allowed sets, when empty allows all sets
private FormatType formatType;
@@ -290,6 +290,7 @@ public class GameFormat implements Comparable<GameFormat> {
private List<String> coreFormats = new ArrayList<>();
{
coreFormats.add("Standard.txt");
coreFormats.add("Pioneer.txt");
coreFormats.add("Modern.txt");
coreFormats.add("Legacy.txt");
coreFormats.add("Vintage.txt");
@@ -320,7 +321,7 @@ public class GameFormat implements Comparable<GameFormat> {
if (formatStrings == null){
return null;
}
FileSection section = FileSection.parse(formatStrings, ":");
FileSection section = FileSection.parse(formatStrings, FileSection.COLON_KV_SEPARATOR);
String title = section.get("name");
FormatType formatType;
try {
@@ -468,6 +469,10 @@ public class GameFormat implements Comparable<GameFormat> {
return this.map.get("Extended");
}
public GameFormat getPioneer() {
return this.map.get("Pioneer");
}
public GameFormat getModern() {
return this.map.get("Modern");
}

View File

@@ -33,11 +33,11 @@ import forge.game.player.RegisteredPlayer;
import forge.game.spellability.TargetChoices;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.maps.MapOfLists;
public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
private final GameLog log;
public GameLogFormatter(GameLog gameLog) {
log = gameLog;
}
@@ -52,16 +52,15 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
public GameLogEntry visit(GameEventScry ev) {
final Localizer localizer = Localizer.getInstance();
String scryOutcome = "";
String toTop = Lang.nounWithAmount(ev.toTop, "card") + " to the top of the library";
String toBottom = Lang.nounWithAmount(ev.toBottom, "card") + " to the bottom of the library";
if (ev.toTop > 0 && ev.toBottom > 0) {
scryOutcome = ev.player.toString() + " scried " + toTop + " and " + toBottom;
scryOutcome = localizer.getMessage("lblLogScryTopBottomLibrary").replace("%s", ev.player.toString()).replace("%top", String.valueOf(ev.toTop)).replace("%bottom", String.valueOf(ev.toBottom));
} else if (ev.toBottom == 0) {
scryOutcome = ev.player.toString() + " scried " + toTop;
scryOutcome = localizer.getMessage("lblLogScryTopLibrary").replace("%s", ev.player.toString()).replace("%top", String.valueOf(ev.toTop));
} else {
scryOutcome = ev.player.toString() + " scried " + toBottom;
scryOutcome = localizer.getMessage("lblLogScryBottomLibrary").replace("%s", ev.player.toString()).replace("%bottom", String.valueOf(ev.toBottom));
}
return new GameLogEntry(GameLogEntryType.STACK_RESOLVE, scryOutcome);
@@ -218,6 +217,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
public GameLogEntry visit(final GameEventAttackersDeclared ev) {
final StringBuilder sb = new StringBuilder();
final Localizer localizer = Localizer.getInstance();
// Loop through Defenders
// Append Defending Player/Planeswalker
@@ -233,7 +233,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
sb.append(" to attack ").append(k).append(".");
}
if (sb.length() == 0) {
sb.append(ev.player).append(" didn't attack this turn.");
sb.append(localizer.getMessage("lblPlayerDidntAttackThisTurn").replace("%s", ev.player.toString()));
}
return new GameLogEntry(GameLogEntryType.COMBAT, sb.toString());
}
@@ -281,7 +281,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
public GameLogEntry visit(GameEventMulligan ev) {
String message = ev.player.toString() + " has mulliganed down to " + ev.player.getZone(ZoneType.Hand).size() + " cards.";
String message = Localizer.getInstance().getMessage("lblPlayerHasMulliganedDownToNCards").replace("%d", String.valueOf(ev.player.getZone(ZoneType.Hand).size())).replace("%s", ev.player.toString());
return new GameLogEntry(GameLogEntryType.MULLIGAN, message);
}

View File

@@ -19,6 +19,7 @@ import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.MyRandom;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import java.util.*;
import java.util.Map.Entry;
@@ -291,12 +292,13 @@ public class Match {
}
}
final Localizer localizer = Localizer.getInstance();
if (!rAICards.isEmpty() && !rules.getGameType().isCardPoolLimited()) {
game.getAction().revealAnte("AI can't play these cards well", rAICards);
game.getAction().revealAnte(localizer.getMessage("lblAICantPlayCards"), rAICards);
}
if (!removedAnteCards.isEmpty()) {
game.getAction().revealAnte("These ante cards were removed", removedAnteCards);
game.getAction().revealAnte(localizer.getMessage("lblAnteCardsRemoved"), removedAnteCards);
}
}

View File

@@ -382,21 +382,10 @@ public final class AbilityFactory {
* @param mapParams
*/
private static final void initializeParams(final SpellAbility sa, Map<String, String> mapParams) {
if (mapParams.containsKey("Flashback")) {
sa.setFlashBackAbility(true);
}
if (mapParams.containsKey("NonBasicSpell")) {
sa.setBasicSpell(false);
}
if (mapParams.containsKey("Dash")) {
sa.setDash(true);
}
if (mapParams.containsKey("Outlast")) {
sa.setOutlast(true);
}
}
/**
@@ -449,7 +438,7 @@ public final class AbilityFactory {
}
public static final Map<String, String> getMapParams(final String abString) {
return FileSection.parseToMap(abString, "$", "|");
return FileSection.parseToMap(abString, FileSection.DOLLAR_SIGN_KV_SEPARATOR);
}
public static final void adjustChangeZoneTarget(final Map<String, String> params, final SpellAbility sa) {

View File

@@ -1708,7 +1708,7 @@ public class AbilityUtils {
if (res.checkTimingRestrictions(tgtCard, newSA)
// still need to check the other restrictions like Aftermath
&& res.checkOtherRestrictions(tgtCard, newSA, controller)
&& newSA.checkOtherRestrictions()) {
&& newSA.checkOtherRestrictions(tgtCard)) {
sas.add(newSA);
}
}

View File

@@ -8,6 +8,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Map;
@@ -23,7 +25,7 @@ public class AbandonEffect extends SpellAbilityEffect {
Player controller = source.getController();
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !controller.getController().confirmAction(sa, null, "Would you like to abandon the scheme " + source + "?")) {
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblWouldYouLikeAbandonSource", CardTranslation.getTranslatedName(source.getName())))) {
return;
}

View File

@@ -9,6 +9,7 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.Lang;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -51,7 +52,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect {
continue;
}
SpellAbility manaAb = p.getController().chooseSingleSpellForEffect(
possibleAb, sa, "Choose a mana ability:", ImmutableMap.of());
possibleAb, sa, Localizer.getInstance().getMessage("lblChooseManaAbility"), ImmutableMap.of());
p.getController().playChosenSpellAbility(manaAb);
}
}

View File

@@ -8,6 +8,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.util.Localizer;
import java.util.List;
@@ -61,7 +62,7 @@ public class AddTurnEffect extends SpellAbilityEffect {
extra.setCantSetSchemesInMotion(true);
}
if (sa.hasParam("ShowMessage")) {
p.getGame().getAction().nofityOfValue(sa, p, p + " takes an extra turn.", null);
p.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblPlayerTakesExtraTurn", p.toString()), null);
}
}
}

View File

@@ -8,6 +8,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CardZoneTable;
import forge.game.card.CounterType;
import forge.game.card.token.TokenInfo;
import forge.game.event.GameEventTokenCreated;
@@ -16,6 +17,7 @@ import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
public class AmassEffect extends SpellAbilityEffect {
@@ -44,6 +46,17 @@ public class AmassEffect extends SpellAbilityEffect {
final int amount = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("Num", "1"), sa);
final boolean remember = sa.hasParam("RememberAmass");
boolean useZoneTable = true;
CardZoneTable triggerList = sa.getChangeZoneTable();
if (triggerList == null) {
triggerList = new CardZoneTable();
useZoneTable = false;
}
if (sa.hasParam("ChangeZoneTable")) {
sa.setChangeZoneTable(triggerList);
useZoneTable = true;
}
// create army token if needed
if (CardLists.count(activator.getCardsIn(ZoneType.Battlefield), CardPredicates.isType("Army")) == 0) {
final String tokenScript = "b_0_0_zombie_army";
@@ -54,14 +67,21 @@ public class AmassEffect extends SpellAbilityEffect {
// Should this be catching the Card that's returned?
Card c = game.getAction().moveToPlay(tok, sa);
if (c.getZone() != null) {
triggerList.put(ZoneType.None, c.getZone().getZoneType(), c);
}
c.updateStateForView();
}
if (!useZoneTable) {
triggerList.triggerChangesZoneAll(game);
triggerList.clear();
}
game.fireEvent(new GameEventTokenCreated());
}
CardCollectionView tgtCards = CardLists.getType(activator.getCardsIn(ZoneType.Battlefield), "Army");
tgtCards = pc.chooseCardsForEffect(tgtCards, sa, "Choose an army to put counters on", 1, 1, false);
tgtCards = pc.chooseCardsForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblChooseAnArmy"), 1, 1, false);
GameEntityCounterTable table = new GameEntityCounterTable();
for(final Card tgtCard : tgtCards) {

View File

@@ -16,6 +16,7 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
public class AssignGroupEffect extends SpellAbilityEffect {
@@ -49,7 +50,7 @@ public class AssignGroupEffect extends SpellAbilityEffect {
Multimap<SpellAbility, GameObject> result = ArrayListMultimap.create();
for (GameObject g : defined) {
final String title = "Choose ability for " + g.toString();
final String title = Localizer.getInstance().getMessage("lblChooseAbilityForObject", g.toString());
Map<String, Object> params = Maps.newHashMap();
params.put("Affected", g);

View File

@@ -16,6 +16,8 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
@@ -44,6 +46,14 @@ public class AttachEffect extends SpellAbilityEffect {
} else {
attachTo = targets.get(0);
}
String attachToName = null;
if (attachTo instanceof Card) {
attachToName = CardTranslation.getTranslatedName(((Card)attachTo).getName());
}
else {
attachToName = attachTo.toString();
}
final Player p = sa.getActivatingPlayer();
@@ -60,7 +70,7 @@ public class AttachEffect extends SpellAbilityEffect {
// If Cast Targets will be checked on the Stack
for (final Card attachment : attachments) {
String message = "Do you want to attach " + attachment + " to " + attachTo + "?";
String message = Localizer.getInstance().getMessage("lblDoYouWantAttachSourceToTarget", CardTranslation.getTranslatedName(attachment.getName()), attachToName);
if ( sa.hasParam("Optional") && !p.getController().confirmAction(sa, null, message) )
continue;
handleAttachment(attachment, attachTo, sa);
@@ -173,7 +183,7 @@ public class AttachEffect extends SpellAbilityEffect {
players.add(player);
}
}
final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, source + " - Select a player to attach to.");
final Player pa = p.getController().chooseSingleEntityForEffect(players, aura, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", CardTranslation.getTranslatedName(source.getName())));
if (pa != null) {
handleAura(source, pa);
return true;
@@ -186,7 +196,7 @@ public class AttachEffect extends SpellAbilityEffect {
return false;
}
final Card o = p.getController().chooseSingleEntityForEffect(list, aura, source + " - Select a card to attach to.");
final Card o = p.getController().chooseSingleEntityForEffect(list, aura, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", CardTranslation.getTranslatedName(source.getName())));
if (o != null) {
handleAura(source, o);
//source.enchantEntity((Card) o);

View File

@@ -11,6 +11,7 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.util.collect.FCollection;
import forge.util.Localizer;
public class BidLifeEffect extends SpellAbilityEffect {
@Override
@@ -27,7 +28,7 @@ public class BidLifeEffect extends SpellAbilityEffect {
if (sa.hasParam("StartBidding")) {
String start = sa.getParam("StartBidding");
if ("Any".equals(start)) {
startBidding = activator.getController().announceRequirements(sa, "Choose a starting bid", true);
startBidding = activator.getController().announceRequirements(sa, Localizer.getInstance().getMessage("lblChooseStartingBid"), true);
} else {
startBidding = AbilityUtils.calculateAmount(host, start, sa);
}
@@ -54,12 +55,12 @@ public class BidLifeEffect extends SpellAbilityEffect {
willBid = false;
for (final Player p : bidPlayers) {
final boolean result = p.getController().confirmBidAction(sa, PlayerActionConfirmMode.BidLife,
"Do you want to top bid? Current Bid =" + bid, bid, winner);
Localizer.getInstance().getMessage("lblDoYouWantTopBid") + bid, bid, winner);
willBid |= result;
if (result) { // a different choose number
bid += p.getController().chooseNumber(sa, "Bid life:", 1, 9);
bid += p.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblBidLife") + ":", 1, 9);
winner = p;
host.getGame().getAction().nofityOfValue(sa, p, "topped bid with " + bid + " life", p);
host.getGame().getAction().nofityOfValue(sa, p, Localizer.getInstance().getMessage("lblTopBidWithValueLife", String.valueOf(bid)), p);
}
}
}

View File

@@ -6,6 +6,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollectionView;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
@@ -30,7 +31,7 @@ public class BondEffect extends SpellAbilityEffect {
Card partner = cards.getFirst();
// skip choice if only one card on list
if (cards.size() > 1) {
partner = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(cards, sa, "Select a card to pair with");
partner = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(cards, sa, Localizer.getInstance().getMessage("lblSelectACardPair"));
}
// pair choices together

View File

@@ -13,6 +13,8 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
import org.apache.commons.lang3.StringUtils;
@@ -44,7 +46,7 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect {
final GameEntity originalDefender = combat.getDefenderByAttacker(c);
final FCollectionView<GameEntity> defs = combat.getDefenders();
final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(defs, sa,
"Choose which defender to attack with " + c, false);
Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())), false);
if (originalDefender != null && !originalDefender.equals(defender)) {
AttackingBand ab = combat.getBandOfAttacker(c);
if (ab != null) {

View File

@@ -11,6 +11,7 @@ import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetChoices;
import forge.game.zone.MagicStack;
import forge.util.Aggregates;
import forge.util.Localizer;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@@ -50,8 +51,8 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
// Redirect rules read 'you MAY choose new targets' ... okay!
// TODO: Don't even ask to change targets, if the SA and subs don't actually have targets
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !chooser.getController().confirmAction(sa, null, "Do you want to change targets of " + tgtSA.getHostCard() + "?")) {
continue;
if (isOptional && !chooser.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantChangeAbilityTargets", tgtSA.getHostCard().toString()))) {
continue;
}
if (changesOneTarget) {
// 1. choose a target of target spell

View File

@@ -14,6 +14,7 @@ import forge.game.card.Card;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
import forge.util.TextUtil;
import forge.util.Localizer;
public class ChangeTextEffect extends SpellAbilityEffect {
@@ -33,7 +34,7 @@ public class ChangeTextEffect extends SpellAbilityEffect {
final String[] changedColorWordsArray = sa.getParam("ChangeColorWord").split(" ");
if (changedColorWordsArray[0].equals("Choose")) {
originalColor = sa.getActivatingPlayer().getController().chooseColor(
"Choose a color word to replace", sa, ColorSet.ALL_COLORS);
Localizer.getInstance().getMessage("lblChooseColorReplace"), sa, ColorSet.ALL_COLORS);
changedColorWordOriginal = TextUtil.capitalize(MagicColor.toLongString(originalColor));
} else {
changedColorWordOriginal = changedColorWordsArray[0];
@@ -48,7 +49,7 @@ public class ChangeTextEffect extends SpellAbilityEffect {
possibleNewColors = ColorSet.fromMask(originalColor).inverse();
}
final byte newColor = sa.getActivatingPlayer().getController().chooseColor(
"Choose a new color word", sa, possibleNewColors);
Localizer.getInstance().getMessage("lblChooseNewColor"), sa, possibleNewColors);
changedColorWordNew = TextUtil.capitalize(MagicColor.toLongString(newColor));
} else {
changedColorWordNew = changedColorWordsArray[1];

View File

@@ -14,6 +14,7 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
@@ -98,19 +99,9 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
final String targets = Lang.joinHomogenous(cards);
final String message;
if (sa.hasParam("OptionQuestion")) {
message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets);
message = TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets);
} else {
final StringBuilder sb = new StringBuilder();
sb.append("Move ");
sb.append(targets);
sb.append(" from ");
sb.append(Lang.joinHomogenous(origin));
sb.append(" to ");
sb.append(destination);
sb.append("?");
message = sb.toString();
message = Localizer.getInstance().getMessage("lblMoveTargetFromOriginToDestination", targets, Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME), destination.getTranslatedName());
}
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) {

View File

@@ -32,6 +32,8 @@ import forge.util.MessageUtil;
import forge.util.TextUtil;
import forge.util.collect.FCollection;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
import java.util.Map;
@@ -439,7 +441,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
hostCard.addRemembered(CardUtil.getLKICopy(tgtC));
}
final String prompt = TextUtil.concatWithSpace("Do you want to move", tgtC.toString(), "from", origin.toString(), "to", TextUtil.addSuffix(destination.toString(),"?"));
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantMoveTargetFromOriToDest", CardTranslation.getTranslatedName(tgtC.getName()), Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME), destination.getTranslatedName()));
if (optional && !player.getController().confirmAction(sa, null, prompt) )
continue;
@@ -503,7 +505,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), tgtC.getController(), tgtC);
}
if (!list.isEmpty()) {
Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a card to attach to.");
Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", tgtC.toString()));
tgtC.attachToEntity(attachedTo);
} else { // When it should enter the battlefield attached to an illegal permanent it fails
continue;
@@ -513,7 +515,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedToPlayer")) {
FCollectionView<Player> list = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AttachedToPlayer"), sa);
if (!list.isEmpty()) {
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a player to attach to.");
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectAPlayerAttachSourceTo", tgtC.toString()));
tgtC.attachToEntity(attachedTo);
}
else { // When it should enter the battlefield attached to an illegal player it fails
@@ -560,7 +562,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
} else {
defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + movedCard );
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(movedCard.getName())));
}
if (defender != null) {
combat.addAttacker(movedCard, defender);
@@ -727,7 +729,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final StringBuilder sb = new StringBuilder();
sb.append(sa.getParam("AlternativeMessage")).append(" ");
sb.append(altFetchList.size()).append(" cards match your searching type in Alternate Zones.");
sb.append(altFetchList.size()).append(" " + Localizer.getInstance().getMessage("lblCardMatchSearchingTypeInAlternateZones"));
if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneFromAltSource, sb.toString())) {
origin = alt;
@@ -749,7 +751,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final boolean optional = sa.hasParam("Optional");
if (optional) {
String message = MessageUtil.formatMessage(defined ? "Put that card from {player's} " + Lang.joinHomogenous(origin).toLowerCase() + " to " + destination.name().toLowerCase() : "Search {player's} " + Lang.joinHomogenous(origin).toLowerCase() + "?", decider, player);
String prompt;
if (defined) {
prompt = Localizer.getInstance().getMessage("lblPutThatCardFromPlayerOriginToDestination", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase(), destination.getTranslatedName().toLowerCase());
}
else {
prompt = Localizer.getInstance().getMessage("lblSearchPlayerZoneConfirm", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase());
}
String message = MessageUtil.formatMessage(prompt , decider, player);
if (!decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) {
return;
}
@@ -801,10 +810,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final int fetchNum = Math.min(player.getCardsIn(ZoneType.Library).size(), 4);
CardCollectionView shown = !decider.hasKeyword("LimitSearchLibrary") ? player.getCardsIn(ZoneType.Library) : player.getCardsIn(ZoneType.Library, fetchNum);
// Look at whole library before moving onto choosing a card
delayedReveal = new DelayedReveal(shown, ZoneType.Library, PlayerView.get(player), source.getName() + " - Looking at cards in ");
delayedReveal = new DelayedReveal(shown, ZoneType.Library, PlayerView.get(player), source.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " ");
}
else if (origin.contains(ZoneType.Hand) && player.isOpponentOf(decider)) {
delayedReveal = new DelayedReveal(player.getCardsIn(ZoneType.Hand), ZoneType.Hand, PlayerView.get(player), source.getName() + " - Looking at cards in ");
delayedReveal = new DelayedReveal(player.getCardsIn(ZoneType.Hand), ZoneType.Hand, PlayerView.get(player), source.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " ");
}
}
@@ -821,7 +830,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
continue;
}
SpellAbility tgtSA = decider.getController().getAbilityToPlay(tgtCard, sas);
if (!decider.getController().confirmAction(tgtSA, null, "Do you want to play " + tgtCard + "?")) {
if (!decider.getController().confirmAction(tgtSA, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())))) {
continue;
}
// if played, that card cannot be found
@@ -853,7 +862,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final boolean champion = sa.hasParam("Champion");
final boolean forget = sa.hasParam("ForgetChanged");
final boolean imprint = sa.hasParam("Imprint");
String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage("Select a card from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
String selectPrompt = sa.hasParam("SelectPrompt") ? sa.getParam("SelectPrompt") : MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
final String totalcmc = sa.getParam("WithTotalCMC");
int totcmc = AbilityUtils.calculateAmount(source, totalcmc, sa);
@@ -866,9 +875,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (! sa.hasParam("SelectPrompt")) {
// new default messaging for multi select
if (fetchList.size() > changeNum) {
selectPrompt = MessageUtil.formatMessage("Select up to " + changeNum + " cards from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
//Select up to %changeNum cards from %players %origin
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectUpToNumCardFromPlayerZone", String.valueOf(changeNum), "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
} else {
selectPrompt = MessageUtil.formatMessage("Select cards from {player's} " + Lang.joinHomogenous(origin).toLowerCase(), decider, player);
selectPrompt = MessageUtil.formatMessage(Localizer.getInstance().getMessage("lblSelectCardsFromPlayerZone", "{player's}", Lang.joinHomogenous(origin, ZoneType.Accessors.GET_TRANSLATED_NAME).toLowerCase()), decider, player);
}
}
// ensure that selection is within maximum allowed changeNum
@@ -930,7 +940,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (c == null) {
final int num = Math.min(fetchList.size(), changeNum - i);
String message = "Cancel Search? Up to " + num + " more card" + (num != 1 ? "s" : "") + " can be selected.";
String message = Localizer.getInstance().getMessage("lblCancelSearchUpToSelectNumCards", String.valueOf(num));
if (fetchList.isEmpty() || decider.getController().confirmAction(sa, PlayerActionConfirmMode.ChangeZoneGeneral, message)) {
break;
@@ -1001,7 +1011,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (!list.isEmpty()) {
Card attachedTo = null;
if (list.size() > 1) {
attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a card to attach to.");
attachedTo = decider.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", CardTranslation.getTranslatedName(c.getName())));
}
else {
attachedTo = list.get(0);
@@ -1019,7 +1029,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
if (sa.hasParam("AttachedToPlayer")) {
FCollectionView<Player> list = AbilityUtils.getDefinedPlayers(source, sa.getParam("AttachedToPlayer"), sa);
if (!list.isEmpty()) {
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a player to attach to.");
Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", CardTranslation.getTranslatedName(c.getName())));
c.attachToEntity(attachedTo);
}
else { // When it should enter the battlefield attached to an illegal permanent it fails
@@ -1042,7 +1052,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
} else {
defender = player.getController().chooseSingleEntityForEffect(e, sa, "Declare a defender for " + c );
defender = player.getController().chooseSingleEntityForEffect(e, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())));
}
if (defender != null) {
combat.addAttacker(c, defender);

View File

@@ -18,6 +18,7 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -82,7 +83,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
for (final String type : CardType.getBasicTypes()) {
final CardCollectionView cl = CardLists.getType(land, type);
if (!cl.isEmpty()) {
final String prompt = "Choose " + Lang.nounWithAmount(1, type);
final String prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.nounWithAmount(1, type);
Card c = p.getController().chooseSingleEntityForEffect(cl, sa, prompt, false);
if (c != null) {
chosen.add(c);
@@ -98,10 +99,10 @@ public class ChooseCardEffect extends SpellAbilityEffect {
int chosenP = 0;
while (!creature.isEmpty()) {
Card c = p.getController().chooseSingleEntityForEffect(creature, sa,
"Select creature(s) with total power less than or equal to " + (totP - chosenP - negativeNum)
+ "\r\n(Selected:" + chosenPool + ")\r\n" + "(Total Power: " + chosenP + ")", chosenP <= totP);
Localizer.getInstance().getMessage("lblSelectCreatureWithTotalPowerLessOrEqualTo", (totP - chosenP - negativeNum))
+ "\r\n(" + Localizer.getInstance().getMessage("lblSelected") + ":" + chosenPool + ")\r\n(" + Localizer.getInstance().getMessage("lblTotalPowerNum", chosenP) + ")", chosenP <= totP);
if (c == null) {
if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, "Cancel Choose?")) {
if (p.getController().confirmAction(sa, PlayerActionConfirmMode.OptionalChoose, Localizer.getInstance().getMessage("lblCancelChooseConfirm"))) {
break;
}
} else {
@@ -118,7 +119,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
if (sa.hasParam("AtRandom") && !choices.isEmpty()) {
Aggregates.random(choices, validAmount, chosen);
} else {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card ";
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
chosen.addAll(p.getController().chooseCardsForEffect(choices, sa, title, minAmount, validAmount, !sa.hasParam("Mandatory")));
}
}

View File

@@ -22,6 +22,7 @@ import forge.game.spellability.TargetRestrictions;
import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.ComparableOp;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -99,10 +100,11 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
}
}
Collections.sort(faces);
chosen = p.getController().chooseCardName(sa, faces, "Choose a card name");
chosen = p.getController().chooseCardName(sa, faces, Localizer.getInstance().getMessage("lblChooseACardName"));
} else {
// use CardFace because you might name a alternate name
final String message = validDesc.equals("card") ? "Name a card" : "Name a " + validDesc + " card.";
//"name a card" in mtg card oracle text is "choose a card name",change text
final String message = validDesc.equals("card") ? Localizer.getInstance().getMessage("lblChooseACardName") : Localizer.getInstance().getMessage("lblChooseASpecificCard", validDesc);
Predicate<ICardFace> cpp = Predicates.alwaysTrue();
if (sa.hasParam("ValidCards")) {
@@ -114,7 +116,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
host.setNamedCard(chosen);
if(!randomChoice) {
p.getGame().getAction().nofityOfValue(sa, host, p.getName() + " picked " + chosen, p);
p.getGame().getAction().nofityOfValue(sa, host, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
p.setNamedCard(chosen);
}
}

View File

@@ -7,6 +7,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.Arrays;
@@ -49,27 +50,25 @@ public class ChooseColorEffect extends SpellAbilityEffect {
List<String> chosenColors;
int cntMin = sa.hasParam("TwoColors") ? 2 : 1;
int cntMax = sa.hasParam("TwoColors") ? 2 : sa.hasParam("OrColors") ? colorChoices.size() : 1;
String prompt;
String prompt = null;
if (cntMax == 1) {
prompt = "Choose a color";
prompt = Localizer.getInstance().getMessage("lblChooseAColor");
}
else {
prompt = "Choose " + Lang.getNumeral(cntMin);
if (cntMax > cntMin) {
if (cntMax >= MagicColor.NUMBER_OR_COLORS) {
prompt += " or more";
} else {
prompt += " to " + Lang.getNumeral(cntMax);
}
if (cntMax >= MagicColor.NUMBER_OR_COLORS) {
prompt = Localizer.getInstance().getMessage("lblAtLastChooseNumColors", Lang.getNumeral(cntMin));
} else {
prompt = Localizer.getInstance().getMessage("lblChooseSpecifiedRangeColors", Lang.getNumeral(cntMin), Lang.getNumeral(cntMax));
}
}
prompt += " colors";
}
chosenColors = p.getController().chooseColors(prompt, sa, cntMin, cntMax, colorChoices);
if (chosenColors.isEmpty()) {
return;
}
card.setChosenColors(chosenColors);
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + Lang.joinHomogenous(chosenColors), p);
p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), Lang.joinHomogenous(chosenColors)), p);
}
}
}

View File

@@ -10,6 +10,7 @@ import forge.game.player.Player;
import forge.game.player.PlayerController.BinaryChoiceType;
import forge.game.spellability.SpellAbility;
import forge.util.collect.FCollection;
import forge.util.Localizer;
public class ChooseDirectionEffect extends SpellAbilityEffect {
@Override
@@ -18,11 +19,11 @@ public class ChooseDirectionEffect extends SpellAbilityEffect {
final Game game = source.getGame();
final FCollection<Player> left = new FCollection<>(game.getPlayers());
// TODO: We'd better set up turn order UI here
final String info = "Left (clockwise): " + left + "\r\nRight (anticlockwise):" + Lists.reverse(left);
final String info = Localizer.getInstance().getMessage("lblLeftClockwise") + ": " + left + "\r\n" + Localizer.getInstance().getMessage("lblRightAntiClockwise") + ":" + Lists.reverse(left);
sa.getActivatingPlayer().getController().notifyOfValue(sa, source, info);
boolean chosen = sa.getActivatingPlayer().getController().chooseBinary(sa,
"Choose a direction", BinaryChoiceType.LeftOrRight);
Localizer.getInstance().getMessage("lblChooseDirection"), BinaryChoiceType.LeftOrRight);
source.setChosenDirection(chosen ? Direction.Left : Direction.Right);
}
}

View File

@@ -9,6 +9,7 @@ import forge.game.event.GameEventCardModeChosen;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.List;
@@ -69,7 +70,7 @@ public class ChooseGenericEffect extends SpellAbilityEffect {
int idxChosen = MyRandom.getRandom().nextInt(abilities.size());
chosenSA = abilities.get(idxChosen);
} else {
chosenSA = p.getController().chooseSingleSpellForEffect(abilities, sa, "Choose one",
chosenSA = p.getController().chooseSingleSpellForEffect(abilities, sa, Localizer.getInstance().getMessage("lblChooseOne"),
ImmutableMap.of());
}

View File

@@ -10,6 +10,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
@@ -57,7 +58,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
chosen = MyRandom.getRandom().nextInt(max - min) + min;
p.getGame().getAction().nofityOfValue(sa, p, Integer.toString(chosen), null);
} else {
String title = sa.hasParam("ListTitle") ? sa.getParam("ListTitle") : "Choose a number";
String title = sa.hasParam("ListTitle") ? sa.getParam("ListTitle") : Localizer.getInstance().getMessage("lblChooseNumber");
if (anyNumber) {
Integer value = p.getController().announceRequirements(sa, title, true);
chosen = (value == null ? 0 : value);
@@ -72,7 +73,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
card.setChosenNumber(chosen);
}
if (sa.hasParam("Notify")) {
p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p);
p.getGame().getAction().nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
}
}
}
@@ -85,7 +86,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
for (Entry<Player, Integer> ev : chooseMap.entrySet()) {
int num = ev.getValue();
Player player = ev.getKey();
sb.append(player).append(" chose ").append(num);
sb.append(Localizer.getInstance().getMessage("lblPlayerChoseNum", player.getName(), String.valueOf(num)));
sb.append("\r\n");
if (num > highest) {
highestNum.clear();

View File

@@ -9,6 +9,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Aggregates;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import java.util.List;
@@ -37,7 +38,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect {
final FCollectionView<Player> choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers(
sa.getHostCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayersInTurnOrder();
final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a player";
final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChoosePlayer");
final boolean random = sa.hasParam("Random");
for (final Player p : tgtPlayers) {

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -134,7 +135,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
final CardCollection chosen = new CardCollection();
if (tgt == null || p.canBeTargetedBy(sa)) {
for (int i = 0; i < validAmount; i++) {
final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a source ";
final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseSource") + " ";
Card o = null;
do {
o = p.getController().chooseSingleEntityForEffect(sourcesToChooseFrom, sa, choiceTitle);

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.Map;
@@ -74,7 +75,7 @@ public class ClashEffect extends SpellAbilityEffect {
*/
final Card source = sa.getHostCard();
final Player player = source.getController();
final Player opponent = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(player.getOpponents(), sa, "Choose a opponent") ;
final Player opponent = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(player.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseOpponent")) ;
final ZoneType lib = ZoneType.Library;
if (sa.hasParam("RememberClasher")) {
@@ -110,11 +111,11 @@ public class ClashEffect extends SpellAbilityEffect {
// TODO: Split cards will return two CMC values, so both players may become winners of clash
reveal.append(player).append(" reveals: ").append(pCard.getName()).append(". CMC = ").append(pCMC);
reveal.append(player).append(" " + Localizer.getInstance().getMessage("lblReveals") + ": ").append(pCard.getName()).append(". " + Localizer.getInstance().getMessage("lblCMC") + "= ").append(pCMC);
reveal.append("\r\n");
reveal.append(opponent).append(" reveals: ").append(oCard.getName()).append(". CMC = ").append(oCMC);
reveal.append(opponent).append(" " + Localizer.getInstance().getMessage("lblReveals") + ": ").append(oCard.getName()).append(". " + Localizer.getInstance().getMessage("lblCMC") + "= ").append(oCMC);
reveal.append("\r\n\r\n");
reveal.append(player).append(pCMC > oCMC ? " wins clash." : " loses clash.");
reveal.append(player).append(pCMC > oCMC ? " " + Localizer.getInstance().getMessage("lblWinsClash") + "." : " " + Localizer.getInstance().getMessage("lblLosesClash") + ".");
player.getGame().getAction().nofityOfValue(sa, source, reveal.toString(), null);
clashMoveToTopOrBottom(player, pCard, sa);

View File

@@ -9,6 +9,8 @@ import forge.game.event.GameEventCardStatsChanged;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Arrays;
import java.util.List;
@@ -78,7 +80,7 @@ public class CloneEffect extends SpellAbilityEffect {
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card ";
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
cardToCopy = activator.getController().chooseSingleEntityForEffect(choices, sa, title, false);
} else if (sa.hasParam("Defined")) {
List<Card> cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
@@ -93,7 +95,7 @@ public class CloneEffect extends SpellAbilityEffect {
}
final boolean optional = sa.hasParam("Optional");
if (optional && !host.getController().getController().confirmAction(sa, null, "Do you want to copy " + cardToCopy + "?")) {
if (optional && !host.getController().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantCopy", CardTranslation.getTranslatedName(cardToCopy.getName())))) {
return;
}

View File

@@ -7,6 +7,7 @@ import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
@@ -35,9 +36,9 @@ public class ControlExchangeVariantEffect extends SpellAbilityEffect {
CardCollectionView list2 = AbilityUtils.filterListByType(player2.getCardsIn(zone), type, sa);
int max = Math.min(list1.size(), list2.size());
// choose the same number of cards
CardCollectionView chosen1 = activator.getController().chooseCardsForEffect(list1, sa, "Choose cards: " + player1, 0, max, true);
CardCollectionView chosen1 = activator.getController().chooseCardsForEffect(list1, sa, Localizer.getInstance().getMessage("lblChooseCards") + ":" + player1, 0, max, true);
int num = chosen1.size();
CardCollectionView chosen2 = activator.getController().chooseCardsForEffect(list2, sa, "Choose cards: " + player2, num, num, true);
CardCollectionView chosen2 = activator.getController().chooseCardsForEffect(list2, sa, Localizer.getInstance().getMessage("lblChooseCards") + ":" + player2, num, num, true);
// check all cards can be controlled by the other player
for (final Card c : chosen1) {
if (!c.canBeControlledBy(player2)) {

View File

@@ -22,6 +22,8 @@ import forge.game.spellability.Ability;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import forge.util.CardTranslation;
public class ControlGainEffect extends SpellAbilityEffect {
/* (non-Javadoc)
@@ -227,7 +229,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
final FCollectionView<GameEntity> e = combat.getDefenders();
final GameEntity defender = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(e, sa,
"Declare a defender for " + tgtC);
Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(tgtC.getName())));
if (defender != null) {
combat.addAttacker(tgtC, defender);

View File

@@ -27,6 +27,8 @@ import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.PredicateString.StringOp;
import forge.util.Localizer;
import forge.util.CardTranslation;
import org.apache.commons.lang3.StringUtils;
@@ -64,7 +66,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
final long timestamp = game.getNextTimestamp();
if (sa.hasParam("Optional")) {
if (!activator.getController().confirmAction(sa, null, "Copy this permanent?")) {
if (!activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblCopyPermanentConfirm"))) {
return;
}
}
@@ -145,7 +147,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
if (!choices.isEmpty()) {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card ";
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") +" ";
Card choosen = chooser.getController().chooseSingleEntityForEffect(choices, sa, title, false);
@@ -206,12 +208,12 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
GameEntity defender;
if ("True".equals(attacked)) {
FCollectionView<GameEntity> defs = game.getCombat().getDefenders();
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())), false);
} else {
defender = AbilityUtils.getDefinedPlayers(host, sa.getParam("CopyAttacking"), sa).get(0);
if (sa.hasParam("ChoosePlayerOrPlaneswalker") && defender != null) {
FCollectionView<GameEntity> defs = game.getCombat().getDefendersControlledBy((Player) defender);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c + " {defender: "+ defender + "}", false);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())) + " {" + Localizer.getInstance().getMessage("lblDefender") + ": " + defender + "}", false);
}
}
game.getCombat().addAttacker(copyInPlay, defender);
@@ -243,7 +245,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copyInPlay.getController(), copyInPlay);
}
if (!list.isEmpty()) {
Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to.");
Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectACardAttachSourceTo", copyInPlay.toString()));
copyInPlay.attachToEntity(attachedTo);
} else {

View File

@@ -15,6 +15,8 @@ import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.ArrayList;
import java.util.Iterator;
@@ -66,7 +68,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
}
boolean isOptional = sa.hasParam("Optional");
if (isOptional && !controller.getController().confirmAction(sa, null, "Do you want to copy the spell " + card + "?")) {
if (isOptional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantCopyTheSpell", CardTranslation.getTranslatedName(card.getName())))) {
return;
}
@@ -84,7 +86,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
final int spellCount = Integer.parseInt(sa.getParam("CopyMultipleSpells"));
for (int multi = 0; multi < spellCount && !tgtSpells.isEmpty(); multi++) {
String prompt = "Select " + Lang.getOrdinal(multi + 1) + " spell to copy to stack";
String prompt = Localizer.getInstance().getMessage("lblSelectMultiSpellCopyToStack", Lang.getOrdinal(multi + 1));
SpellAbility chosen = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa, prompt,
ImmutableMap.of());
SpellAbility copiedSpell = CardFactory.copySpellAbilityAndPossiblyHost(card, chosen.getHostCard(), chosen, true);
@@ -96,7 +98,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
}
else if (sa.hasParam("CopyForEachCanTarget")) {
SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa,
"Select a spell to copy", ImmutableMap.of());
Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of());
chosenSA.setActivatingPlayer(controller);
// Find subability or rootability that has targets
SpellAbility targetedSA = chosenSA;
@@ -144,7 +146,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
valid.remove(originalTarget);
mayChooseNewTargets = false;
if (sa.hasParam("ChooseOnlyOne")) {
Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, "Choose one");
Card choice = controller.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseOne"));
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true);
resetFirstTargetOnCopy(copy, choice, targetedSA);
copies.add(copy);
@@ -164,7 +166,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
}
else {
SpellAbility chosenSA = controller.getController().chooseSingleSpellForEffect(tgtSpells, sa,
"Select a spell to copy", ImmutableMap.of());
Localizer.getInstance().getMessage("lblSelectASpellCopy"), ImmutableMap.of());
chosenSA.setActivatingPlayer(controller);
for (int i = 0; i < amount; i++) {
SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost(

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.SpellPermanent;
import forge.game.trigger.TriggerType;
import forge.util.Localizer;
import java.util.Arrays;
import java.util.List;
@@ -174,7 +175,7 @@ public class CounterEffect extends SpellAbilityEffect {
String destination = srcSA.hasParam("Destination") ? srcSA.getParam("Destination") : tgtSA.isAftermath() ? "Exile" : "Graveyard";
if (srcSA.hasParam("DestinationChoice")) {//Hinder
List<String> pos = Arrays.asList(srcSA.getParam("DestinationChoice").split(","));
destination = srcSA.getActivatingPlayer().getController().chooseSomeType("a destination to remove", tgtSA, pos, null);
destination = srcSA.getActivatingPlayer().getController().chooseSomeType(Localizer.getInstance().getMessage("lblRemoveDestination"), tgtSA, pos, null);
}
if (tgtSA.isAbility()) {
// For Ability-targeted counterspells - do not move it anywhere,

View File

@@ -12,6 +12,8 @@ import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.List;
import java.util.Map;
@@ -109,10 +111,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
// only select cards if the counterNum is any
if (counterNum.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append("Choose cards to take ").append(cType.getName()).append(" counters from");
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseTakeCountersCard", cType.getName()), 0, srcCards.size(), true);
}
for (Card src : srcCards) {
@@ -134,10 +133,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", src);
params.put("Target", dest);
StringBuilder sb = new StringBuilder();
sb.append("Take how many ").append(cType.getName());
sb.append(" counters from ").append(src).append("?");
cnum = player.getController().chooseNumber(sa, sb.toString(), 0, cmax, params);
cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), CardTranslation.getTranslatedName(src.getName())), 0, cmax, params);
} else {
cnum = AbilityUtils.calculateAmount(host, counterNum, sa);
}
@@ -171,12 +167,8 @@ public class CountersMoveEffect extends SpellAbilityEffect {
tgtCards = CardLists.getValidCards(tgtCards, sa.getParam("ValidDefined"), player, host, sa);
if (counterNum.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append("Choose cards to get ").append(cType.getName());
sb.append(" counters from ").append(source).append(".");
tgtCards = player.getController().chooseCardsForEffect(
tgtCards, sa, sb.toString(), 0, tgtCards.size(), true);
tgtCards = player.getController().chooseCardsForEffect(tgtCards, sa,
Localizer.getInstance().getMessage("lblChooseCardToGetCountersFrom", cType.getName(), CardTranslation.getTranslatedName(source.getName())), 0, tgtCards.size(), true);
}
boolean updateSource = false;
@@ -200,9 +192,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", source);
params.put("Target", cur);
StringBuilder sb = new StringBuilder();
sb.append("Put how many ").append(cType.getName()).append(" counters on ").append(cur).append("?");
int cnum = player.getController().chooseNumber(sa, sb.toString(), 0, source.getCounters(cType), params);
int cnum = player.getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblPutHowManyTargetCounterOnCard", cType.getName(), CardTranslation.getTranslatedName(cur.getName())), 0, source.getCounters(cType), params);
if (cnum > 0) {
source.subtractCounter(cType, cnum);
@@ -260,10 +250,7 @@ public class CountersMoveEffect extends SpellAbilityEffect {
params.put("CounterType", cType);
params.put("Source", source);
params.put("Target", cur);
StringBuilder sb = new StringBuilder();
sb.append("Take how many ").append(cType.getName());
sb.append(" counters from ").append(source).append("?");
cntToMove = pc.chooseNumber(sa, sb.toString(), 0, cntToMove, params);
cntToMove = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounterFromCard", cType.getName(), CardTranslation.getTranslatedName(source.getName())), 0, cntToMove, params);
}
if (source.getCounters(cType) >= cntToMove) {
@@ -289,17 +276,15 @@ public class CountersMoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Source", source);
params.put("Target", dest);
String title = "Select type counters to remove";
String title = Localizer.getInstance().getMessage("lblSelectRemoveCounterType");
CounterType chosenType = pc.chooseCounterType(typeChoices, sa, title, params);
params = Maps.newHashMap();
params.put("CounterType", chosenType);
params.put("Source", source);
params.put("Target", dest);
StringBuilder sb = new StringBuilder();
sb.append("Take how many ").append(chosenType.getName()).append(" counters?");
int chosenAmount = pc.chooseNumber(
sa, sb.toString(), 0, Math.min(tgtCounters.get(chosenType), cntToMove), params);
int chosenAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblTakeHowManyTargetCounters", chosenType.getName()),
0, Math.min(tgtCounters.get(chosenType), cntToMove), params);
if (chosenAmount > 0) {
dest.addCounter(chosenType, chosenAmount, player, true, table);

View File

@@ -14,6 +14,7 @@ import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
import forge.util.Localizer;
import java.util.List;
@@ -42,7 +43,7 @@ public class CountersProliferateEffect extends SpellAbilityEffect {
list.addAll(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.hasCounters()));
List<GameEntity> result = pc.chooseEntitiesForEffect(list, 0, list.size(), null, sa,
"Choose any number of permanents and/or players for proliferate", p);
Localizer.getInstance().getMessage("lblChooseProliferateTarget"), p);
GameEntityCounterTable table = new GameEntityCounterTable();
for (final GameEntity ge : result) {

View File

@@ -26,6 +26,8 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
import forge.util.CardTranslation;
import java.util.Map;
import java.util.Iterator;
@@ -129,7 +131,7 @@ public class CountersPutEffect extends SpellAbilityEffect {
if (sa.hasParam("Bolster")) {
CardCollection creatsYouCtrl = CardLists.filter(activator.getCardsIn(ZoneType.Battlefield), Presets.CREATURES);
CardCollection leastToughness = new CardCollection(Aggregates.listWithMin(creatsYouCtrl, CardPredicates.Accessors.fnGetDefense));
tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, "Choose a creature with the least toughness", 1, 1, false));
tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false));
tgtObjects.addAll(tgtCards);
} else {
tgtObjects.addAll(getDefinedOrTargeted(sa, "Defined"));
@@ -183,7 +185,7 @@ public class CountersPutEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", obj);
StringBuilder sb = new StringBuilder();
sb.append("Select counter type to add to ");
sb.append(Localizer.getInstance().getMessage("lblSelectCounterTypeAddTo") + " ");
sb.append(obj);
counterType = pc.chooseCounterType(choices, sa, sb.toString(), params);
}
@@ -199,7 +201,7 @@ public class CountersPutEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", obj);
params.put("CounterType", counterType);
counterAmount = pc.chooseNumber(sa, "How many counters?", 0, counterAmount, params);
counterAmount = pc.chooseNumber(sa, Localizer.getInstance().getMessage("lblHowManyCounters"), 0, counterAmount, params);
}
// Adapt need extra logic
@@ -235,8 +237,8 @@ public class CountersPutEffect extends SpellAbilityEffect {
continue;
}
String message = "Do you want to put " + counterAmount + " +1/+1 counters on " + gameCard + " ?";
Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, "Choose an opponent");
String message = Localizer.getInstance().getMessage("lblDoYouWantPutTargetP1P1CountersOnCard", String.valueOf(counterAmount), CardTranslation.getTranslatedName(gameCard.getName()));
Player chooser = pc.chooseSingleEntityForEffect(activator.getOpponents(), sa, Localizer.getInstance().getMessage("lblChooseAnOpponent"));
if (chooser.getController().confirmAction(sa, PlayerActionConfirmMode.Tribute, message)) {
gameCard.setTributed(true);

View File

@@ -13,6 +13,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -97,11 +98,11 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
list = Lists.newArrayList(ctype);
}
String prompt = "Select type of counters to add or remove";
String prompt = Localizer.getInstance().getMessage("lblSelectCounterTypeToAddOrRemove");
CounterType chosenType = pc.chooseCounterType(list, sa, prompt, params);
params.put("CounterType", chosenType);
prompt = "What to do with that '" + chosenType.getName() + "' counter ";
prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", chosenType.getName()) + " ";
Boolean putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params);
if (putCounter) {

View File

@@ -13,6 +13,7 @@ import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.Map;
@@ -84,8 +85,8 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
}
if (sa.hasParam("Optional")) {
String ctrs = cntToRemove > 1 ? "counters" : num.equals("All") ? "all counters" : "a counter";
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, "Remove " + ctrs + "?")) {
String ctrs = cntToRemove > 1 ? Localizer.getInstance().getMessage("lblCounters") : num.equals("All") ? Localizer.getInstance().getMessage("lblAllCounters") : Localizer.getInstance().getMessage("lblACounters");
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRemove") + " " + ctrs + "?")) {
return;
}
}
@@ -129,10 +130,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
srcCards = game.getCardsIn(ZoneType.Battlefield);
srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa);
if (num.equals("Any")) {
StringBuilder sb = new StringBuilder();
sb.append("Choose cards to take ").append(counterType.getName()).append(" counters from");
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true);
srcCards = player.getController().chooseCardsForEffect(srcCards, sa, Localizer.getInstance().getMessage("lblChooseCardsToTakeTargetCounters", counterType.getName()), 0, srcCards.size(), true);
}
} else {
srcCards = getTargetCards(sa);
@@ -172,7 +170,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", gameCard);
params.put("CounterType", type);
String title = "Select the number of " + type + " counters to remove";
String title = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", type);
cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params);
}
@@ -213,10 +211,10 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
Map<String, Object> params = Maps.newHashMap();
params.put("Target", entity);
String prompt = "Select type of counters to remove";
String prompt = Localizer.getInstance().getMessage("lblSelectCountersTypeToRemove");
CounterType chosenType = pc.chooseCounterType(
ImmutableList.copyOf(tgtCounters.keySet()), sa, prompt, params);
prompt = "Select the number of " + chosenType.getName() + " counters to remove";
prompt = Localizer.getInstance().getMessage("lblSelectRemoveCountersNumberOfTarget", chosenType.getName());
int max = Math.min(cntToRemove, tgtCounters.get(chosenType));
params = Maps.newHashMap();
params.put("Target", entity);

View File

@@ -13,6 +13,7 @@ import forge.game.card.CardUtil;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
@@ -83,7 +84,7 @@ public class DamageDealEffect extends DamageBaseEffect {
List<GameObject> tgts = getTargets(sa);
if (sa.hasParam("OptionalDecider")) {
Player decider = Iterables.getFirst(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("OptionalDecider"), sa), null);
if (decider != null && !decider.getController().confirmAction(sa, null, "Do you want to deal " + dmg + " damage to " + tgts + " ?")) {
if (decider != null && !decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantDealTargetDamageToTarget", String.valueOf(dmg), tgts.toString()))) {
return;
}
}

View File

@@ -22,6 +22,8 @@ import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
import forge.util.Localizer;
import java.util.*;
@@ -99,13 +101,6 @@ public class DigEffect extends SpellAbilityEffect {
final TargetRestrictions tgt = sa.getTargetRestrictions();
final List<Player> tgtPlayers = getTargetPlayers(sa);
if (sa.hasParam("Choser")) {
final List<Player> choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Choser"), sa);
if (!choosers.isEmpty()) {
chooser = choosers.get(0);
}
}
CardZoneTable table = new CardZoneTable();
GameEntityCounterTable counterTable = new GameEntityCounterTable();
for (final Player p : tgtPlayers) {
@@ -128,7 +123,7 @@ public class DigEffect extends SpellAbilityEffect {
game.getAction().reveal(top, p, false);
}
else if (sa.hasParam("RevealOptional")) {
String question = TextUtil.concatWithSpace("Reveal:", TextUtil.addSuffix(Lang.joinHomogenous(top),"?"));
String question = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblReveal") + ":", TextUtil.addSuffix(Lang.joinHomogenous(top),"?"));
hasRevealed = p.getController().confirmAction(sa, null, question);
if (hasRevealed) {
@@ -151,7 +146,7 @@ public class DigEffect extends SpellAbilityEffect {
}
else if (!sa.hasParam("NoLooking")) {
// show the user the revealed cards
delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), host.getName() + " - Looking at cards in ");
delayedReveal = new DelayedReveal(top, srcZone, PlayerView.get(p), host.getName() + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " ");
if (noMove) {
// Let the activating player see the cards even if they're not moved
@@ -164,7 +159,15 @@ public class DigEffect extends SpellAbilityEffect {
host.addRemembered(one);
}
}
if (sa.hasParam("Choser")) {
final FCollectionView<Player> choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Choser"), sa);
if (!choosers.isEmpty()) {
chooser = player.getController().chooseSingleEntityForEffect(choosers, sa, "Choser:");
}
if (sa.hasParam("SetChosenPlayer")) {
host.setChosenPlayer(chooser);
}
}
if (!noMove) {
CardCollection movedCards;
rest.addAll(top);
@@ -194,7 +197,7 @@ public class DigEffect extends SpellAbilityEffect {
// Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple)
if (optional && mayBeSkipped && !valid.isEmpty()) {
String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : "Would you like to proceed with the optional ability for " + sa.getHostCard() + "?\n\n(" + sa.getDescription() + ")";
String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + sa.getHostCard() + "?\n\n(" + sa.getDescription() + ")";
if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", sa.getHostCard().getName()))) {
return;
}
@@ -214,24 +217,24 @@ public class DigEffect extends SpellAbilityEffect {
}
for (final byte pair : MagicColor.COLORPAIR) {
Card chosen = chooser.getController().chooseSingleEntityForEffect(CardLists.filter(valid, CardPredicates.isExactlyColor(pair)),
delayedReveal, sa, "Choose one", false, p);
delayedReveal, sa, Localizer.getInstance().getMessage("lblChooseOne"), false, p);
if (chosen != null) {
movedCards.add(chosen);
}
}
chooser.getController().endTempShowCards();
if (!movedCards.isEmpty()) {
game.getAction().reveal(movedCards, chooser, true, chooser + " picked ");
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedChosen", chooser.getName(), ""));
}
}
else if (allButOne) {
movedCards = new CardCollection(valid);
String prompt;
if (destZone2.equals(ZoneType.Library) && libraryPosition2 == 0) {
prompt = "Choose a card to leave on top of {player's} library";
prompt = Localizer.getInstance().getMessage("lblChooseACardToLeaveTargetLibraryTop", "{player's}");
}
else {
prompt = "Choose a card to leave in {player's} " + destZone2.name();
prompt = Localizer.getInstance().getMessage("lblChooseACardLeaveTarget", "{player's}", destZone2.getTranslatedName());
}
Card chosen = chooser.getController().chooseSingleEntityForEffect(valid, delayedReveal, sa, prompt, false, p);
@@ -245,19 +248,19 @@ public class DigEffect extends SpellAbilityEffect {
if (sa.hasParam("PrimaryPrompt")) {
prompt = sa.getParam("PrimaryPrompt");
} else {
prompt = "Choose card(s) to put into " + destZone1.name();
prompt = Localizer.getInstance().getMessage("lblChooseCardsPutIntoZone", destZone1.getTranslatedName());
if (destZone1.equals(ZoneType.Library)) {
if (libraryPosition == -1) {
prompt = "Choose card(s) to put on the bottom of {player's} library";
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayBottom", "{player's}");
} else if (libraryPosition == 0) {
prompt = "Choose card(s) to put on top of {player's} library";
prompt = Localizer.getInstance().getMessage("lblChooseCardPutOnTargetLibarayTop", "{player's}");
}
}
}
movedCards = new CardCollection();
if (valid.isEmpty()) {
chooser.getController().notifyOfValue(sa, null, "No valid cards");
chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards"));
} else {
if ( p == chooser ) { // the digger can still see all the dug cards when choosing
chooser.getController().tempShowCards(top);
@@ -275,8 +278,7 @@ public class DigEffect extends SpellAbilityEffect {
}
if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) {
game.getAction().reveal(movedCards, chooser, true,
chooser + " picked " + (movedCards.size() == 1 ? "this card" : "these cards") + " from ");
game.getAction().reveal(movedCards, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
}
}
if (sa.hasParam("ForgetOtherRemembered")) {

View File

@@ -16,6 +16,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
public class DigMultipleEffect extends SpellAbilityEffect {
@@ -74,15 +75,14 @@ public class DigMultipleEffect extends SpellAbilityEffect {
}
if (validMap.isEmpty()) {
chooser.getController().notifyOfValue(sa, null, "No valid cards");
chooser.getController().notifyOfValue(sa, null, Localizer.getInstance().getMessage("lblNoValidCards"));
continue;
}
CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, "Choose cards");
CardCollection chosen = chooser.getController().chooseCardsForEffectMultiple(validMap, sa, Localizer.getInstance().getMessage("lblChooseCards"));
if (!chosen.isEmpty()) {
game.getAction().reveal(chosen, chooser, true,
chooser + " picked " + (chosen.size() == 1 ? "this card" : "these cards") + " from ");
game.getAction().reveal(chosen, chooser, true, Localizer.getInstance().getMessage("lblPlayerPickedCardFrom", chooser.getName()));
}
for (Card c : chosen) {

View File

@@ -11,6 +11,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.*;
@@ -86,6 +87,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
int untilAmount = 1;
if (sa.hasParam("Amount")) {
untilAmount = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa);
if (untilAmount == 0) return;
}
Integer maxRevealed = null;
@@ -113,7 +115,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
continue;
}
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
if (optional && !p.getController().confirmAction(sa, null, "Do you want to dig your library?")) {
if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDigYourLibrary"))) {
continue;
}
CardCollection found = new CardCollection();
@@ -159,7 +161,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
final Card c = itr.next();
final ZoneType origin = c.getZone().getZoneType();
if (optionalFound && !p.getController().confirmAction(sa, null,
"Do you want to put that card to " + foundDest.name() + "?")) {
Localizer.getInstance().getMessage("lblDoYouWantPutCardToZone", foundDest.getTranslatedName()))) {
continue;
} else {
Card m = null;

View File

@@ -15,6 +15,7 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -205,7 +206,7 @@ public class DiscardEffect extends SpellAbilityEffect {
if (!p.canDiscardBy(sa)) {
continue;
}
String message = "Would you like to discard " + numCards + " random card(s)?";
String message = Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", String.valueOf(numCards));
boolean runDiscard = !sa.hasParam("Optional") || p.getController().confirmAction(sa, PlayerActionConfirmMode.Random, message);
if (runDiscard) {
@@ -257,7 +258,7 @@ public class DiscardEffect extends SpellAbilityEffect {
final CardCollectionView dPHand = p.getCardsIn(ZoneType.Hand);
for (final Player opp : p.getAllOtherPlayers()) {
opp.getController().reveal(dPHand, ZoneType.Hand, p, "Reveal ");
opp.getController().reveal(dPHand, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblReveal") + " ");
}
if (!p.canDiscardBy(sa)) {
@@ -325,8 +326,7 @@ public class DiscardEffect extends SpellAbilityEffect {
}
if (mode.startsWith("Reveal") ) {
p.getController().reveal(toBeDiscarded, ZoneType.Hand, p,
chooser + " has chosen " + (toBeDiscarded.size() == 1 ? "this card" : "these cards") + " from ");
p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblPlayerHasChosenCardsFrom", chooser.getName()));
}
for (Card card : toBeDiscarded) {
if (card == null) { continue; }

View File

@@ -8,6 +8,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
@@ -49,12 +50,12 @@ public class DrawEffect extends SpellAbilityEffect {
for (final Player p : getDefinedPlayersOrTargeted(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa))
if (optional && !p.getController().confirmAction(sa, null, "Do you want to draw " + Lang.nounWithAmount(numCards, " card") + "?"))
if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantDrawCards", Lang.nounWithAmount(numCards, " card"))))
continue;
int actualNum = numCards;
if (upto) {
actualNum = p.getController().chooseNumber(sa, "How may cards do you want to draw?", 0, numCards);
actualNum = p.getController().chooseNumber(sa, "lblHowMayCardDoYouWantDraw", 0, numCards);
}
final CardCollectionView drawn = p.drawCards(actualNum);

View File

@@ -8,6 +8,8 @@ import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import forge.util.CardTranslation;
public class EncodeEffect extends SpellAbilityEffect {
@Override
@@ -44,9 +46,7 @@ public class EncodeEffect extends SpellAbilityEffect {
// Handle choice of whether or not to encoded
final StringBuilder sb = new StringBuilder();
sb.append("Do you want to exile ").append(host).append(" and encode it onto a creature you control?");
if (!player.getController().confirmAction(sa, null, sb.toString())) {
if (!player.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantExileCardAndEncodeOntoYouCreature", CardTranslation.getTranslatedName(host.getName())))) {
return;
}
@@ -54,10 +54,10 @@ public class EncodeEffect extends SpellAbilityEffect {
Card movedCard = game.getAction().moveTo(ZoneType.Exile, host, sa);
// choose a creature
Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, "Choose a creature you control to encode ", true);
Card choice = player.getController().chooseSingleEntityForEffect(choices, sa, Localizer.getInstance().getMessage("lblChooseACreatureYouControlToEncode") + " ", true);
if (choice == null) {
return;
return;
}
StringBuilder codeLog = new StringBuilder();

View File

@@ -14,6 +14,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
@@ -54,7 +55,7 @@ public class ExploreEffect extends SpellAbilityEffect {
boolean revealedLand = false;
CardCollection top = pl.getTopXCardsFromLibrary(1);
if (!top.isEmpty()) {
game.getAction().reveal(top, pl, false, "Revealed for Explore - ");
game.getAction().reveal(top, pl, false, Localizer.getInstance().getMessage("lblRevealedForExplore") + " - ");
final Card r = top.getFirst();
if (r.isLand()) {
game.getAction().moveTo(ZoneType.Hand, r, sa);
@@ -63,7 +64,7 @@ public class ExploreEffect extends SpellAbilityEffect {
// TODO find better way to choose optional send away
final Card choosen = pc.chooseSingleCardForZoneChange(
ZoneType.Graveyard, Lists.newArrayList(ZoneType.Library), sa, top, null,
"Put this card in your graveyard?", true, pl);
Localizer.getInstance().getMessage("lblPutThisCardToYourGraveyard"), true, pl);
if (choosen != null) {
game.getAction().moveTo(ZoneType.Graveyard, choosen, sa);
}

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.MyRandom;
import forge.util.Localizer;
import java.util.HashSet;
import java.util.List;
@@ -163,7 +164,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
if (result) {
numSuccesses++;
}
flipper.getGame().getAction().nofityOfValue(sa, flipper, result ? "heads" : "tails", null);
flipper.getGame().getAction().nofityOfValue(sa, flipper, result ? Localizer.getInstance().getMessage("lblHeads") : Localizer.getInstance().getMessage("lblTails"), null);
} while (sa.hasParam("FlipUntilYouLose") && result != false);
if (sa.hasParam("FlipUntilYouLose") && sa.hasAdditionalAbility("LoseSubAbility")) {
@@ -193,7 +194,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
do {
Set<Boolean> flipResults = new HashSet<>();
final boolean choice = caller.getController().chooseBinary(sa, sa.getHostCard().getName() + " - Call coin flip", PlayerController.BinaryChoiceType.HeadsOrTails);
final boolean choice = caller.getController().chooseBinary(sa, sa.getHostCard().getName() + " - " + Localizer.getInstance().getMessage("lblCallCoinFlip"), PlayerController.BinaryChoiceType.HeadsOrTails);
for (int i = 0; i < multiplier; i++) {
flipResults.add(MyRandom.getRandom().nextBoolean());
}
@@ -206,7 +207,7 @@ public class FlipCoinEffect extends SpellAbilityEffect {
numSuccesses++;
}
caller.getGame().getAction().nofityOfValue(sa, caller, wonFlip ? "win" : "lose", null);
caller.getGame().getAction().nofityOfValue(sa, caller, wonFlip ? Localizer.getInstance().getMessage("lblWin") : Localizer.getInstance().getMessage("lblLose"), null);
// Run triggers
final Map<AbilityKey, Object> runParams = AbilityKey.newMap();

View File

@@ -5,6 +5,7 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +35,7 @@ public class LifeSetEffect extends SpellAbilityEffect {
if (!redistribute) {
p.setLife(lifeAmount, sa.getHostCard());
} else {
int life = sa.getActivatingPlayer().getController().chooseNumber(sa, "Life Total: " + p, lifetotals, p);
int life = sa.getActivatingPlayer().getController().chooseNumber(sa, Localizer.getInstance().getMessage("lblLifeTotal") + ": " + p, lifetotals, p);
p.setLife(life, sa.getHostCard());
lifetotals.remove((Integer) life);
}

View File

@@ -17,6 +17,7 @@ import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
@@ -39,7 +40,7 @@ public class ManaEffect extends SpellAbilityEffect {
final boolean optional = sa.hasParam("Optional");
final Game game = sa.getActivatingPlayer().getGame();
if (optional && !sa.getActivatingPlayer().getController().confirmAction(sa, null, "Do you want to add mana?")) {
if (optional && !sa.getActivatingPlayer().getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantAddMana"))) {
return;
}
@@ -91,7 +92,7 @@ public class ManaEffect extends SpellAbilityEffect {
// just use the first possible color.
choice = colorsProduced[differentChoice ? nMana : 0];
} else {
byte chosenColor = activator.getController().chooseColor("Select Mana to Produce", sa,
byte chosenColor = activator.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa,
differentChoice ? fullOptions : colorOptions);
if (chosenColor == 0)
throw new RuntimeException("ManaEffect::resolve() /*combo mana*/ - " + activator + " color mana choice is empty for " + card.getName());
@@ -111,7 +112,7 @@ public class ManaEffect extends SpellAbilityEffect {
return;
}
game.action.nofityOfValue(sa, card, activator + " picked " + choiceString, activator);
game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", activator.getName(), choiceString), activator);
abMana.setExpressChoice(choiceString.toString());
}
}
@@ -135,13 +136,13 @@ public class ManaEffect extends SpellAbilityEffect {
mask |= MagicColor.fromName(colorsNeeded.charAt(nChar));
}
colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask);
byte val = p.getController().chooseColor("Select Mana to Produce", sa, colorMenu);
byte val = p.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (0 == val) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + act + " color mana choice is empty for " + card.getName());
}
choice = MagicColor.toShortString(val);
game.action.nofityOfValue(sa, card, act + " picked " + choice, act);
game.action.nofityOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", act.getName(), choice), act);
abMana.setExpressChoice(choice);
}
}
@@ -172,7 +173,7 @@ public class ManaEffect extends SpellAbilityEffect {
if (cs.isMonoColor())
sb.append(MagicColor.toShortString(s.getColorMask()));
else /* (cs.isMulticolor()) */ {
byte chosenColor = sa.getActivatingPlayer().getController().chooseColor("Choose a single color from " + s.toString(), sa, cs);
byte chosenColor = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblChooseSingleColorFromTarget", s.toString()), sa, cs);
sb.append(MagicColor.toShortString(chosenColor));
}
}

View File

@@ -8,6 +8,7 @@ import forge.game.card.CardUtil;
import forge.game.player.Player;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
import java.util.Collection;
import java.util.List;
@@ -68,7 +69,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
}
if (mask == 0 && !expressChoiceColors.isEmpty() && colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless("Select Mana to Produce", sa.getHostCard(), ColorSet.fromMask(mask)));
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromMask(mask)));
} else {
// Nothing set previously so ask player if needed
if (mask == 0) {
@@ -78,14 +79,14 @@ public class ManaReflectedEffect extends SpellAbilityEffect {
baseMana = MagicColor.toShortString(colors.iterator().next());
} else {
if (colors.contains("colorless")) {
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless("Select Mana to Produce", sa.getHostCard(), ColorSet.fromNames(colors)));
baseMana = MagicColor.toShortString(player.getController().chooseColorAllowColorless(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa.getHostCard(), ColorSet.fromNames(colors)));
} else {
baseMana = MagicColor.toShortString(player.getController().chooseColor("Select Mana to Produce", sa, ColorSet.fromNames(colors)));
baseMana = MagicColor.toShortString(player.getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, ColorSet.fromNames(colors)));
}
}
} else {
colorMenu = ColorSet.fromMask(mask);
byte color = sa.getActivatingPlayer().getController().chooseColor("Select Mana to Produce", sa, colorMenu);
byte color = sa.getActivatingPlayer().getController().chooseColor(Localizer.getInstance().getMessage("lblSelectManaProduce"), sa, colorMenu);
if (color == 0) {
System.err.println("Unexpected behavior in ManaReflectedEffect: " + sa.getActivatingPlayer() + " - color mana choice is empty for " + sa.getHostCard().getName());
}

View File

@@ -13,6 +13,7 @@ import forge.game.card.CardUtil;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
public class ManifestEffect extends SpellAbilityEffect {
@Override
@@ -42,7 +43,7 @@ public class ManifestEffect extends SpellAbilityEffect {
continue;
}
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose cards to manifest ";
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseCardToManifest") + " ";
tgtCards = new CardCollection(activator.getController().chooseEntitiesForEffect(choices, amount, amount, null, sa, title, p));
} else if ("TopOfLibrary".equals(defined)) {
tgtCards = p.getTopXCardsFromLibrary(amount);

View File

@@ -13,6 +13,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
public class MeldEffect extends SpellAbilityEffect {
@Override
@@ -35,7 +36,7 @@ public class MeldEffect extends SpellAbilityEffect {
return;
}
Card secondary = controller.getController().chooseSingleEntityForEffect(field, sa, "Choose card to meld with");
Card secondary = controller.getController().chooseSingleEntityForEffect(field, sa, Localizer.getInstance().getMessage("lblChooseCardToMeld"));
secondary = game.getAction().exile(secondary, sa);

View File

@@ -13,6 +13,7 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
public class MillEffect extends SpellAbilityEffect {
@Override
@@ -39,7 +40,7 @@ public class MillEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) {
if (sa.hasParam("Optional")) {
final String prompt = TextUtil.concatWithSpace("Do you want to put card(s) from library to", TextUtil.addSuffix(destination.toString(),"?"));
final String prompt = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblDoYouWantPutLibraryCardsTo", destination.getTranslatedName()));
if (!p.getController().confirmAction(sa, null, prompt)) {
continue;
}

View File

@@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
@@ -85,7 +86,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect {
for (int i = 1; i < piles; i++) {
int size = pool.size();
CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, "Choose cards in Pile " + i, 0, size, false);
CardCollectionView pile = p.getController().chooseCardsForEffect(pool, sa, Localizer.getInstance().getMessage("lblChooseCardsInTargetPile", String.valueOf(i)), 0, size, false);
pileList.add(pile);
pool.removeAll(pile);
}

View File

@@ -11,6 +11,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
@@ -52,11 +53,11 @@ public class PeekAndRevealEffect extends SpellAbilityEffect {
CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getHostCard());
boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty();
if (!sa.hasParam("NoPeek")) {
peekingPlayer.getController().reveal(peekCards, ZoneType.Library, peekingPlayer, source + " - Revealing cards from ");
peekingPlayer.getController().reveal(peekCards, ZoneType.Library, peekingPlayer, source + " - " + Localizer.getInstance().getMessage("lblRevealingCardFrom") + " ");
}
if( doReveal && sa.hasParam("RevealOptional") )
doReveal = peekingPlayer.getController().confirmAction(sa, null, "Reveal cards to other players?");
doReveal = peekingPlayer.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblRevealCardToOtherPlayers"));
if (doReveal) {
peekingPlayer.getGame().getAction().reveal(revealableCards, peekingPlayer);

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
/**
* TODO: Write javadoc for this type.
@@ -13,7 +14,7 @@ public class PermanentCreatureEffect extends PermanentEffect {
public String getStackDescription(final SpellAbility sa) {
final Card sourceCard = sa.getHostCard();
final StringBuilder sb = new StringBuilder();
sb.append(sourceCard.getName()).append(" - Creature ").append(sourceCard.getNetPower());
sb.append(sourceCard.getName()).append(" - ").append(Localizer.getInstance().getMessage("lblCreature")).append(" ").append(sourceCard.getNetPower());
sb.append(" / ").append(sourceCard.getNetToughness());
return sb.toString();
}

View File

@@ -3,7 +3,6 @@ package forge.game.ability.effects;
import java.util.ArrayList;
import java.util.List;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
@@ -32,6 +31,8 @@ import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.CardTranslation;
public class PlayEffect extends SpellAbilityEffect {
@Override
@@ -117,7 +118,7 @@ public class PlayEffect extends SpellAbilityEffect {
final int choicenum = AbilityUtils.calculateAmount(source, sa.getParam("ChoiceNum"), sa);
tgtCards = new CardCollection(
activator.getController().chooseCardsForEffect(choice, sa,
source + " - Choose up to " + Lang.nounWithNumeral(choicenum, "card"), 0, choicenum, true
source + " - " + Localizer.getInstance().getMessage("lblChooseUpTo") + " " + Lang.nounWithNumeral(choicenum, "card"), 0, choicenum, true
)
);
}
@@ -144,7 +145,7 @@ public class PlayEffect extends SpellAbilityEffect {
final CardCollection saidNoTo = new CardCollection();
while (tgtCards.size() > saidNoTo.size() && saidNoTo.size() < amount && amount > 0) {
activator.getController().tempShowCards(showCards);
Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, "Select a card to play");
Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblSelectCardToPlay"));
activator.getController().endTempShowCards();
if (tgtCard == null) {
return;
@@ -162,7 +163,7 @@ public class PlayEffect extends SpellAbilityEffect {
game.getAction().revealTo(tgtCard, activator);
}
if (optional && !controller.getController().confirmAction(sa, null, TextUtil.concatWithSpace("Do you want to play", TextUtil.addSuffix(tgtCard.toString(),"?")))) {
if (optional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())))) {
if (wasFaceDown) {
tgtCard.turnFaceDownNoUpdate();
}

View File

@@ -17,6 +17,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.List;
@@ -51,7 +52,7 @@ public class ProtectAllEffect extends SpellAbilityEffect {
final List<String> gains = new ArrayList<>();
if (isChoice) {
Player choser = sa.getActivatingPlayer();
final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices);
final String choice = choser.getController().chooseProtectionType(Localizer.getInstance().getMessage("lblChooseAProtection"), sa, choices);
if( null == choice)
return;
gains.add(choice);

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.TextUtil;
import forge.util.Localizer;
import java.util.ArrayList;
import java.util.Arrays;
@@ -106,9 +107,9 @@ public class ProtectEffect extends SpellAbilityEffect {
if (isChoice && !choices.isEmpty()) {
Player choser = sa.getActivatingPlayer();
if (sa.hasParam("Choser") && sa.getParam("Choser").equals("Controller") && !tgtCards.isEmpty()) {
choser = tgtCards.get(0).getController();
choser = tgtCards.get(0).getController();
}
final String choice = choser.getController().chooseProtectionType("Choose a protection", sa, choices);
final String choice = choser.getController().chooseProtectionType(Localizer.getInstance().getMessage("lblChooseAProtection"), sa, choices);
if( null == choice)
return;
gains.add(choice);

View File

@@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.Arrays;
import java.util.List;
@@ -214,7 +215,7 @@ public class PumpEffect extends SpellAbilityEffect {
sb.append(atk);
sb.append("/");
if (def >= 0) {
sb.append("+");
sb.append("+");
}
sb.append(def);
sb.append(" ");
@@ -327,7 +328,7 @@ public class PumpEffect extends SpellAbilityEffect {
final String targets = Lang.joinHomogenous(tgtCards);
final String message = sa.hasParam("OptionQuestion")
? TextUtil.fastReplace(sa.getParam("OptionQuestion"), "TARGETS", targets)
: TextUtil.concatNoSpace("Apply pump to ", targets, "?");
: Localizer.getInstance().getMessage("lblApplyPumpToTarget", targets);
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, message)) {
return;

View File

@@ -10,6 +10,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
import java.util.List;
@@ -116,7 +117,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect {
Card next = orderedCards.get(i);
player.getGame().getAction().moveToLibrary(next, 0, sa);
}
if (mayshuffle && activator.getController().confirmAction(sa, null, "Do you want to shuffle the library?")) {
if (mayshuffle && activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoyouWantShuffleTheLibrary"))) {
player.shuffle(sa);
}
}

View File

@@ -36,7 +36,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect {
final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Card c : getTargetCards(sa)) {
final Combat combat = game.getPhaseHandler().getCombat();
final Combat combat = game.getPhaseHandler().getCombat();
if (combat != null && (tgt == null || c.canBeTargetedBy(sa))) {
// Unblock creatures that were blocked only by this card (e.g. Ydwen Efreet)
if (sa.hasParam("UnblockCreaturesBlockedOnlyBy")) {
@@ -58,7 +58,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect {
}
}
combat.removeFromCombat(c);
combat.removeFromCombat(c);
if (rem) {
sa.getHostCard().addRemembered(c);

View File

@@ -14,6 +14,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.collect.FCollection;
import forge.util.Localizer;
import java.util.List;
import java.util.Map;
@@ -167,7 +168,7 @@ public class RepeatEachEffect extends SpellAbilityEffect {
if (random) {
p = Aggregates.random(game.getPlayers());
} else {
p = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(game.getPlayers(), sa, "Choose a player");
p = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(game.getPlayers(), sa, Localizer.getInstance().getMessage("lblChoosePlayer"));
}
if (recordMap.containsKey(p)) {
recordMap.get(p).add(0, card);
@@ -188,7 +189,7 @@ public class RepeatEachEffect extends SpellAbilityEffect {
valid = CardLists.filterControlledBy(valid,
game.getNextPlayerAfter(p, source.getChosenDirection()));
}
Card card = p.getController().chooseSingleEntityForEffect(valid, sa, "Choose a card");
Card card = p.getController().chooseSingleEntityForEffect(valid, sa, Localizer.getInstance().getMessage("lblChooseaCard"));
if (recordMap.containsKey(p)) {
recordMap.get(p).add(0, card);
} else {

View File

@@ -12,6 +12,7 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Expressions;
import forge.util.Localizer;
public class RepeatEffect extends SpellAbilityEffect {
@@ -49,14 +50,14 @@ public class RepeatEffect extends SpellAbilityEffect {
if (maxRepeat != null && maxRepeat <= count) {
// TODO Replace Infinite Loop Break with a game draw. Here are the scenarios that can cause this:
// Helm of Obedience vs Graveyard to Library replacement effect
if(source.getName().equals("Helm of Obedience")) {
if(source.getName().equals("Helm of Obedience")) {
StringBuilder infLoop = new StringBuilder(sa.getHostCard().toString());
infLoop.append(" - To avoid an infinite loop, this repeat has been broken ");
infLoop.append(" and the game will now continue in the current state, ending the loop early. ");
infLoop.append("Once Draws are available this probably should change to a Draw.");
System.out.println(infLoop.toString());
}
infLoop.append(" - To avoid an infinite loop, this repeat has been broken ");
infLoop.append(" and the game will now continue in the current state, ending the loop early. ");
infLoop.append("Once Draws are available this probably should change to a Draw.");
System.out.println(infLoop.toString());
}
break;
}
} while (checkRepeatConditions(sa));
@@ -129,7 +130,7 @@ public class RepeatEffect extends SpellAbilityEffect {
Player decider = sa.hasParam("RepeatOptionalDecider")
? AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("RepeatOptionalDecider"), sa).get(0)
: sa.getActivatingPlayer();
return decider.getController().confirmAction(sa, null, "Do you want to repeat this process again?");
return decider.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantRepeatProcessAgain"));
}
return true;

View File

@@ -45,7 +45,7 @@ public class ReplaceDamageEffect extends SpellAbilityEffect {
prevent -= n;
if (card.getType().hasStringType("Effect") && prevent <= 0) {
game.getAction().exile(card, null);
game.getAction().exile(card, null);
} else if (!StringUtils.isNumeric(varValue)) {
card.setSVar(varValue, "Number$" + prevent);
}

View File

@@ -51,7 +51,7 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect {
prevent -= n;
if (card.getType().hasStringType("Effect") && prevent <= 0) {
game.getAction().exile(card, null);
game.getAction().exile(card, null);
} else if (!StringUtils.isNumeric(varValue)) {
card.setSVar(varValue, "Number$" + prevent);
}

View File

@@ -7,6 +7,7 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
import java.util.List;
@@ -41,7 +42,7 @@ public class RevealHandEffect extends SpellAbilityEffect {
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
if (optional && !p.getController().confirmAction(sa, null, "Do you want to reveal your hand?")) {
if (optional && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantRevealYourHand"))) {
continue;
}
final CardCollectionView hand = p.getCardsIn(ZoneType.Hand);

View File

@@ -5,6 +5,7 @@ import forge.game.PlanarDice;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
/**
* TODO: Write javadoc for this type.
@@ -25,7 +26,7 @@ public class RollPlanarDiceEffect extends SpellAbilityEffect {
game.getPhaseHandler().incPlanarDiceRolledthisTurn();
}
PlanarDice result = PlanarDice.roll(activator, null);
String message = activator.getName() + " rolled " + result.toString();
String message = Localizer.getInstance().getMessage("lblPlayerRolledResult", activator.getName(), result.toString());
game.getAction().nofityOfValue(sa, activator, message, null);
}

View File

@@ -18,14 +18,14 @@ public class RunSVarAbilityEffect extends SpellAbilityEffect {
String sVars = sa.getParam("SVars");
List<Card> cards = getTargetCards(sa);
if (sVars == null || cards.isEmpty()) {
return;
return;
}
List<SpellAbility> validSA = new ArrayList<>();
final boolean isTrigger = sa.hasParam("IsTrigger");
for (final Card tgtC : cards) {
if (!tgtC.hasSVar(sVars)) {
continue;
}
continue;
}
final SpellAbility actualSA = AbilityFactory.getAbility(tgtC.getSVar(sVars), tgtC);
actualSA.setTrigger(isTrigger);
actualSA.setActivatingPlayer(sa.getActivatingPlayer());

View File

@@ -15,6 +15,7 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
@@ -30,11 +31,11 @@ public class SacrificeEffect extends SpellAbilityEffect {
if (sa.hasParam("Echo")) {
boolean isPaid;
if (activator.hasKeyword("You may pay 0 rather than pay the echo cost for permanents you control.")
&& activator.getController().confirmAction(sa, null, "Do you want to pay Echo {0}?")) {
&& activator.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPayEcho") + " {0}?")) {
isPaid = true;
} else {
isPaid = activator.getController().payManaOptional(card, new Cost(sa.getParam("Echo"), true),
sa, "Pay Echo", ManaPaymentPurpose.Echo);
sa, Localizer.getInstance().getMessage("lblPayEcho"), ManaPaymentPurpose.Echo);
}
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromCard(card);
runParams.put(AbilityKey.EchoPaid, isPaid);
@@ -117,7 +118,7 @@ public class SacrificeEffect extends SpellAbilityEffect {
if (sa.hasParam("Random")) {
choosenToSacrifice = Aggregates.random(validTargets, Math.min(amount, validTargets.size()), new CardCollection());
} else if (sa.hasParam("OptionalSacrifice") && !p.getController().confirmAction(sa, null, "Do you want to sacrifice?")) {
} else if (sa.hasParam("OptionalSacrifice") && !p.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantSacrifice"))) {
choosenToSacrifice = CardCollection.EMPTY;
} else {
boolean isOptional = sa.hasParam("Optional");
@@ -156,21 +157,21 @@ public class SacrificeEffect extends SpellAbilityEffect {
game.getTriggerHandler().runTrigger(TriggerType.Exploited, runParams, false);
}
if (wasDestroyed || wasSacrificed) {
countSacrificed++;
if (remSacrificed) {
card.addRemembered(lKICopy);
}
countSacrificed++;
if (remSacrificed) {
card.addRemembered(lKICopy);
}
}
}
}
if (remSVar != null) {
card.setSVar(remSVar, String.valueOf(countSacrificed));
SpellAbility root = sa;
do {
root.setSVar(remSVar, String.valueOf(countSacrificed));
root = root.getSubAbility();
} while (root != null);
card.setSVar(remSVar, String.valueOf(countSacrificed));
SpellAbility root = sa;
do {
root.setSVar(remSVar, String.valueOf(countSacrificed));
root = root.getSubAbility();
} while (root != null);
}
}
@@ -193,10 +194,10 @@ public class SacrificeEffect extends SpellAbilityEffect {
final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa);
if (valid.equals("Self")) {
sb.append("Sacrifice ").append(sa.getHostCard().toString());
sb.append("Sacrifices ").append(sa.getHostCard().toString());
} else if (valid.equals("Card.AttachedBy")) {
final Card toSac = sa.getHostCard().getEnchantingCard();
sb.append(toSac.getController()).append(" sacrifices ").append(toSac).append(".");
sb.append(toSac.getController()).append(" Sacrifices ").append(toSac).append(".");
} else {
for (final Player p : tgts) {
sb.append(p.getName()).append(" ");

Some files were not shown because too many files have changed in this diff Show More