Compare commits

...

1857 Commits

Author SHA1 Message Date
Nut.andor
226459ddb8 skill improve text clarified 2023-03-05 18:05:46 +01:00
Nut.andor
a5d94c03e2 Migration of links to git repo AndorsTrailRelease 2023-02-26 01:34:35 +01:00
Nut.andor
9d15d380a3 Migration of links to git repo AndorsTrailRelease 2023-02-26 01:27:10 +01:00
Nut.andor
bff780c837 reformat for better reading 2023-02-26 01:11:40 +01:00
Nut.andor
0c493952c8 Migration of links to git repo AndorsTrailRelease 2023-02-25 23:47:10 +01:00
Nut.andor
82b904d176 target 31 needed for Google Play + export 2023-01-30 22:04:10 +01:00
Nut.andor
111aca868c hotfix 2023-01-29 22:40:51 +01:00
Nut.andor
2171c16d47 whatsNew 2023-01-29 18:38:37 +01:00
Nut.andor
acd4d84783 potc 2023-01-29 18:25:36 +01:00
Nut.andor
cc25cc97f1 Translations 2023-01-29 18:10:15 +01:00
Nut.andor
93ecebc448 Merge branch 'V0.8.4'
# Conflicts:
#	AndorsTrail/app/src/main/AndroidManifest.xml
#	AndorsTrail/app/src/main/java/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
2023-01-29 17:58:55 +01:00
Nut.andor
f5713a3eb2 Merge remote-tracking branch 'hosted.weblate/master' 2023-01-29 17:51:49 +01:00
Jiri Zizkin Zizka
90001bb4d6 Translated using Weblate (Czech)
Currently translated at 93.0% (13958 of 14998 strings)
2023-01-29 17:48:01 +01:00
Daniel Stasiak
357cab9b1e Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14998 strings)
2023-01-29 17:47:58 +01:00
Jiri Zizkin Zizka
5ea272f286 Translated using Weblate (Czech)
Currently translated at 100.0% (602 of 602 strings)
2023-01-28 00:57:24 +01:00
Jiri Zizkin Zizka
0c876bd1c5 Translated using Weblate (Czech)
Currently translated at 92.9% (13934 of 14998 strings)
2023-01-28 00:57:24 +01:00
Daniel Stasiak
0ac2999694 Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14998 strings)
2023-01-28 00:57:22 +01:00
Nut.andor
49af3c4b6d some more map fixex 2023-01-24 21:30:37 +01:00
Nut.andor
2a54b31d31 beta version nbr 2023-01-24 21:29:05 +01:00
Nut.andor
64766ce50a potc 2023-01-24 20:47:39 +01:00
Nut.andor
311accfdd3 prep for beta 2023-01-24 20:21:38 +01:00
Nut.andor
2b5bf2fa4a Merge remote-tracking branch 'origin/V0.8.4' into V0.8.4 2023-01-21 13:32:42 +01:00
Nut
64342c96d7 Merge pull request #51 from OMGeeky/import-export-fix-1
Import/Export improvements
2023-01-21 13:31:28 +01:00
OMGeeky
f8649bb0a5 Cleanup 2023-01-21 12:55:16 +01:00
Nut.andor
fde6608c26 translations, copyright 2023-01-21 01:06:55 +01:00
Nut.andor
3f339c14a2 translations, copyright 2023-01-21 00:40:52 +01:00
Nut.andor
922db05c4d Merge remote-tracking branch 'hosted.weblate/master' into V0.8.4 2023-01-21 00:31:16 +01:00
Eduardo
b849de8b66 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.4% (14159 of 14998 strings)
2023-01-21 00:21:55 +01:00
Eduardo
f798b29729 Translated using Weblate (Portuguese)
Currently translated at 76.4% (11470 of 14998 strings)
2023-01-21 00:21:51 +01:00
MARCO ACORTE
e58e7a2588 Translated using Weblate (Italian)
Currently translated at 83.9% (12598 of 14998 strings)
2023-01-21 00:21:50 +01:00
Eduardo
a1ef339831 Translated using Weblate (Portuguese)
Currently translated at 76.4% (11466 of 14998 strings)
2023-01-20 00:59:15 +01:00
gallegonovato
2002d51f6b Translated using Weblate (Spanish)
Currently translated at 100.0% (602 of 602 strings)
2023-01-15 19:50:17 +01:00
Nut.andor
025283b70b ratdom graphics 2023-01-14 00:57:13 +01:00
Predrag
577b1aa034 Translated using Weblate (Serbian)
Currently translated at 1.8% (275 of 14997 strings)
2023-01-13 10:52:03 +01:00
Ömer Faruk Çakmak
da637c0cc8 Translated using Weblate (Turkish)
Currently translated at 36.1% (5416 of 14998 strings)
2023-01-13 10:52:01 +01:00
Vincenzo De Concilio
d026ff690a Translated using Weblate (Italian)
Currently translated at 96.8% (583 of 602 strings)
2023-01-13 10:51:59 +01:00
Predrag
d14ed56669 Added translation using Weblate (Serbian) 2023-01-12 09:31:54 +01:00
Predrag
64cfacb7ff Translated using Weblate (Serbian)
Currently translated at 0.9% (144 of 14997 strings)
2023-01-11 16:55:04 +01:00
Ömer Faruk Çakmak
98a800e070 Translated using Weblate (Turkish)
Currently translated at 100.0% (602 of 602 strings)
2023-01-11 16:55:02 +01:00
Predrag
35219c8e88 Translated using Weblate (Serbian)
Currently translated at 0.5% (89 of 14997 strings)
2023-01-11 16:22:50 +01:00
Predrag
b636cad347 Added translation using Weblate (Serbian) 2023-01-11 15:35:23 +01:00
Ian Lethe (Windseeker)
733328cd29 Translated using Weblate (Korean)
Currently translated at 9.3% (1408 of 14998 strings)
2023-01-09 12:13:27 +01:00
Ian Lethe (Windseeker)
36db28f805 Translated using Weblate (Korean)
Currently translated at 9.3% (1404 of 14998 strings)
2023-01-09 08:52:00 +01:00
Szabó Péter
6d4c1c3c14 Translated using Weblate (Hungarian)
Currently translated at 89.0% (536 of 602 strings)
2023-01-08 13:52:07 +01:00
David Tamas Szabo
eadb95f8e8 Translated using Weblate (Hungarian)
Currently translated at 27.8% (4177 of 14998 strings)
2023-01-08 13:52:07 +01:00
Szabó Péter
014f67f270 Translated using Weblate (Hungarian)
Currently translated at 27.8% (4177 of 14998 strings)
2023-01-08 13:52:06 +01:00
Nut.andor
cd8657adb4 QuickLearner 5% -> 10% 2023-01-08 00:57:36 +01:00
gallegonovato
c007fc4d1c Translated using Weblate (Spanish)
Currently translated at 100.0% (602 of 602 strings)
2023-01-01 19:52:07 +01:00
gallegonovato
7e6c864ba3 Translated using Weblate (Spanish)
Currently translated at 84.3% (12658 of 14998 strings)
2023-01-01 19:52:06 +01:00
Kristoffer Grundström
f2da8f767a Translated using Weblate (Swedish)
Currently translated at 4.5% (689 of 14998 strings)
2022-12-29 13:27:04 +01:00
Nut.andor
bd856541d6 fix Burhczyd 2022-12-25 01:34:00 +01:00
Dan
bdde2176d9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (602 of 602 strings)
2022-12-15 21:48:06 +01:00
Dan
171893a2c1 Translated using Weblate (Ukrainian)
Currently translated at 9.8% (1478 of 14998 strings)
2022-12-14 13:51:22 +01:00
rabituwu
c6c1d6d03d Translated using Weblate (Filipino)
Currently translated at 1.9% (295 of 14997 strings)
2022-12-12 14:51:24 +01:00
Nut.andor
ec8b114782 fix Burhczyd 2022-12-12 08:52:43 +01:00
Nut.andor
aaecb8ae4a Reformatting json for better reading 2022-12-11 03:56:15 +01:00
OMGeeky
4e2e3b370c formatting 2022-12-08 17:56:41 +01:00
OMGeeky
c14f8f84a0 Import/Export of the worldmap changed to zip files & some clarifications 2022-12-08 00:18:28 +01:00
Lucas Araujo
13c8012710 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.9% (13935 of 14998 strings)
2022-12-03 16:48:55 +01:00
عادل نصري
3806d77b26 Translated using Weblate (Arabic)
Currently translated at 9.7% (1457 of 14997 strings)
2022-11-30 14:48:56 +01:00
عادل نصري
af94220715 Translated using Weblate (Arabic)
Currently translated at 100.0% (602 of 602 strings)
2022-11-29 20:48:04 +01:00
عادل نصري
af07c47832 Translated using Weblate (Arabic)
Currently translated at 9.7% (1456 of 14997 strings)
2022-11-29 20:48:03 +01:00
Nut.andor
322007e5ac Next version number v0-8-4 68 2022-11-19 00:23:26 +01:00
aircqsj
af5cdb9d49 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (602 of 602 strings)
2022-11-16 13:48:29 +01:00
Nut.andor
3ada8ceaa7 V0.8.3 2022-11-13 00:54:22 +01:00
3raven
68fa0068dc Translated using Weblate (French)
Currently translated at 84.8% (12733 of 14998 strings)
2022-11-09 22:50:27 +01:00
Nut.andor
7b5fc79375 fixes from beta 2022-11-09 07:30:19 +01:00
ilya
5dfa750227 Translated using Weblate (Russian)
Currently translated at 100.0% (602 of 602 strings)
2022-11-08 19:03:26 +01:00
ilya
cbe0773310 Translated using Weblate (Russian)
Currently translated at 100.0% (602 of 602 strings)
2022-11-07 14:03:24 +01:00
Nut.andor
72a19eeb80 fixes from beta 2022-11-06 21:47:25 +01:00
Nut.andor
a993cc5a08 translation state 2022-11-05 19:07:45 +01:00
Nut.andor
83724ba408 haunted content 2022-11-05 02:03:27 +01:00
Nut.andor
a4cd8f7460 Merge branch 'pulls/1829009049/48' 2022-11-05 00:43:35 +01:00
Nut.andor
7a52bbb9f3 Merge remote-tracking branch 'origin/v0.8.3' 2022-11-05 00:40:01 +01:00
Nut.andor
3552ff8a9f translations 2022-11-05 00:31:16 +01:00
Nut.andor
0e081f3319 authors 2022-11-05 00:30:56 +01:00
Nut.andor
1d94519e1c Merge remote-tracking branch 'hosted.weblate/master' into v0.8.3 2022-11-05 00:24:11 +01:00
Hosted Weblate
0bbc6adb4b Merge branch 'origin/master' into Weblate. 2022-11-05 00:21:51 +01:00
Nut.andor
b48ddd4999 whatsnew 2022-11-04 22:44:39 +01:00
Nut.andor
be8dad981d some new / fixed graphics 2022-11-04 22:44:38 +01:00
Nut.andor
f9708f48a4 whatsnew 2022-11-04 22:38:11 +01:00
Nut.andor
155b01bdea some new / fixed graphics 2022-11-04 22:07:10 +01:00
Nut.andor
19810b2099 Import Export 2022-11-04 21:57:27 +01:00
aircqsj
c6886f7a3e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (14998 of 14998 strings)
2022-11-04 14:07:59 +01:00
OMGeeky
3bea24f9cc Fixed bug where the Logs folder would get exported instead of the Worldmap folder
+cleanup
+API level safety markers
2022-11-03 20:35:37 +01:00
Lacrom
4b8f5c4908 Translated using Weblate (French)
Currently translated at 84.7% (12717 of 14998 strings)
2022-10-29 06:34:15 +02:00
Nut
66d9618b1b Merge pull request #49 from OMGeeky/temp1
Remove ignored files
2022-10-28 22:16:00 +02:00
OMGeeky
488d6347d0 Remove ignore files that are still tracked 2022-10-28 21:39:41 +02:00
OMGeeky
51fd0d0994 Add a loading animation. 2022-10-28 18:47:08 +02:00
Lacrom
50833af145 Translated using Weblate (French)
Currently translated at 84.7% (12704 of 14998 strings)
2022-10-28 07:50:32 +02:00
Lacrom
ca7c2388aa Translated using Weblate (French)
Currently translated at 83.2% (12479 of 14998 strings)
2022-10-27 08:48:11 +02:00
Lacrom
8e7d6adca5 Translated using Weblate (French)
Currently translated at 100.0% (582 of 582 strings)
2022-10-27 08:48:09 +02:00
aircqsj
17edb96ff8 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (14998 of 14998 strings)
2022-10-23 06:10:26 +02:00
ilya
3f3869916c Translated using Weblate (Russian)
Currently translated at 100.0% (14998 of 14998 strings)
2022-10-23 06:10:24 +02:00
Elton Viana Gonçalves da Luz
1d2fc7ade7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.8% (13929 of 14998 strings)
2022-10-23 06:10:22 +02:00
OMGeeky
aa84e5a73d Improve import options when the target slot is already used. 2022-10-22 18:10:59 +02:00
OMGeeky
4ecf7d2dda Allow setting strings as message directly & add support for canceling the Dialog 2022-10-22 18:06:25 +02:00
Nut.andor
dca1cb676c New release version numbers and some basic files and settings 2022-10-20 00:14:37 +02:00
Nut.andor
9a4f41eac2 whatsnew 2022-10-19 23:21:43 +02:00
OMGeeky
23012b0d40 Update strings.xml 2022-10-19 22:33:06 +02:00
OMGeeky
916134bd9b Update strings.xml 2022-10-19 22:24:05 +02:00
Nut.andor
1d6777daae fix diamond 2022-10-19 20:14:29 +02:00
OMGeeky
4793751ba8 Improved error/success messages & fixed some bugs in 'Add as New' 2022-10-19 19:16:37 +02:00
OMGeeky
185c0eaf7c Enabling 'Load' button even if no saves exist (for imports) 2022-10-19 19:14:27 +02:00
Daniel Stasiak
4b50d13149 Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14998 strings)
2022-10-19 18:07:41 +02:00
이정희
23b58c3e7c Translated using Weblate (Korean)
Currently translated at 9.3% (1403 of 14998 strings)
2022-10-19 18:07:39 +02:00
Ricardo
2d5ebc3b13 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (582 of 582 strings)
2022-10-19 18:07:38 +02:00
OMGeeky
59e2e3035c Hide the import/export options on devices with an Android version below 10 (Q or api level 29) 2022-10-18 22:34:08 +02:00
OMGeeky
6d5ddfdbfa Add option to 'Add as New' on import 2022-10-18 22:15:53 +02:00
OMGeeky
f8ae18721f Allow vertically stacked buttons in Dialogs 2022-10-18 22:13:17 +02:00
Nut.andor
63bc7c3a4e whatsnew and translation status 2022-10-17 23:44:05 +02:00
OMGeeky
8e72763314 Import Export 2022-10-17 23:20:16 +02:00
Nut.andor
9310d53362 potc 2022-10-17 23:15:48 +02:00
Nut.andor
a71dcc13a3 content 0.8.2 2022-10-17 23:06:34 +02:00
Nut.andor
ea95f4ff87 actual translations generated 2022-10-17 22:33:03 +02:00
Nut.andor
f35167d112 Merge remote-tracking branch 'hosted.weblate/master' 2022-10-17 22:27:58 +02:00
Daniel Stasiak
9f935190f2 Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14995 strings)
2022-10-16 00:53:44 +02:00
Nut.andor
c11430cf6b beta icon and fileprovider 2022-10-15 22:46:16 +02:00
Daniel Stasiak
8f97a27ab7 Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14995 strings)
2022-10-13 15:56:19 +02:00
Anupam Malhotra
9e36f848dc Translated using Weblate (Hindi)
Currently translated at 0.1% (4 of 14994 strings)
2022-10-12 08:50:37 +02:00
ilya
b24d52b1da Translated using Weblate (Russian)
Currently translated at 100.0% (14995 of 14995 strings)
2022-10-12 08:50:34 +02:00
Daniel Stasiak
e2a9307560 Translated using Weblate (Polish)
Currently translated at 92.5% (13884 of 14995 strings)
2022-10-12 08:50:31 +02:00
Nut.andor
e3ac804f61 Merge branch 'pulls/1829009049/47' 2022-10-11 19:20:06 +02:00
Nut.andor
fd504d2df5 Automated copying of files for build as gradle task 2022-10-11 18:58:05 +02:00
OMGeeky
0e615d3f11 Revert accidental wrong branch stuff 2022-10-11 18:31:01 +02:00
Nut.andor
47646457ab (Pull Request #46:) Fixed problems with older Android versions (below Android 7) 2022-10-11 00:00:00 +02:00
OMGeeky
8e393b93d8 Changed lint.xml to include StringFormatMatches and StringFormatInvalid 2022-10-10 15:43:34 +02:00
OMGeeky
3289bd6fb1 Configured lint-baseline file (for automatic builds on github) 2022-10-10 15:32:21 +02:00
OMGeeky
23a331d655 Merge remote-tracking branch 'origin/fix-older-android-versions' into gradle_copy_v1 2022-10-10 15:09:01 +02:00
OMGeeky
112301c444 Create build Action
(cherry picked from commit 462b6059218b1bdc1efa582ea2463d5eb3af1c22)
2022-10-10 15:05:01 +02:00
OMGeeky
f50e4f1d38 Migrate to AndroidX 2022-10-10 14:54:08 +02:00
OMGeeky
d623c22b38 Removed ignored files 2022-10-10 14:45:01 +02:00
OMGeeky
d11bf5b0aa Automated copying of files for build as gradle task 2022-10-10 09:22:18 +02:00
Nut.andor
e30f67e327 fix Master Ale bug 2022-10-09 02:43:01 +02:00
OMGeeky
6946b1f2b3 Fixed problems with older Android versions (below Android 7) 2022-10-09 02:00:52 +02:00
Nut Andor
96a1a5760a Translated using Weblate (German)
Currently translated at 94.0% (14096 of 14995 strings)
2022-10-09 01:15:46 +02:00
Nut.andor
58b802e911 whatsnew 2022-10-08 03:41:50 +02:00
Nut.andor
f9b095565b languages 2022-10-08 03:22:32 +02:00
Nut.andor
19817eb97d Merge branch 'v0.8.2' 2022-10-08 02:58:18 +02:00
Nut.andor
f46d2aedbf content v082 (Sullengard fixes) 2022-10-08 02:56:10 +02:00
Nut.andor
913b651953 Merge remote-tracking branch 'hosted.weblate/master' into v0.8.2 2022-10-08 01:04:59 +02:00
Nut Andor
5283eed28e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (15016 of 15016 strings)
2022-10-08 01:04:14 +02:00
Nut Andor
deb824d50e Translated using Weblate (German)
Currently translated at 93.8% (14095 of 15016 strings)
2022-10-08 01:04:12 +02:00
Nut.andor
6841d862e4 Merge remote-tracking branch 'hosted.weblate/master' into v0.8.2 2022-10-08 00:43:26 +02:00
saoloer
f94723b0cd Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (15016 of 15016 strings)
2022-10-07 18:18:35 +02:00
Jr
ab41168736 Translated using Weblate (German)
Currently translated at 93.8% (14095 of 15016 strings)
2022-10-07 18:18:33 +02:00
Jr
2d73c4687a Translated using Weblate (German)
Currently translated at 100.0% (582 of 582 strings)
2022-10-07 18:18:30 +02:00
aircqsj
e454deb8b1 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.9% (15015 of 15016 strings)
2022-10-05 20:56:26 +02:00
Lucas Araujo
074891805a Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.7% (13928 of 15016 strings)
2022-10-05 20:56:21 +02:00
Daniel Stasiak
d2d32bc4ed Translated using Weblate (Polish)
Currently translated at 92.4% (13884 of 15016 strings)
2022-10-05 20:56:20 +02:00
Daniel Stasiak
22daeb0c33 Translated using Weblate (Polish)
Currently translated at 100.0% (582 of 582 strings)
2022-10-05 20:56:17 +02:00
Nut.andor
db30253baf v0.8.2 66 2022-10-03 00:47:11 +02:00
Nut.andor
312cb7dec7 ignore workspace.xml 2022-10-03 00:44:00 +02:00
Nut.andor
7befd27951 whatsnew release version 2022-10-02 21:05:38 +02:00
aircqsj
c1e3bfa7ed Translated using Weblate (Chinese (Simplified))
Currently translated at 94.0% (14128 of 15016 strings)
2022-10-02 07:56:33 +02:00
ilya
ddec991082 Translated using Weblate (Russian)
Currently translated at 100.0% (15016 of 15016 strings)
2022-10-02 07:56:02 +02:00
Nut.andor
79e6fe7b65 whatsnew
factionlist bug
2022-10-01 09:18:28 +02:00
ilya
25e36dc535 Translated using Weblate (Russian)
Currently translated at 100.0% (15016 of 15016 strings)
2022-09-30 18:31:04 +02:00
Jiri Zizkin Zizka
83c579a929 Translated using Weblate (Czech)
Currently translated at 100.0% (582 of 582 strings)
2022-09-29 23:16:22 +02:00
Jiri Zizkin Zizka
0c694115ee Translated using Weblate (Czech)
Currently translated at 92.7% (13932 of 15016 strings)
2022-09-29 23:16:22 +02:00
ilya
bf9723b0c1 Translated using Weblate (Russian)
Currently translated at 96.2% (14449 of 15016 strings)
2022-09-29 23:16:20 +02:00
ilya
b81bacb1fe Translated using Weblate (Russian)
Currently translated at 100.0% (582 of 582 strings)
2022-09-29 23:16:17 +02:00
Nut.andor
329acad741 authors 2022-09-28 00:44:23 +02:00
Nut.andor
41ad345a89 languages% 2022-09-28 00:10:39 +02:00
Nut.andor
f79633fb85 POTCPOTC incl. compile 2022-09-27 22:34:06 +02:00
Nut.andor
8071ebe28f fix https 2022-09-27 21:55:59 +02:00
Nut.andor
09ff14bd14 content sullengard 2022-09-27 21:54:13 +02:00
Nut.andor
fee94d4262 typo in authors 2022-09-27 21:50:45 +02:00
Nut.andor
ec14dbe917 compiled languages 2022-09-27 20:04:48 +02:00
Nut.andor
cc1d20aba6 Revert "Auxiliary commit to revert individual files from 4feebd058b2184486001bb77f9b2b4c48947f11d"
This reverts commit f8a9c8d2d40b69f5f4007320365d64127ef93fa4, reversing
changes made to 2dd9f8fcab.
2022-09-27 19:47:37 +02:00
Nut.andor
4feebd058b Merge remote-tracking branch 'hosted.weblate/master'
(an old state that must be reverted again, just to sync weblate)
2022-09-27 19:46:41 +02:00
Hosted Weblate
265469f88e Merge branch 'origin/master' into Weblate. 2022-09-26 23:19:16 +02:00
Nut.andor
2dd9f8fcab Merge commit '2705e1c20875e74aefdc5225e27c7cf8004edc15'
missing translations
2022-09-26 23:17:16 +02:00
Hosted Weblate
50c522c20a Merge branch 'origin/master' into Weblate. 2022-09-26 23:08:11 +02:00
Nut.andor
08dea48010 Revert "missing translations 20220821-2144 ... 20220924-2147"
This reverts commit 76127d9d85.
2022-09-26 23:07:49 +02:00
Hosted Weblate
781ddcf7a7 Merge branch 'origin/master' into Weblate. 2022-09-26 23:04:35 +02:00
Nut.andor
76127d9d85 missing translations 20220821-2144 ... 20220924-2147 2022-09-26 23:03:16 +02:00
Hosted Weblate
e826232611 Merge branch 'origin/master' into Weblate. 2022-09-26 22:42:24 +02:00
Nut.andor
d879629e4a Revert to next prod version 2022-09-26 22:41:03 +02:00
Nut.andor
2e7eb84f88 potc 2022-09-26 00:56:19 +02:00
Nut.andor
10ebaf925f content sullengard 2022-09-26 00:43:37 +02:00
Nut.andor
4c8302b11e compiled languages 2022-09-25 23:46:21 +02:00
Nut.andor
235f1c912d next prod version 0.8.1
authors
2022-09-25 23:46:02 +02:00
Nut.andor
a5721a4a25 gradle to gitignore 2022-09-25 23:15:32 +02:00
Nut.andor
5adbbd61b9 Next version 0.8.1
Burhczyd enhanced
Burhczyd typos
Some map changes,
beta icon
WhatsNew
map_tree_1+2.png changes
2022-09-25 19:46:17 +02:00
Nut.andor
196223bf73 - Large maps bugs
- Debug buttons
2022-09-25 15:36:10 +02:00
Nut.andor
d89a615990 Migration to actual AndroidStudio version - final touches for compile 2022-09-25 15:34:08 +02:00
Nut.andor
863cc1a0bb Preparation for Compile
- change  http://  to  https://
2022-09-25 14:34:23 +02:00
Nut.andor
1cec98249b Migration to actual AndroidStudio version
Copy  ...\AndorsTrailRelease\andors-trail\AndorsTrail  to  a temporary directory, then delete the content except the .git directory.   (C:\AT\AndorsTrailRelease_before_Mig_20220925)

Open Android Studio, any project
New >> Import project

> Import Project, select the AndorsTrail folder from the temporary location
	C:\AT\AndorsTrailRelease_before_Mig_20220925\andors-trail\AndorsTrail
  Destination: C:\AT\AndorsTrailRelease\andors-trail\AndorsTrail

Click next a few times.
It then shows some error about not finding build tools. Below it there should be the option to 'Add google Maven reposiroty and sync project'. Click that option and then 'Do Refactor' (Bottom Left).

In the newly created file 'app/build.gradle'
In line 4 change the compileSdkVersion to 30 (or higher?)
In line 9 change the minSdkVersion to 14 instead of 4
In line 22 change the version from '29.+' to '28.0.0' and the compile at the beginning to implementation
Then Click 'Sync Project with Gradle Files' (icon in top right) that should no longer give errors.
2022-09-25 13:16:57 +02:00
Nut.andor
15ba005062 Merge branch 'pulls/1829009049/37' 2022-09-25 11:56:03 +02:00
Nut.andor
86c1b7496d Merge branch 'pulls/1829009049/36' 2022-09-25 11:55:12 +02:00
Nut.andor
0a194f1e25 Merge branch 'pulls/1829009049/35' 2022-09-25 11:54:58 +02:00
Nut.andor
6ada4c9649 Merge remote-tracking branch 'Weblate_translations/master' 2022-09-25 11:44:21 +02:00
Daniel Stasiak
2705e1c208 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-09-25 11:15:00 +02:00
Andrés Morgensen
3ec7a76ce2 Translated using Weblate (Spanish)
Currently translated at 90.8% (12659 of 13929 strings)
2022-09-17 01:23:39 +02:00
Wahyu Budi Laksono
5ec9a76c65 Translated using Weblate (Indonesian)
Currently translated at 18.4% (2573 of 13929 strings)
2022-09-09 17:23:41 +02:00
Budi
146f62b283 Translated using Weblate (Indonesian)
Currently translated at 18.0% (2520 of 13929 strings)
2022-09-07 21:05:11 +02:00
Neko Nekowazarashi
b9d4e52101 Translated using Weblate (Indonesian)
Currently translated at 17.9% (2507 of 13929 strings)
2022-09-05 16:23:44 +02:00
Kristoffer Grundström
934f578083 Translated using Weblate (Swedish)
Currently translated at 70.5% (410 of 581 strings)
2022-09-03 01:24:47 +02:00
Jiri Zizkin Zizka
0d604f6346 Translated using Weblate (Czech)
Currently translated at 100.0% (13929 of 13929 strings)
2022-09-03 01:24:46 +02:00
Daniel Stasiak
5a555d554c Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-08-31 13:26:13 +02:00
daudiffa
8ccaabfb0d Translated using Weblate (Indonesian)
Currently translated at 17.7% (2478 of 13929 strings)
2022-08-31 13:26:11 +02:00
Artem
fb887cc869 Translated using Weblate (Ukrainian)
Currently translated at 10.6% (1478 of 13929 strings)
2022-08-30 05:45:22 +02:00
Daniel Stasiak
368359af08 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-08-30 05:45:20 +02:00
daudiffa
dc15a9ecde Translated using Weblate (Indonesian)
Currently translated at 17.3% (2412 of 13929 strings)
2022-08-30 05:45:18 +02:00
Artem
1f6db65a45 Translated using Weblate (Ukrainian)
Currently translated at 10.6% (1478 of 13929 strings)
2022-08-28 03:25:16 +02:00
Jiri Zizkin Zizka
0a70cdd852 Translated using Weblate (Czech)
Currently translated at 99.8% (13909 of 13929 strings)
2022-08-28 03:25:14 +02:00
Daniel Stasiak
493f3675dd Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-08-28 03:25:13 +02:00
Marco Santos
7b3b950982 Translated using Weblate (Filipino)
Currently translated at 46.8% (272 of 581 strings)
2022-08-24 06:18:40 +02:00
Jiri Zizkin Zizka
58cb83ee0c Translated using Weblate (Czech)
Currently translated at 99.8% (13903 of 13929 strings)
2022-08-24 06:18:40 +02:00
Daniel Stasiak
97d03a76c5 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-08-24 06:18:39 +02:00
Jiri Zizkin Zizka
d42046dc30 Translated using Weblate (Czech)
Currently translated at 99.7% (13897 of 13929 strings)
2022-08-22 15:58:00 +02:00
Daniel Stasiak
fc6d11b096 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-08-22 15:57:57 +02:00
Нядзьведзь Максім Аляксандравіч
716d0076cd Translated using Weblate (Belarusian)
Currently translated at 0.3% (55 of 13928 strings)
2022-08-13 00:23:04 +02:00
Нядзьведзь Максім Аляксандравіч
e19e73c6a1 Translated using Weblate (Belarusian)
Currently translated at 96.0% (558 of 581 strings)
2022-08-13 00:23:03 +02:00
Нядзьведзь Максім Аляксандравіч
779a2e81fd Added translation using Weblate (Belarusian) 2022-08-11 15:39:44 +02:00
Jiri Zizkin Zizka
cd1e764f92 Translated using Weblate (Czech)
Currently translated at 98.2% (13689 of 13929 strings)
2022-08-11 08:22:11 +02:00
Jiri Zizkin Zizka
71bd56fff4 Translated using Weblate (Czech)
Currently translated at 97.2% (13551 of 13929 strings)
2022-08-08 07:25:21 +02:00
Jiri Zizkin Zizka
0e48faa5b2 Translated using Weblate (Czech)
Currently translated at 96.9% (13500 of 13929 strings)
2022-08-05 06:23:54 +02:00
Andrés Morgensen
9d0f17d2a2 Translated using Weblate (Spanish)
Currently translated at 90.8% (12656 of 13929 strings)
2022-08-05 06:23:52 +02:00
Jiri Zizkin Zizka
67720592f4 Translated using Weblate (Czech)
Currently translated at 96.3% (13426 of 13929 strings)
2022-08-02 22:21:56 +02:00
Daniel Stasiak
ba97e71957 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-30 17:21:11 +02:00
mitchell van den Hurk
ee5f525591 Translated using Weblate (Dutch)
Currently translated at 7.7% (1083 of 13929 strings)
2022-07-30 17:21:09 +02:00
Artem
bed80e48b0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (581 of 581 strings)
2022-07-26 14:19:23 +02:00
Daniel Stasiak
90c8293fd2 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-26 14:19:22 +02:00
Daniel Stasiak
6c390c6b39 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-25 11:26:50 +02:00
Jiri Zizkin Zizka
9785a8ece9 Translated using Weblate (Czech)
Currently translated at 96.3% (13419 of 13929 strings)
2022-07-24 12:25:05 +02:00
Daniel Stasiak
362c3f8b74 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-24 12:25:03 +02:00
Nut.andor
bb707047a0 gradle wrapper 2022-07-24 10:30:41 +02:00
Nut.andor
efe0691f74 gitignore 2022-07-24 10:25:17 +02:00
Daniel Stasiak
30906135e1 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-15 01:41:33 +02:00
โกศัลย์ รําประโคน
0a8b598f04 Translated using Weblate (Thai)
Currently translated at 1.3% (195 of 13929 strings)
2022-07-11 11:18:26 +02:00
โกศัลย์ รําประโคน
b7ea7ccaab Translated using Weblate (Thai)
Currently translated at 8.6% (50 of 581 strings)
2022-07-08 18:18:47 +02:00
Anupam Malhotra
6a959f88d4 Translated using Weblate (Punjabi)
Currently translated at 0.1% (7 of 13929 strings)
2022-07-08 18:18:47 +02:00
โกศัลย์ รําประโคน
311c1cb1ae Translated using Weblate (Thai)
Currently translated at 1.2% (170 of 13929 strings)
2022-07-08 18:18:45 +02:00
Daniel Stasiak
7023401f1f Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-08 18:18:44 +02:00
ilya
f4e7995b8e Translated using Weblate (Russian)
Currently translated at 100.0% (581 of 581 strings)
2022-07-08 18:18:42 +02:00
Jiri Zizkin Zizka
0712dac81b Translated using Weblate (Czech)
Currently translated at 95.6% (13318 of 13929 strings)
2022-07-02 16:21:10 +02:00
Daniel Stasiak
40693d99b9 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-07-02 16:21:08 +02:00
ilya
8aeb391239 Translated using Weblate (Russian)
Currently translated at 100.0% (581 of 581 strings)
2022-07-02 16:21:06 +02:00
Derik Douglas Jesus da Silva
fc6821ea94 Translated using Weblate (Punjabi)
Currently translated at 24.2% (141 of 581 strings)
2022-06-29 20:21:41 +02:00
Jiri Zizkin Zizka
92a77518ae Translated using Weblate (Czech)
Currently translated at 95.5% (13312 of 13929 strings)
2022-06-29 20:21:40 +02:00
Derik Douglas Jesus da Silva
a345b22116 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (13929 of 13929 strings)
2022-06-29 20:21:39 +02:00
Basan
3d4869bf29 Translated using Weblate (Kurdish (Central))
Currently translated at 0.1% (19 of 13928 strings)
2022-06-26 20:22:38 +02:00
Daniel Stasiak
fa19e69494 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-06-23 10:20:38 +02:00
Jiri Zizkin Zizka
721123fbca Translated using Weblate (Czech)
Currently translated at 95.4% (13298 of 13929 strings)
2022-06-21 17:50:31 +02:00
Lucas Araujo
c0aae189c9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (13929 of 13929 strings)
2022-06-21 17:50:29 +02:00
Daniel Stasiak
c9619ea6a6 Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-06-21 17:50:27 +02:00
Jiri Zizkin Zizka
7a72521cd2 Translated using Weblate (Czech)
Currently translated at 95.2% (13272 of 13929 strings)
2022-06-20 12:23:52 +02:00
Lacrom
e5d43460db Translated using Weblate (French)
Currently translated at 89.1% (12421 of 13929 strings)
2022-06-20 12:23:50 +02:00
Jiri Zizkin Zizka
7743cd803e Translated using Weblate (Czech)
Currently translated at 94.5% (13175 of 13929 strings)
2022-06-17 00:20:30 +02:00
Kevin Rojas Costa Rica
96df9670b3 Translated using Weblate (Spanish)
Currently translated at 90.6% (12625 of 13929 strings)
2022-06-17 00:20:28 +02:00
Nut.andor
5319a611bc keyboard/dpad diagonals and shortcut handling
# Conflicts:
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/InputController.java
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/MainView.java
2022-06-12 08:29:14 +02:00
Nut.andor
e179d0cdf6 Monsterstatus killcount 2022-06-12 08:08:24 +02:00
Nut.andor
f330a48f51 kill count stats by monster name instead of ID 2022-06-12 08:07:11 +02:00
Nut.andor
e6268fbd14 minor typo 2022-06-12 07:10:05 +02:00
Jiri Zizkin Zizka
ef0ee63d6f Translated using Weblate (Czech)
Currently translated at 93.7% (13056 of 13929 strings)
2022-06-11 01:21:31 +02:00
Jiri Zizkin Zizka
ab0487a900 Translated using Weblate (Czech)
Currently translated at 93.0% (12959 of 13929 strings)
2022-06-07 23:06:53 +02:00
Jiri Zizkin Zizka
4eb9db2532 Translated using Weblate (Czech)
Currently translated at 92.9% (12944 of 13929 strings)
2022-06-06 17:13:45 +02:00
Jiri Zizkin Zizka
c81ee4768c Translated using Weblate (Czech)
Currently translated at 92.6% (12906 of 13929 strings)
2022-06-04 22:29:22 +02:00
عادل نصري
a034f3aced Translated using Weblate (Arabic)
Currently translated at 10.3% (1438 of 13928 strings)
2022-06-04 20:27:24 +02:00
Jiri Zizkin Zizka
d446548863 Translated using Weblate (Czech)
Currently translated at 92.6% (12906 of 13929 strings)
2022-06-04 20:27:22 +02:00
Lacrom
37e66e6bf4 Translated using Weblate (French)
Currently translated at 89.1% (12420 of 13929 strings)
2022-06-04 20:27:20 +02:00
Jiri Zizkin Zizka
a6a456882d Translated using Weblate (Czech)
Currently translated at 92.1% (12842 of 13929 strings)
2022-06-01 06:29:03 +02:00
Jiri Zizkin Zizka
590cb7ed42 Translated using Weblate (Czech)
Currently translated at 91.9% (12805 of 13929 strings)
2022-05-31 00:20:07 +02:00
Jiri Zizkin Zizka
378d8b3185 Translated using Weblate (Czech)
Currently translated at 91.8% (12794 of 13929 strings)
2022-05-29 08:19:55 +02:00
Jiri Zizkin Zizka
69bb657b76 Translated using Weblate (Czech)
Currently translated at 91.6% (12770 of 13929 strings)
2022-05-28 01:19:57 +02:00
Jiri Zizkin Zizka
e012c6473e Translated using Weblate (Czech)
Currently translated at 91.6% (12761 of 13929 strings)
2022-05-26 14:45:19 +02:00
Jiri Zizkin Zizka
1b10ce2796 Translated using Weblate (Czech)
Currently translated at 90.9% (12668 of 13929 strings)
2022-05-23 23:19:36 +02:00
forheinn
98a97ba9d4 Translated using Weblate (Indonesian)
Currently translated at 17.3% (2412 of 13929 strings)
2022-05-23 23:19:34 +02:00
Roman Leo
85e6f1d6ba Translated using Weblate (German)
Currently translated at 100.0% (13929 of 13929 strings)
2022-05-23 23:19:33 +02:00
Artem
c9d28f2023 Translated using Weblate (Ukrainian)
Currently translated at 10.6% (1478 of 13929 strings)
2022-05-19 21:31:44 +02:00
Jiri Zizkin Zizka
2b216ec152 Translated using Weblate (Czech)
Currently translated at 90.7% (12643 of 13929 strings)
2022-05-19 21:31:42 +02:00
Roman Leo
0d203f5962 Translated using Weblate (German)
Currently translated at 99.4% (13858 of 13929 strings)
2022-05-19 21:31:40 +02:00
Никита
2a3400baa9 Translated using Weblate (Ukrainian)
Currently translated at 10.6% (1477 of 13929 strings)
2022-05-19 10:50:35 +02:00
Artem
fadf1a91a0 Translated using Weblate (Ukrainian)
Currently translated at 10.6% (1477 of 13929 strings)
2022-05-19 10:50:34 +02:00
Никита
2c4280bb9c Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1473 of 13929 strings)
2022-05-19 10:46:13 +02:00
Artem
7a3d9ee354 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1473 of 13929 strings)
2022-05-19 10:46:12 +02:00
Artem
223180f822 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1470 of 13929 strings)
2022-05-19 10:25:02 +02:00
Никита
27ae0979a0 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1470 of 13929 strings)
2022-05-19 10:25:01 +02:00
Никита
c8aab8d383 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1469 of 13929 strings)
2022-05-19 10:21:46 +02:00
Artem
dab311041c Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1469 of 13929 strings)
2022-05-19 10:21:45 +02:00
Никита
2bbb56d2ca Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1468 of 13929 strings)
2022-05-19 10:09:26 +02:00
Artem
4ed9a78b82 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1468 of 13929 strings)
2022-05-19 10:09:26 +02:00
Artem
b2f6e46959 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1467 of 13929 strings)
2022-05-19 10:08:33 +02:00
Никита
921c792135 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1467 of 13929 strings)
2022-05-19 10:08:32 +02:00
Artem
08aba800ca Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1466 of 13929 strings)
2022-05-19 10:06:58 +02:00
Никита
c62c71e64e Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1466 of 13929 strings)
2022-05-19 10:06:57 +02:00
Artem
a7ce535569 Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1463 of 13929 strings)
2022-05-19 10:04:19 +02:00
Никита
55237a6d1b Translated using Weblate (Ukrainian)
Currently translated at 10.5% (1463 of 13929 strings)
2022-05-19 10:04:18 +02:00
Jiri Zizkin Zizka
edd475d765 Translated using Weblate (Czech)
Currently translated at 90.2% (12576 of 13929 strings)
2022-05-18 02:40:56 +02:00
Artem
23d476c51d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (581 of 581 strings)
2022-05-17 22:18:32 +02:00
Никита
a825707748 Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1461 of 13929 strings)
2022-05-17 22:18:32 +02:00
Artem
072e75e0fb Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1461 of 13929 strings)
2022-05-17 22:18:31 +02:00
Jiri Zizkin Zizka
68c88c424e Translated using Weblate (Czech)
Currently translated at 90.1% (12555 of 13929 strings)
2022-05-17 22:18:30 +02:00
Artem
6ef7703cc9 Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1459 of 13929 strings)
2022-05-16 23:07:37 +02:00
Никита
2047d2230f Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1459 of 13929 strings)
2022-05-16 23:07:37 +02:00
Никита
0c938b1505 Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1458 of 13929 strings)
2022-05-16 23:04:47 +02:00
Artem
559e01e6e9 Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1458 of 13929 strings)
2022-05-16 23:04:46 +02:00
Никита
fa851fd05d Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1457 of 13929 strings)
2022-05-16 23:04:26 +02:00
Artem
b812e7f3c2 Translated using Weblate (Ukrainian)
Currently translated at 10.4% (1457 of 13929 strings)
2022-05-16 23:04:25 +02:00
Jiri Zizkin Zizka
bd56757e7e Translated using Weblate (Czech)
Currently translated at 89.6% (12488 of 13929 strings)
2022-05-15 14:51:25 +02:00
Tanja Orme
ec8d851211 Translated using Weblate (Esperanto)
Currently translated at 0.7% (99 of 13928 strings)
2022-05-14 13:15:56 +02:00
Tanja Orme
81700155e6 Translated using Weblate (Esperanto)
Currently translated at 18.4% (107 of 581 strings)
2022-05-14 13:15:54 +02:00
Jiri Zizkin Zizka
6e12754d47 Translated using Weblate (Czech)
Currently translated at 89.3% (12446 of 13929 strings)
2022-05-08 18:34:57 +02:00
Lucas Araujo
0459c66b3d Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (13929 of 13929 strings)
2022-05-08 18:34:55 +02:00
Kerem Yavuz Kaya
daf4da54c4 Translated using Weblate (Turkish)
Currently translated at 38.6% (5381 of 13929 strings)
2022-05-07 05:12:13 +02:00
Juan Manuel Alcantar Ramirez
e809006eba Added translation using Weblate (Latin) 2022-05-05 13:44:35 +02:00
Jiri Zizkin Zizka
1775fa3ae1 Translated using Weblate (Czech)
Currently translated at 89.3% (12440 of 13929 strings)
2022-05-05 13:32:51 +02:00
Daniel Stasiak
bf49318d9b Translated using Weblate (Polish)
Currently translated at 99.6% (13886 of 13929 strings)
2022-05-05 13:32:48 +02:00
Aji
927fafd708 Translated using Weblate (Indonesian)
Currently translated at 17.2% (2404 of 13929 strings)
2022-05-05 13:32:45 +02:00
Jiri Zizkin Zizka
2afd109e4a Translated using Weblate (Czech)
Currently translated at 87.5% (12189 of 13929 strings)
2022-04-29 10:38:21 +02:00
Jiri Zizkin Zizka
765617ea52 Translated using Weblate (Czech)
Currently translated at 87.2% (12152 of 13929 strings)
2022-04-28 22:09:25 +02:00
Jiri Zizkin Zizka
35cf007569 Translated using Weblate (Czech)
Currently translated at 87.1% (12137 of 13929 strings)
2022-04-27 04:50:07 +02:00
Jiri Zizkin Zizka
54f358858b Translated using Weblate (Czech)
Currently translated at 87.1% (12136 of 13929 strings)
2022-04-25 13:10:54 +02:00
Jiri Zizkin Zizka
6cd22e3f63 Translated using Weblate (Czech)
Currently translated at 87.0% (12121 of 13929 strings)
2022-04-24 22:14:47 +02:00
Jiri Zizkin Zizka
a2cef1376d Translated using Weblate (Czech)
Currently translated at 86.0% (11984 of 13929 strings)
2022-04-23 16:33:23 +02:00
Jiri Zizkin Zizka
8d8ae8227b Translated using Weblate (Czech)
Currently translated at 85.4% (11908 of 13929 strings)
2022-04-23 00:41:20 +02:00
Lucas Araujo
cdefb95056 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-23 00:41:18 +02:00
徐雪开
1f3a7e147f Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2022-04-22 14:58:45 +02:00
徐雪开
062f2157c0 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-22 14:58:44 +02:00
徐雪开
1a2087b2d3 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (13886 of 13929 strings)
2022-04-22 00:45:41 +02:00
Jiri Zizkin Zizka
f725349590 Translated using Weblate (Czech)
Currently translated at 85.4% (11905 of 13929 strings)
2022-04-21 21:47:00 +02:00
ilya
fc3c070a96 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-21 21:46:58 +02:00
Jiri Zizkin Zizka
e06f10ca41 Translated using Weblate (Czech)
Currently translated at 84.7% (11811 of 13929 strings)
2022-04-19 18:12:13 +02:00
ilya
062469c955 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-19 18:12:10 +02:00
Daniel Stasiak
c780518fc1 Translated using Weblate (Polish)
Currently translated at 99.6% (13884 of 13929 strings)
2022-04-19 18:12:08 +02:00
Meiru
a88d346325 Translated using Weblate (Japanese)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-19 18:12:06 +02:00
antonpaidoslalin
fb7af524e8 Translated using Weblate (Galician)
Currently translated at 9.8% (57 of 581 strings)
2022-04-18 01:11:55 +02:00
Jiri Zizkin Zizka
e6dfa8db68 Translated using Weblate (Czech)
Currently translated at 83.8% (11680 of 13929 strings)
2022-04-18 01:11:53 +02:00
Oleg
e491ab4abf Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-18 01:11:51 +02:00
ilya
a61038c74b Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-18 01:11:51 +02:00
Derik Douglas Jesus da Silva
bfc843f496 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-18 01:11:49 +02:00
Daniel Stasiak
696d1f086e Translated using Weblate (Polish)
Currently translated at 99.5% (13861 of 13929 strings)
2022-04-18 01:11:47 +02:00
Meiru
7f0a9a1588 Translated using Weblate (Japanese)
Currently translated at 99.9% (13928 of 13929 strings)
2022-04-18 01:11:44 +02:00
Виталий
07568b15d0 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 15:01:36 +02:00
ilya
17461da8f3 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 15:01:35 +02:00
Виталий
964ec8a276 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 15:00:21 +02:00
ilya
7d65ddf25d Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 15:00:20 +02:00
Виталий
2661badb73 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 14:59:44 +02:00
ilya
9a3fbdf7d9 Translated using Weblate (Russian)
Currently translated at 100.0% (13929 of 13929 strings)
2022-04-16 14:59:44 +02:00
Nut.andor
7c4ba2b2c7 release notes 2022-04-16 08:07:37 +02:00
Nut.andor
0368c112ad title translation fixed 2022-04-16 07:11:17 +02:00
Nut Andor
1cd759d12a Translated using Weblate (German)
Currently translated at 100.0% (581 of 581 strings)
2022-04-16 07:06:57 +02:00
Nut.andor
0d73255de0 Uncompressed release version 2022-04-16 06:43:34 +02:00
Nut.andor
7f0499c701 rename to prod version build, without debuggable and read_log 2022-04-15 16:50:31 +02:00
Nut.andor
09656bc4bf potc 2022-04-15 12:48:41 +02:00
Nut.andor
5ab945b739 potc 2022-04-15 12:45:41 +02:00
Nut.andor
f47d395b94 translation status, without debug 2022-04-15 12:30:59 +02:00
Nut.andor
dba2900213 new content (bug fixes) 2022-04-15 11:58:33 +02:00
Nut.andor
cb8ef5e790 Merge remote-tracking branch 'AndorsTrailRelease/master' 2022-04-15 11:48:54 +02:00
Nut.andor
426f4078a9 Merge remote-tracking branch 'Weblate_translations/master'
# Conflicts:
#	AndorsTrail/assets/translation/de.po
#	AndorsTrail/assets/translation/fr.po
#	AndorsTrail/assets/translation/ja.po
#	AndorsTrail/assets/translation/pt_BR.po
#	AndorsTrail/assets/translation/ru.po
2022-04-15 11:43:51 +02:00
Jiri Zizkin Zizka
4fdbd3d330 Translated using Weblate (Czech)
Currently translated at 84.0% (11631 of 13843 strings)
2022-04-15 11:26:47 +02:00
Lu Xu
384c1b9c0d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-15 11:26:46 +02:00
Derik Douglas Jesus da Silva
075a99f657 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.1% (13730 of 13843 strings)
2022-04-15 11:26:44 +02:00
Jiri Zizkin Zizka
b9f426cc9b Translated using Weblate (Czech)
Currently translated at 83.9% (11616 of 13843 strings)
2022-04-14 16:04:02 +02:00
Derik Douglas Jesus da Silva
49a613ce0b Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.1% (13728 of 13843 strings)
2022-04-14 16:04:00 +02:00
Jiri Zizkin Zizka
a3cb939253 Translated using Weblate (Czech)
Currently translated at 83.6% (11577 of 13843 strings)
2022-04-13 15:55:21 +02:00
Lucas Araujo
824c0579c9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.0% (13706 of 13843 strings)
2022-04-13 15:55:09 +02:00
MARCO ACORTE
44902f35ea Translated using Weblate (Italian)
Currently translated at 90.8% (12570 of 13843 strings)
2022-04-13 15:55:07 +02:00
Jiri Zizkin Zizka
ca25d413ad Translated using Weblate (Czech)
Currently translated at 82.6% (11447 of 13843 strings)
2022-04-12 03:16:05 +02:00
Lucas Araujo
9d33993d61 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.2% (13600 of 13843 strings)
2022-04-12 03:16:03 +02:00
Jiri Zizkin Zizka
be48ef66f1 Translated using Weblate (Czech)
Currently translated at 82.5% (11431 of 13843 strings)
2022-04-11 08:11:08 +02:00
ilya
2062be506f Translated using Weblate (Russian)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-10 00:15:00 +02:00
ilya
0eecde9ee4 Translated using Weblate (Russian)
Currently translated at 98.9% (13702 of 13843 strings)
2022-04-09 21:49:21 +02:00
ilya
d4cbed9d35 Translated using Weblate (Russian)
Currently translated at 98.9% (13701 of 13843 strings)
2022-04-09 21:49:19 +02:00
Oleg
e33e75846c Translated using Weblate (Russian)
Currently translated at 98.9% (13701 of 13843 strings)
2022-04-09 21:49:19 +02:00
Nut.andor
5378279d46 v0.7.17dev
package="com.gpl.rpg.AndorsTrail_beta1"
2022-04-08 23:30:14 +02:00
Nut.andor
cc6a573ef0 next version,
together with critical bugfix
2022-04-08 21:11:52 +02:00
Roman Leo
2821c2b8fc Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-08 07:24:44 +02:00
Jiri Zizkin Zizka
0b72a1a603 Translated using Weblate (Czech)
Currently translated at 82.5% (11423 of 13843 strings)
2022-04-07 09:35:03 +02:00
Roman Leo
f19314713f Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-07 09:35:01 +02:00
Jiri Zizkin Zizka
370a4fedd7 Translated using Weblate (Czech)
Currently translated at 82.3% (11402 of 13843 strings)
2022-04-06 08:28:57 +02:00
Roman Leo
57acd95706 Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-06 08:28:55 +02:00
Jiri Zizkin Zizka
f5a93e170c Translated using Weblate (Czech)
Currently translated at 81.9% (11348 of 13843 strings)
2022-04-05 01:12:10 +02:00
Jiri Zizkin Zizka
53cb4853e3 Translated using Weblate (Czech)
Currently translated at 81.7% (11319 of 13843 strings)
2022-04-04 03:48:08 +02:00
ilya
8e27d57868 Translated using Weblate (Russian)
Currently translated at 95.8% (13267 of 13843 strings)
2022-04-04 03:48:06 +02:00
Roman Leo
05107b2f55 Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-04 03:48:03 +02:00
Kristoffer Grundström
3a4d5ae9c5 Translated using Weblate (Swedish)
Currently translated at 4.9% (684 of 13843 strings)
2022-04-03 13:14:18 +02:00
Oleg
0875850589 Translated using Weblate (Russian)
Currently translated at 95.7% (13254 of 13843 strings)
2022-04-02 20:41:16 +02:00
Roman Leo
d2b86b502a Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-04-02 20:41:14 +02:00
Nut.andor
7447df12cf next dev version 17 (64) 2022-04-02 14:37:12 +02:00
Nut.andor
ba34e16290 Merge remote-tracking branch 'local_AndorsTrailRelease/master'
# Conflicts:
#	AndorsTrail/res/values/loadresources.xml
2022-04-02 14:34:45 +02:00
Jiri Zizkin Zizka
1998d1ec90 Translated using Weblate (Czech)
Currently translated at 81.6% (11305 of 13843 strings)
2022-04-02 09:14:33 +02:00
Jiri Zizkin Zizka
3c2a70fdeb Translated using Weblate (Czech)
Currently translated at 81.4% (11281 of 13843 strings)
2022-03-30 09:02:27 +02:00
Jiri Zizkin Zizka
d94f7a5907 Translated using Weblate (Czech)
Currently translated at 81.3% (11268 of 13843 strings)
2022-03-28 22:21:39 +02:00
Oleg
97ad665ac0 Translated using Weblate (Russian)
Currently translated at 95.4% (13209 of 13843 strings)
2022-03-28 22:21:38 +02:00
Roman Leo
2f758b6e4a Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-28 22:21:36 +02:00
Nut.andor
b4e446e8d0 Merge remote-tracking branch 'Andors-Trail/delivery' 2022-03-27 15:37:55 +02:00
Nut.andor
63dfff7f7a release 2022-03-27 15:35:53 +02:00
Jiri Zizkin Zizka
3369b135d7 Translated using Weblate (Czech)
Currently translated at 81.3% (11259 of 13843 strings)
2022-03-27 01:52:05 +01:00
Oleg
70a9b45591 Translated using Weblate (Russian)
Currently translated at 95.4% (13208 of 13843 strings)
2022-03-27 01:52:03 +01:00
Roman Leo
71b9ac54b1 Translated using Weblate (French)
Currently translated at 89.0% (12324 of 13843 strings)
2022-03-27 01:51:59 +01:00
Roman Leo
74ac5289dd Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-27 01:51:58 +01:00
Roman Leo
01bd80db53 Translated using Weblate (German)
Currently translated at 100.0% (581 of 581 strings)
2022-03-27 01:51:54 +01:00
Jiri Zizkin Zizka
a1bcbf7c7a Translated using Weblate (Czech)
Currently translated at 81.1% (11240 of 13843 strings)
2022-03-25 19:10:45 +01:00
Roman Leo
2b6e4606b2 Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-25 19:10:43 +01:00
Roman Leo
c65811b89f Translated using Weblate (German)
Currently translated at 100.0% (581 of 581 strings)
2022-03-25 19:10:41 +01:00
Roman Leo
15450b8b8b Translated using Weblate (Spanish)
Currently translated at 99.6% (579 of 581 strings)
2022-03-24 18:57:37 +01:00
Jiri Zizkin Zizka
f2d4fb6b88 Translated using Weblate (Czech)
Currently translated at 81.1% (11232 of 13843 strings)
2022-03-24 18:57:37 +01:00
Roman Leo
5735df8a6b Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-24 18:57:35 +01:00
Roman Leo
19b1f19535 Translated using Weblate (German)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-23 19:22:06 +01:00
Roman Leo
28c3f5228d Translated using Weblate (German)
Currently translated at 99.8% (13821 of 13843 strings)
2022-03-23 17:04:15 +01:00
Oleg
b5c4d77ad8 Translated using Weblate (Russian)
Currently translated at 92.7% (12833 of 13843 strings)
2022-03-23 17:03:22 +01:00
Roman Leo
60fae8adde Translated using Weblate (German)
Currently translated at 99.8% (13817 of 13843 strings)
2022-03-23 17:03:20 +01:00
Oleg
97810e12f0 Translated using Weblate (Russian)
Currently translated at 92.4% (12804 of 13843 strings)
2022-03-23 15:26:21 +01:00
Jiri Zizkin Zizka
13f01c5f77 Translated using Weblate (Czech)
Currently translated at 80.3% (11120 of 13843 strings)
2022-03-23 15:26:09 +01:00
Oleg
36424f1888 Translated using Weblate (Russian)
Currently translated at 92.4% (12803 of 13843 strings)
2022-03-23 15:26:07 +01:00
Roman Leo
003aea1aeb Translated using Weblate (German)
Currently translated at 97.5% (13504 of 13843 strings)
2022-03-23 15:26:04 +01:00
Jiri Zizkin Zizka
2d61fcd3ef Translated using Weblate (Czech)
Currently translated at 79.8% (11059 of 13843 strings)
2022-03-22 00:01:57 +01:00
Oleg
ccd012b085 Translated using Weblate (Russian)
Currently translated at 92.0% (12740 of 13843 strings)
2022-03-22 00:01:55 +01:00
Roman Leo
933dcb94af Translated using Weblate (German)
Currently translated at 94.8% (13124 of 13843 strings)
2022-03-22 00:01:52 +01:00
Roman Leo
15899693eb Translated using Weblate (German)
Currently translated at 100.0% (581 of 581 strings)
2022-03-22 00:01:48 +01:00
Ido Shdaimah
663c9d68d2 Translated using Weblate (Hebrew)
Currently translated at 1.5% (215 of 13842 strings)
2022-03-19 23:35:27 +01:00
Jiri Zizkin Zizka
f058351e78 Translated using Weblate (Czech)
Currently translated at 79.7% (11033 of 13843 strings)
2022-03-19 23:35:25 +01:00
cheese1
2b591c4d3d Translated using Weblate (German)
Currently translated at 91.5% (12680 of 13843 strings)
2022-03-19 23:35:22 +01:00
Jiri Zizkin Zizka
dd92baa08a Translated using Weblate (Czech)
Currently translated at 79.2% (10966 of 13843 strings)
2022-03-16 21:58:34 +01:00
이정희
0a4656054d Translated using Weblate (Korean)
Currently translated at 10.0% (1397 of 13843 strings)
2022-03-16 15:59:08 +01:00
이정희
804ae432e3 Translated using Weblate (Korean)
Currently translated at 100.0% (581 of 581 strings)
2022-03-15 09:54:38 +01:00
Jiri Zizkin Zizka
bba9d927e2 Translated using Weblate (Czech)
Currently translated at 79.1% (10960 of 13843 strings)
2022-03-15 09:54:38 +01:00
Luiz-bro
e9419f09f1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.9% (13559 of 13843 strings)
2022-03-15 09:54:36 +01:00
이정희
f0a4f06db4 Translated using Weblate (Korean)
Currently translated at 10.0% (1397 of 13843 strings)
2022-03-15 09:54:34 +01:00
Jiri Zizkin Zizka
2f02728612 Translated using Weblate (Czech)
Currently translated at 78.8% (10916 of 13843 strings)
2022-03-13 00:59:10 +01:00
Jiri Zizkin Zizka
f4c366cb03 Translated using Weblate (Czech)
Currently translated at 78.8% (10915 of 13843 strings)
2022-03-10 01:58:50 +01:00
Nee Chee
e6d6892904 Translated using Weblate (Czech)
Currently translated at 78.7% (10897 of 13843 strings)
2022-03-08 18:34:53 +01:00
aircqsj
df13484872 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-08 18:34:51 +01:00
Meiru
86f4bd2e7e Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-03-08 18:34:49 +01:00
DragonChen TW
d04e8eebb7 Translated using Weblate (Chinese (Traditional))
Currently translated at 6.9% (968 of 13843 strings)
2022-03-07 17:58:14 +01:00
Jiri Zizkin Zizka
13ae770c1b Translated using Weblate (Czech)
Currently translated at 78.6% (10888 of 13843 strings)
2022-03-04 22:56:44 +01:00
Lucas Araujo
5b38d848e0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.5% (13506 of 13843 strings)
2022-03-04 22:56:42 +01:00
Jiri Zizkin Zizka
73838a501b Translated using Weblate (Czech)
Currently translated at 78.2% (10831 of 13843 strings)
2022-03-01 10:51:49 +01:00
Jiri Zizkin Zizka
e7365bc325 Translated using Weblate (Czech)
Currently translated at 78.1% (10816 of 13843 strings)
2022-02-28 11:35:32 +01:00
Meiru
181abaaad2 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-02-28 11:35:30 +01:00
Jiri Zizkin Zizka
c6ca78f86b Translated using Weblate (Czech)
Currently translated at 77.9% (10796 of 13843 strings)
2022-02-26 07:57:06 +01:00
Reza Almanda
65dc7ea0e9 Translated using Weblate (Indonesian)
Currently translated at 16.7% (2325 of 13843 strings)
2022-02-26 07:57:04 +01:00
Jiri Zizkin Zizka
2386afe711 Translated using Weblate (Czech)
Currently translated at 77.9% (10792 of 13843 strings)
2022-02-24 15:25:33 +01:00
MARCO ACORTE
4b10abe018 Translated using Weblate (Italian)
Currently translated at 90.6% (12554 of 13843 strings)
2022-02-23 07:55:32 +01:00
MARCO ACORTE
c83e36fe2d Translated using Weblate (Italian)
Currently translated at 100.0% (581 of 581 strings)
2022-02-22 11:55:13 +01:00
MARCO ACORTE
e6200487d0 Translated using Weblate (Italian)
Currently translated at 90.8% (12578 of 13843 strings)
2022-02-22 11:40:59 +01:00
Jiri Zizkin Zizka
aa1ae1622a Translated using Weblate (Czech)
Currently translated at 77.8% (10770 of 13843 strings)
2022-02-22 08:52:12 +01:00
Jiri Zizkin Zizka
8231b6db06 Translated using Weblate (Czech)
Currently translated at 77.6% (10745 of 13843 strings)
2022-02-20 09:22:50 +01:00
Lucas Araujo
37c7575279 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.1% (13451 of 13843 strings)
2022-02-20 09:22:48 +01:00
عادل نصري
6985cecafb Translated using Weblate (Arabic)
Currently translated at 10.1% (1401 of 13842 strings)
2022-02-18 22:31:13 +01:00
hello123
e86d053b6a Translated using Weblate (Chinese (Traditional))
Currently translated at 6.9% (958 of 13843 strings)
2022-02-18 22:31:11 +01:00
Jiri Zizkin Zizka
2e65700f81 Translated using Weblate (Czech)
Currently translated at 77.5% (10738 of 13843 strings)
2022-02-18 22:31:09 +01:00
عادل نصري
a2514cc58f Translated using Weblate (Arabic)
Currently translated at 10.0% (1391 of 13842 strings)
2022-02-18 12:07:23 +01:00
hello123
b3e8ef7927 Translated using Weblate (Chinese (Traditional))
Currently translated at 6.1% (850 of 13843 strings)
2022-02-18 12:07:21 +01:00
Jiri Zizkin Zizka
37d204b93d Translated using Weblate (Czech)
Currently translated at 77.5% (10736 of 13843 strings)
2022-02-18 12:07:06 +01:00
Nut.andor
9d76227d70 Merge remote-tracking branch 'Andors-Trail/delivery' 2022-02-17 21:04:37 +01:00
Nut.andor
f7039a855a beta 2022-02-17 21:00:45 +01:00
عادل نصري
d53c91b19a Translated using Weblate (Arabic)
Currently translated at 9.4% (1307 of 13842 strings)
2022-02-17 19:29:01 +01:00
عادل نصري
b48e1aa254 Translated using Weblate (Arabic)
Currently translated at 9.2% (1277 of 13842 strings)
2022-02-17 16:01:42 +01:00
Jiri Zizkin Zizka
fc773b5721 Translated using Weblate (Czech)
Currently translated at 77.4% (10720 of 13843 strings)
2022-02-17 16:01:40 +01:00
Lucas Araujo
b956f4ca93 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.8% (13409 of 13843 strings)
2022-02-17 16:01:38 +01:00
Jiri Zizkin Zizka
99c4c3a6f4 Translated using Weblate (Czech)
Currently translated at 77.4% (10716 of 13843 strings)
2022-02-17 00:08:37 +01:00
Lucas Araujo
2dfadcaa8f Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.6% (13373 of 13843 strings)
2022-02-17 00:08:35 +01:00
Jiri Zizkin Zizka
d52622b4fd Translated using Weblate (Czech)
Currently translated at 77.2% (10691 of 13843 strings)
2022-02-16 15:56:00 +01:00
Nut.andor
2334a91a5a Potsc + export (loadressource) 2022-02-15 23:58:11 +01:00
Nut.andor
4bb9baa662 potc 2022-02-15 23:56:49 +01:00
Nut.andor
d89bce96d5 Merge remote-tracking branch 'Andors-Trail/delivery' 2022-02-15 23:45:26 +01:00
Nut.andor
aaac6ae3b5 close and merge to release master 2022-02-15 23:42:45 +01:00
Nut.andor
ade84de6e9 new translations from weblate 2022-02-15 23:36:56 +01:00
Nut.andor
7538593036 prepare v0716 step1 2022-02-15 23:32:51 +01:00
Jiri Zizkin Zizka
8daa49916b Translated using Weblate (Czech)
Currently translated at 77.1% (10674 of 13843 strings)
2022-02-15 06:30:29 +01:00
Nut.andor
0e41a885e3 Delivery 2022-02-13 18:44:23 +01:00
Nut.andor
93a00755da authors 2022-02-13 18:39:52 +01:00
Nut.andor
fe89818bb7 Merge remote-tracking branch 'hosted.weblate/master' 2022-02-13 17:26:50 +01:00
Jiri Zizkin Zizka
e9bbe0a2d2 Translated using Weblate (Czech)
Currently translated at 76.8% (10636 of 13843 strings)
2022-02-13 17:25:11 +01:00
Meiru
564f809591 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-02-13 17:25:09 +01:00
Nut.andor
ee2d6258d3 preparation of next release 2022-02-13 17:21:05 +01:00
Jiri Zizkin Zizka
e85b6c447a Translated using Weblate (Czech)
Currently translated at 76.6% (10607 of 13843 strings)
2022-02-12 03:45:14 +01:00
Lucas Araujo
2315b6821a Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.9% (13287 of 13843 strings)
2022-02-12 03:45:12 +01:00
Alessandro Perlo
7112d447ac Translated using Weblate (Italian)
Currently translated at 100.0% (581 of 581 strings)
2022-02-12 03:44:54 +01:00
Jiri Zizkin Zizka
d12dc80986 Translated using Weblate (Czech)
Currently translated at 76.4% (10586 of 13843 strings)
2022-02-09 18:33:32 +01:00
Lucas Araujo
ec0fd22292 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.0% (13164 of 13843 strings)
2022-02-09 18:33:30 +01:00
Jiri Zizkin Zizka
b01615f23b Translated using Weblate (Czech)
Currently translated at 75.6% (10470 of 13843 strings)
2022-02-07 12:07:13 +01:00
Jiri Zizkin Zizka
bcc1e0fa34 Translated using Weblate (Czech)
Currently translated at 75.6% (10468 of 13843 strings)
2022-02-07 10:09:17 +01:00
Jiri Zizkin Zizka
a08df47db9 Translated using Weblate (Czech)
Currently translated at 75.5% (10459 of 13843 strings)
2022-02-06 18:58:12 +01:00
Jiri Zizkin Zizka
ce0318f450 Translated using Weblate (Czech)
Currently translated at 75.4% (10444 of 13843 strings)
2022-02-05 07:03:32 +01:00
Jiri Zizkin Zizka
cebde22296 Translated using Weblate (Czech)
Currently translated at 75.4% (10440 of 13843 strings)
2022-02-03 21:53:05 +01:00
Lucas Araujo
7e98398501 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.0% (13158 of 13843 strings)
2022-02-03 05:43:35 +01:00
Joel A
287324a0d7 Translated using Weblate (Swedish)
Currently translated at 4.9% (682 of 13843 strings)
2022-02-02 23:30:45 +01:00
Jiri Zizkin Zizka
c4c0cde086 Translated using Weblate (Czech)
Currently translated at 75.3% (10434 of 13843 strings)
2022-02-02 23:30:43 +01:00
Anderson Nogueira Silva
a57b935fc8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.2% (13050 of 13843 strings)
2022-02-02 23:30:41 +01:00
Lucas Araujo
2f532e2ff4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.2% (13050 of 13843 strings)
2022-02-02 23:30:40 +01:00
Meiru
ea6b7f3dd0 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-02-02 23:30:38 +01:00
Jiri Zizkin Zizka
213158c8d5 Translated using Weblate (Czech)
Currently translated at 75.2% (10423 of 13843 strings)
2022-02-01 01:28:59 +01:00
Lucas Araujo
223c3dcfe9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.4% (12943 of 13843 strings)
2022-02-01 00:06:44 +01:00
Lucas Araujo
9e9025bb6b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (581 of 581 strings)
2022-02-01 00:06:42 +01:00
Lucas Araujo
a6e2453b1c Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.1% (12890 of 13843 strings)
2022-01-31 16:54:26 +01:00
Lucas Araujo
5c1c08850e Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (581 of 581 strings)
2022-01-31 16:54:24 +01:00
Jiri Zizkin Zizka
c1e815714d Translated using Weblate (Czech)
Currently translated at 75.2% (10421 of 13843 strings)
2022-01-31 14:53:31 +01:00
Nut Andor
3f0ac4b217 Translated using Weblate (German)
Currently translated at 91.5% (12667 of 13843 strings)
2022-01-31 14:53:29 +01:00
cheese1
7b5d0fc607 Translated using Weblate (German)
Currently translated at 91.5% (12667 of 13843 strings)
2022-01-31 14:53:28 +01:00
cheese1
095ae727c1 Translated using Weblate (German)
Currently translated at 100.0% (581 of 581 strings)
2022-01-31 14:53:27 +01:00
Jiri Zizkin Zizka
fa3cf821aa Translated using Weblate (Czech)
Currently translated at 74.9% (10370 of 13843 strings)
2022-01-28 08:47:41 +01:00
Nicia
20acd6cffe Translated using Weblate (Russian)
Currently translated at 90.6% (12554 of 13843 strings)
2022-01-28 08:47:39 +01:00
Meiru
57932e7ace Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-28 08:47:37 +01:00
Rhenaud Dubois
0785d33bf8 Translated using Weblate (French)
Currently translated at 89.0% (12322 of 13843 strings)
2022-01-28 08:47:34 +01:00
Meiru
86480f0863 Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-28 08:47:32 +01:00
Rhenaud Dubois
b2ce4c5448 Translated using Weblate (French)
Currently translated at 100.0% (581 of 581 strings)
2022-01-28 08:47:31 +01:00
Lacrom
71b4d173f5 Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:10:59 +01:00
Lacrom
c1776e1c19 Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:10:11 +01:00
Alexandre Jigue
7675cfd69f Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:10:11 +01:00
Rhenaud Dubois
7e9ff1e06b Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:10:10 +01:00
François D
40254a88b7 Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:10:10 +01:00
Alexandre Jigue
a001fd5378 Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:07:22 +01:00
Rhenaud Dubois
19cfe30d94 Translated using Weblate (French)
Currently translated at 86.5% (11987 of 13843 strings)
2022-01-27 17:07:21 +01:00
Jiri Zizkin Zizka
f775d36181 Translated using Weblate (Czech)
Currently translated at 74.7% (10346 of 13843 strings)
2022-01-26 11:10:20 +01:00
Burak Hüseyin Ekseli
3f407a6472 Translated using Weblate (Turkish)
Currently translated at 38.3% (5315 of 13843 strings)
2022-01-26 11:10:17 +01:00
Meiru
36801fea3a Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-26 11:10:15 +01:00
cheese1
3ac91ac56b Translated using Weblate (German)
Currently translated at 91.3% (12652 of 13843 strings)
2022-01-26 11:10:12 +01:00
Jiri Zizkin Zizka
ac3e6c1a8e Translated using Weblate (Czech)
Currently translated at 73.5% (10187 of 13843 strings)
2022-01-22 11:30:54 +01:00
Jiri Zizkin Zizka
4a0ba2c86b Translated using Weblate (Czech)
Currently translated at 73.4% (10166 of 13843 strings)
2022-01-22 08:45:54 +01:00
saoloer
c6152ad11c Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-22 08:45:52 +01:00
Jiri Zizkin Zizka
f8defcff9a Translated using Weblate (Czech)
Currently translated at 73.2% (10136 of 13843 strings)
2022-01-22 04:18:36 +01:00
Meiru
b8fc51c59e Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-22 04:18:34 +01:00
Meiru
606379d161 Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-22 04:18:32 +01:00
Nicia
cf40a2514e Translated using Weblate (Russian)
Currently translated at 90.6% (12553 of 13843 strings)
2022-01-22 01:10:54 +01:00
Jiri Zizkin Zizka
ef4d43bc0f Translated using Weblate (Czech)
Currently translated at 73.1% (10128 of 13843 strings)
2022-01-21 22:09:53 +01:00
Mallo123
26c327320b Translated using Weblate (German)
Currently translated at 91.3% (12652 of 13843 strings)
2022-01-21 22:09:51 +01:00
cheese1
abb113c308 Translated using Weblate (German)
Currently translated at 91.3% (12652 of 13843 strings)
2022-01-21 22:09:50 +01:00
Lucas Araujo
76df1b281a Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.1% (12888 of 13843 strings)
2022-01-20 19:19:21 +01:00
cheese1
682356f1c1 Translated using Weblate (German)
Currently translated at 91.3% (12642 of 13843 strings)
2022-01-20 19:18:33 +01:00
Jiri Zizkin Zizka
2466f09bd1 Translated using Weblate (Czech)
Currently translated at 72.7% (10066 of 13843 strings)
2022-01-20 03:14:55 +01:00
cheese1
5933f0047a Translated using Weblate (German)
Currently translated at 91.3% (12642 of 13843 strings)
2022-01-20 03:14:53 +01:00
عادل نصري
9519336a46 Translated using Weblate (Arabic)
Currently translated at 9.1% (1272 of 13842 strings)
2022-01-19 15:49:30 +01:00
Jiri Zizkin Zizka
d34d038e41 Translated using Weblate (Czech)
Currently translated at 72.6% (10057 of 13843 strings)
2022-01-19 15:49:28 +01:00
Ömer Faruk Çakmak
279446c117 Translated using Weblate (Turkish)
Currently translated at 37.3% (5176 of 13843 strings)
2022-01-19 15:49:26 +01:00
Meiru
13f8ab103b Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-19 15:49:23 +01:00
cheese1
d96422b731 Translated using Weblate (German)
Currently translated at 91.3% (12642 of 13843 strings)
2022-01-19 15:49:21 +01:00
Meiru
cde3074fa7 Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-19 15:49:20 +01:00
A B
6750292ec7 Translated using Weblate (Czech)
Currently translated at 72.1% (9990 of 13843 strings)
2022-01-16 04:34:51 +01:00
Jiri Zizkin Zizka
6054adede7 Translated using Weblate (Czech)
Currently translated at 71.8% (9947 of 13843 strings)
2022-01-14 10:36:33 +01:00
Meiru
a40a6a1a37 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-14 10:36:31 +01:00
Meiru
1471dd2adf Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-14 10:36:29 +01:00
Meiru
ca84e9d0e0 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-13 04:12:31 +01:00
cheese1
ba6c426a15 Translated using Weblate (German)
Currently translated at 91.3% (12640 of 13843 strings)
2022-01-13 04:12:29 +01:00
Meiru
625845aa46 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-12 10:34:21 +01:00
Jiri Zizkin Zizka
fdb144fed7 Translated using Weblate (Czech)
Currently translated at 71.8% (9947 of 13843 strings)
2022-01-12 01:25:17 +01:00
Meiru
9c3d6dabc0 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-12 01:25:15 +01:00
Jiri Zizkin Zizka
82b61b892b Translated using Weblate (Czech)
Currently translated at 71.7% (9933 of 13843 strings)
2022-01-11 13:58:00 +01:00
Daniel Stasiak
9f5ac80141 Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2022-01-11 13:57:59 +01:00
Meiru
3655c3a864 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-11 13:57:57 +01:00
Meiru
def18995f7 Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-11 13:57:54 +01:00
عادل نصري
96da21fb6b Translated using Weblate (Arabic)
Currently translated at 100.0% (581 of 581 strings)
2022-01-10 11:26:14 +01:00
عادل نصري
2b03b1e08e Translated using Weblate (Arabic)
Currently translated at 9.1% (1267 of 13842 strings)
2022-01-10 11:26:04 +01:00
刘韬
ee62ec432f Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2022-01-10 11:26:02 +01:00
Jiri Zizkin Zizka
6b7cc3e584 Translated using Weblate (Czech)
Currently translated at 71.6% (9914 of 13843 strings)
2022-01-10 11:26:01 +01:00
刘韬
a64f6161c6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-10 11:25:59 +01:00
Meiru
e7b0471e19 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-10 11:25:58 +01:00
Meiru
861791bdba Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2022-01-10 11:25:53 +01:00
Meiru
6135e5a014 Translated using Weblate (Japanese)
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-07 04:46:41 +01:00
Meiru
196a12a0aa Translated using Weblate (Japanese)
Currently translated at 99.7% (13806 of 13843 strings)
2022-01-06 15:49:52 +01:00
aircqsj
1881e0e0c5 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2022-01-06 09:25:06 +01:00
Daniel Stasiak
d9bddcc3bf Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2022-01-06 09:25:06 +01:00
Meiru
c12bdd60b5 Translated using Weblate (Japanese)
Currently translated at 99.6% (13790 of 13843 strings)
2022-01-06 09:25:04 +01:00
عادل نصري
b24ecb93aa Translated using Weblate (Arabic)
Currently translated at 32.5% (189 of 581 strings)
2022-01-05 11:55:07 +01:00
DragonChen TW
ad1fb9d6fe Translated using Weblate (Chinese (Traditional))
Currently translated at 3.9% (542 of 13843 strings)
2022-01-05 11:55:06 +01:00
DragonChen TW
d2ec4afa87 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2022-01-05 11:55:05 +01:00
Daniel Stasiak
f84b6d172c Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2022-01-05 11:55:03 +01:00
Meiru
a1893f3135 Translated using Weblate (Japanese)
Currently translated at 98.6% (13658 of 13843 strings)
2022-01-05 11:55:01 +01:00
Nut.andor
18f7acb1d3 fix doubled graveyard_corpse3 2022-01-04 22:41:33 +01:00
Jiri Zizkin Zizka
8a17bd7e84 Translated using Weblate (Czech)
Currently translated at 71.5% (9899 of 13843 strings)
2022-01-04 14:11:34 +01:00
David Tamas Szabo
381b7d17eb Translated using Weblate (Hungarian)
Currently translated at 30.1% (4174 of 13843 strings)
2022-01-03 20:24:06 +01:00
Meiru
0d93899544 Translated using Weblate (Japanese)
Currently translated at 98.3% (13618 of 13843 strings)
2022-01-03 20:24:04 +01:00
DragonChen TW
0263d60261 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.8% (538 of 13843 strings)
2022-01-03 06:44:33 +01:00
Jiri Zizkin Zizka
cd0d63aeac Translated using Weblate (Czech)
Currently translated at 71.5% (9898 of 13843 strings)
2022-01-03 06:44:32 +01:00
Meiru
b1275f1143 Translated using Weblate (Japanese)
Currently translated at 98.2% (13596 of 13843 strings)
2022-01-03 06:44:30 +01:00
Jiri Zizkin Zizka
698c344595 Translated using Weblate (Czech)
Currently translated at 100.0% (581 of 581 strings)
2022-01-02 13:31:38 +01:00
DragonChen TW
a553b0e927 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (581 of 581 strings)
2022-01-02 13:31:38 +01:00
DragonChen TW
988cf048a8 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.8% (534 of 13843 strings)
2022-01-02 13:31:37 +01:00
Jiri Zizkin Zizka
1ef94fe505 Translated using Weblate (Czech)
Currently translated at 71.3% (9883 of 13843 strings)
2022-01-02 13:31:35 +01:00
Meiru
751c4850a9 Translated using Weblate (Japanese)
Currently translated at 98.1% (13581 of 13843 strings)
2022-01-02 13:30:18 +01:00
Meiru
f9fc4b13b9 Translated using Weblate (Japanese)
Currently translated at 97.9% (13560 of 13843 strings)
2021-12-31 13:38:06 +01:00
Meiru
947494b82c Translated using Weblate (Japanese)
Currently translated at 97.5% (13502 of 13843 strings)
2021-12-31 08:55:32 +01:00
Elytra Wixzo
e6dc6c9535 Translated using Weblate (Filipino)
Currently translated at 46.8% (272 of 581 strings)
2021-12-31 08:01:46 +01:00
Elytra Wixzo
3f5ff64103 Translated using Weblate (Tagalog)
Currently translated at 100.0% (581 of 581 strings)
2021-12-31 08:01:43 +01:00
Elytra Wixzo
dc2b953dec Translated using Weblate (Filipino)
Currently translated at 2.0% (289 of 13842 strings)
2021-12-31 08:01:42 +01:00
SmallDragon Chen
74d3179157 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.8% (580 of 581 strings)
2021-12-31 08:01:40 +01:00
SmallDragon Chen
a002183f49 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.5% (486 of 13843 strings)
2021-12-31 08:01:40 +01:00
aircqsj
57919347d1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-31 08:01:38 +01:00
Daniel Stasiak
cfb7f8a0a7 Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2021-12-31 08:01:35 +01:00
Meiru
8cb6c8355a Translated using Weblate (Japanese)
Currently translated at 97.5% (13502 of 13843 strings)
2021-12-31 08:01:33 +01:00
Mateusz Mendel
a84cc8e9cc Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2021-12-30 00:25:30 +01:00
Daniel Stasiak
06c25297a4 Translated using Weblate (Polish)
Currently translated at 97.4% (13485 of 13843 strings)
2021-12-30 00:25:29 +01:00
Mateusz Mendel
ac8668e6f0 Translated using Weblate (Polish)
Currently translated at 97.3% (13475 of 13843 strings)
2021-12-28 22:54:02 +01:00
Daniel Stasiak
315d38d9b8 Translated using Weblate (Polish)
Currently translated at 97.3% (13475 of 13843 strings)
2021-12-28 22:54:00 +01:00
aircqsj
dbb106ba4e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-27 17:19:32 +01:00
Meiru
784401247d Translated using Weblate (Japanese)
Currently translated at 96.2% (13327 of 13843 strings)
2021-12-27 17:19:29 +01:00
aircqsj
48a2e6391b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-27 02:45:49 +01:00
Meiru
65ba89f74c Translated using Weblate (Japanese)
Currently translated at 95.9% (13278 of 13843 strings)
2021-12-27 02:45:38 +01:00
Nut.andor
2f922b93d7 prepare next version v0.7.16 63 2021-12-26 02:21:39 +01:00
aircqsj
6e72388e8e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-24 18:29:12 +01:00
Lucas Araujo
729060b367 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.8% (12852 of 13843 strings)
2021-12-24 18:29:05 +01:00
Meiru
a5da21d889 Translated using Weblate (Japanese)
Currently translated at 95.8% (13262 of 13843 strings)
2021-12-24 18:29:02 +01:00
aircqsj
51894a2c46 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-23 17:24:03 +01:00
Daniel Stasiak
49940c1803 Translated using Weblate (Polish)
Currently translated at 97.3% (13472 of 13843 strings)
2021-12-23 17:24:01 +01:00
Meiru
109461c22e Translated using Weblate (Japanese)
Currently translated at 95.1% (13177 of 13843 strings)
2021-12-23 17:23:59 +01:00
DawnGuo
613855a1fe Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-23 14:59:33 +01:00
aircqsj
53382be705 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-23 14:59:33 +01:00
孤舟听雨
6f0336d23d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-23 14:55:19 +01:00
aircqsj
06ba965f41 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (13843 of 13843 strings)
2021-12-23 14:55:18 +01:00
aircqsj
0e0e0b5f67 Translated using Weblate (Chinese (Simplified))
Currently translated at 77.9% (10785 of 13843 strings)
2021-12-21 20:17:51 +01:00
DawnGuo
4d58ca4cbf Translated using Weblate (Chinese (Simplified))
Currently translated at 77.9% (10785 of 13843 strings)
2021-12-21 20:17:48 +01:00
Daniel Stasiak
537617eeb5 Translated using Weblate (Polish)
Currently translated at 97.3% (13472 of 13843 strings)
2021-12-21 20:17:47 +01:00
Meiru
2daad62d08 Translated using Weblate (Japanese)
Currently translated at 94.0% (13023 of 13843 strings)
2021-12-21 20:17:44 +01:00
Reza Almanda
6d9779cca4 Translated using Weblate (Indonesian)
Currently translated at 16.7% (2323 of 13843 strings)
2021-12-21 20:17:42 +01:00
forheinn
30c27fadd9 Translated using Weblate (Indonesian)
Currently translated at 16.7% (2323 of 13843 strings)
2021-12-21 20:17:41 +01:00
DawnGuo
21e381b916 Translated using Weblate (Chinese (Simplified))
Currently translated at 75.3% (10437 of 13843 strings)
2021-12-21 11:56:50 +01:00
aircqsj
3ab543214e Translated using Weblate (Chinese (Simplified))
Currently translated at 75.3% (10437 of 13843 strings)
2021-12-21 11:56:50 +01:00
saoloer
565fb51370 Translated using Weblate (Chinese (Simplified))
Currently translated at 75.3% (10437 of 13843 strings)
2021-12-21 11:56:45 +01:00
aircqsj
a01bb1f861 Translated using Weblate (Chinese (Simplified))
Currently translated at 70.7% (9790 of 13843 strings)
2021-12-20 17:32:07 +01:00
saoloer
b3fc8b3be2 Translated using Weblate (Chinese (Simplified))
Currently translated at 70.7% (9790 of 13843 strings)
2021-12-20 17:32:06 +01:00
saoloer
019022de80 Translated using Weblate (Chinese (Simplified))
Currently translated at 70.1% (9705 of 13843 strings)
2021-12-20 14:42:32 +01:00
aircqsj
4fca247ad2 Translated using Weblate (Chinese (Simplified))
Currently translated at 70.1% (9705 of 13843 strings)
2021-12-20 14:42:32 +01:00
saoloer
ed8dc46f3c Translated using Weblate (Chinese (Simplified))
Currently translated at 70.0% (9697 of 13843 strings)
2021-12-19 17:27:36 +01:00
Meiru
41f711b30c Translated using Weblate (Japanese)
Currently translated at 93.2% (12904 of 13843 strings)
2021-12-19 17:27:34 +01:00
zoollcar
08027de85d Translated using Weblate (Chinese (Simplified))
Currently translated at 70.0% (9697 of 13843 strings)
2021-12-19 15:31:37 +01:00
Hao
d49f9f3320 Translated using Weblate (Chinese (Simplified))
Currently translated at 70.0% (9697 of 13843 strings)
2021-12-19 15:31:36 +01:00
Joel A
9e04008f9c Translated using Weblate (Swedish)
Currently translated at 4.9% (681 of 13843 strings)
2021-12-19 04:28:27 +01:00
Kristoffer Grundström
f38d9f7197 Translated using Weblate (Swedish)
Currently translated at 4.9% (681 of 13843 strings)
2021-12-19 04:28:26 +01:00
Daniel Stasiak
1728b5fa20 Translated using Weblate (Polish)
Currently translated at 97.3% (13472 of 13843 strings)
2021-12-19 04:28:25 +01:00
Meiru
2a85292274 Translated using Weblate (Japanese)
Currently translated at 92.6% (12827 of 13843 strings)
2021-12-19 04:28:23 +01:00
Nut.andor
3e534a7a47 Release notes 2021-12-18 22:42:55 +01:00
Nut.andor
4ff444511e Merge remote-tracking branch 'local_AndorsTrailRelease/master' 2021-12-18 17:04:17 +01:00
Hosted Weblate
337aba70d9 Merge branch 'origin/master' into Weblate. 2021-12-18 17:02:08 +01:00
Nut.andor
04fbbac774 Merge remote-tracking branch 'hosted.weblate/master' 2021-12-18 17:01:36 +01:00
Hosted Weblate
e96815f655 Merge branch 'origin/master' into Weblate. 2021-12-18 17:00:46 +01:00
forheinn
46c8a203d9 Translated using Weblate (Indonesian)
Currently translated at 100.0% (581 of 581 strings)
2021-12-18 16:42:12 +01:00
saoloer
3cf9ae4901 Translated using Weblate (Chinese (Simplified))
Currently translated at 69.7% (9659 of 13843 strings)
2021-12-18 16:42:12 +01:00
Meiru
f5f653e7ba Translated using Weblate (Japanese)
Currently translated at 92.4% (12792 of 13843 strings)
2021-12-18 16:42:10 +01:00
T. A. Wicaksono
f8e6d06d15 Translated using Weblate (Indonesian)
Currently translated at 16.6% (2301 of 13843 strings)
2021-12-18 16:41:52 +01:00
forheinn
92ef9dfc03 Translated using Weblate (Indonesian)
Currently translated at 16.6% (2301 of 13843 strings)
2021-12-18 16:41:51 +01:00
Nut.andor
d2193a9778 Merge fixes 2021-12-18 16:34:05 +01:00
Nut.andor
71e8afa949 release notes 2021-12-18 16:32:15 +01:00
Nut.andor
1289c24cf3 fix Ehrenfest reappear 2021-12-18 00:33:36 +01:00
forheinn
dabefad73d Translated using Weblate (Indonesian)
Currently translated at 15.4% (2132 of 13843 strings)
2021-12-17 14:39:34 +01:00
secyborg
a108eba3ed Translated using Weblate (Chinese (Simplified))
Currently translated at 69.6% (9644 of 13843 strings)
2021-12-17 14:24:12 +01:00
saoloer
f1f495bbe3 Translated using Weblate (Chinese (Simplified))
Currently translated at 69.6% (9644 of 13843 strings)
2021-12-17 14:24:12 +01:00
Daniel Stasiak
86986f8747 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-17 14:24:09 +01:00
Mateusz Mendel
e185b69b50 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-17 14:24:07 +01:00
Meiru
7c5000a0a9 Translated using Weblate (Japanese)
Currently translated at 92.1% (12753 of 13843 strings)
2021-12-17 14:24:04 +01:00
forheinn
edd12cce52 Translated using Weblate (Indonesian)
Currently translated at 15.2% (2117 of 13843 strings)
2021-12-17 14:24:02 +01:00
Nut.andor
1711bc87bd fix Ortholion's wrong staying,
large empty bottle,
Arghest won't take a potion anymore without opening the mine
2021-12-15 23:18:29 +01:00
saoloer
ea36be8461 Translated using Weblate (Chinese (Simplified))
Currently translated at 68.2% (9443 of 13843 strings)
2021-12-14 18:06:05 +01:00
saoloer
11ac7da4b5 Translated using Weblate (Chinese (Simplified))
Currently translated at 67.6% (9364 of 13843 strings)
2021-12-14 16:33:20 +01:00
Daniel Stasiak
e731bbbd29 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-14 16:33:18 +01:00
Daniel Stasiak
48566e0c32 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-14 14:38:25 +01:00
Meiru
2bd17ad956 Translated using Weblate (Japanese)
Currently translated at 91.3% (12643 of 13843 strings)
2021-12-14 14:38:22 +01:00
saoloer
0dd71e65b6 Translated using Weblate (Chinese (Simplified))
Currently translated at 67.3% (9322 of 13843 strings)
2021-12-14 10:16:28 +01:00
Mateusz Mendel
1cfd00bab3 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-14 10:16:26 +01:00
Daniel Stasiak
af36019345 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-14 10:16:25 +01:00
Meiru
d5a7fe353e Translated using Weblate (Japanese)
Currently translated at 91.0% (12601 of 13843 strings)
2021-12-14 10:16:23 +01:00
Daniel Stasiak
83975caa82 Translated using Weblate (Polish)
Currently translated at 97.2% (13467 of 13843 strings)
2021-12-13 11:36:29 +01:00
Meiru
01305e554a Translated using Weblate (Japanese)
Currently translated at 90.8% (12581 of 13843 strings)
2021-12-13 11:36:27 +01:00
Daniel Stasiak
0809baf6e5 Translated using Weblate (Polish)
Currently translated at 100.0% (581 of 581 strings)
2021-12-13 11:36:25 +01:00
Nut.andor
2c306a686e Merge remote-tracking branch 'Andors-Trail/master' 2021-12-12 15:57:21 +01:00
Nut.andor
6c2727d555 translation state 2021-12-12 15:56:35 +01:00
Nut.andor
05e50b3e74 Merge remote-tracking branch 'Andors-Trail/master' 2021-12-12 15:21:10 +01:00
Nut.andor
16f648ebfa new translations + POT 2021-12-12 15:17:49 +01:00
Nut.andor
f9006294e0 Merge remote-tracking branch 'Andors-Trail/master' 2021-12-12 15:06:42 +01:00
Nut.andor
0619ca591d Merge branch 'v0715' 2021-12-12 14:59:09 +01:00
Nut.andor
560eda1d42 Merge remote-tracking branch 'local_AndorsTrailRelease/master' 2021-12-12 14:58:21 +01:00
Nut.andor
535e6895ba version v0.7.15 #62 2021-12-12 14:55:03 +01:00
Nut.andor
827ca98b20 Merge remote-tracking branch 'hosted.weblate/master' 2021-12-12 14:31:33 +01:00
Nut Andor
47337edb53 Translated using Weblate (German)
Currently translated at 91.3% (12640 of 13844 strings)
2021-12-12 14:27:33 +01:00
saoloer
8b5f2213c1 Translated using Weblate (Chinese (Simplified))
Currently translated at 66.8% (9257 of 13844 strings)
2021-12-12 09:52:39 +01:00
saoloer
f2bd35db76 Translated using Weblate (Chinese (Simplified))
Currently translated at 66.8% (9250 of 13844 strings)
2021-12-12 05:45:47 +01:00
saoloer
338531c420 Translated using Weblate (Chinese (Simplified))
Currently translated at 66.7% (9244 of 13844 strings)
2021-12-11 18:06:28 +01:00
saoloer
62e635d29e Translated using Weblate (Chinese (Simplified))
Currently translated at 64.9% (8994 of 13844 strings)
2021-12-11 07:00:41 +01:00
Daniel Stasiak
75534f2b6a Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-12-11 07:00:36 +01:00
Meiru
80625cecdf Translated using Weblate (Japanese)
Currently translated at 90.7% (12570 of 13844 strings)
2021-12-11 07:00:34 +01:00
saoloer
c67a1d2863 Translated using Weblate (Chinese (Simplified))
Currently translated at 61.7% (8544 of 13844 strings)
2021-12-09 22:57:39 +01:00
Meiru
b04e3061d6 Translated using Weblate (Japanese)
Currently translated at 90.7% (12562 of 13844 strings)
2021-12-09 22:57:36 +01:00
Meiru
467937263b Translated using Weblate (Japanese)
Currently translated at 90.5% (12541 of 13844 strings)
2021-12-09 08:25:19 +01:00
Mateusz Mendel
555ae7b7d0 Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-12-08 23:07:08 +01:00
saoloer
9d62081e8e Translated using Weblate (Chinese (Simplified))
Currently translated at 59.5% (8244 of 13844 strings)
2021-12-08 19:14:44 +01:00
Mateusz Mendel
8d3ea3f86a Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-12-08 19:14:31 +01:00
Mateusz Mendel
2f452f51b7 Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-12-05 14:08:03 +01:00
saoloer
2416b12809 Translated using Weblate (Chinese (Simplified))
Currently translated at 54.4% (7544 of 13844 strings)
2021-12-04 02:02:02 +01:00
Lucas Araujo
8385687ea6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.7% (12845 of 13844 strings)
2021-12-04 02:01:58 +01:00
saoloer
abb133ddce Translated using Weblate (Chinese (Simplified))
Currently translated at 53.0% (7351 of 13844 strings)
2021-12-02 09:49:25 +01:00
Lucas Araujo
7645e35e08 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.5% (12818 of 13844 strings)
2021-12-02 09:49:24 +01:00
saoloer
e620081a57 Translated using Weblate (Chinese (Simplified))
Currently translated at 53.0% (7344 of 13844 strings)
2021-11-30 17:21:23 +01:00
saoloer
d00b208d05 Translated using Weblate (Chinese (Simplified))
Currently translated at 50.5% (7004 of 13844 strings)
2021-11-30 16:00:15 +01:00
protagnost
ffa0b2375c Translated using Weblate (Dutch)
Currently translated at 7.7% (1078 of 13844 strings)
2021-11-30 16:00:08 +01:00
saoloer
b318ee7d9c Translated using Weblate (Chinese (Simplified))
Currently translated at 44.8% (6214 of 13844 strings)
2021-11-25 20:03:25 +01:00
saoloer
31806c0153 Translated using Weblate (Chinese (Simplified))
Currently translated at 44.7% (6194 of 13844 strings)
2021-11-25 16:45:22 +01:00
Lucas Araujo
509830dc78 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.5% (12813 of 13844 strings)
2021-11-25 16:45:20 +01:00
Mateusz Mendel
f10f5e4a3a Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-11-25 16:45:18 +01:00
saoloer
0e7289c314 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2021-11-23 16:42:30 +01:00
soplatnik
3f1f87b195 Translated using Weblate (Basque)
Currently translated at 63.6% (370 of 581 strings)
2021-11-23 16:42:29 +01:00
saoloer
06ab0ad121 Translated using Weblate (Chinese (Simplified))
Currently translated at 44.5% (6164 of 13844 strings)
2021-11-23 16:42:29 +01:00
Lucas Araujo
d32b19b6cb Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.5% (12812 of 13844 strings)
2021-11-23 16:42:23 +01:00
Mateusz Mendel
594145d623 Translated using Weblate (Polish)
Currently translated at 90.5% (12538 of 13844 strings)
2021-11-20 23:45:13 +01:00
saoloer
6ebca0b3a1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2021-11-20 19:29:43 +01:00
saoloer
5bcfd5e1e7 Translated using Weblate (Chinese (Simplified))
Currently translated at 42.1% (5833 of 13844 strings)
2021-11-20 19:29:42 +01:00
saoloer
d3bfd737ce Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (581 of 581 strings)
2021-11-20 11:53:13 +01:00
saoloer
19d4e8180f Translated using Weblate (Chinese (Simplified))
Currently translated at 41.4% (5744 of 13844 strings)
2021-11-20 11:53:13 +01:00
Lucas Araujo
e205c1af94 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.1% (12759 of 13844 strings)
2021-11-20 11:53:08 +01:00
Lucas Araujo
76e6b02c05 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (581 of 581 strings)
2021-11-20 11:53:05 +01:00
Bugra Bezgin
9f37a5fb40 Translated using Weblate (Turkish)
Currently translated at 36.8% (5097 of 13844 strings)
2021-11-18 19:45:35 +01:00
Lucas Araujo
08ada52e75 Translated using Weblate (Portuguese (Brazil))
Currently translated at 90.9% (12590 of 13844 strings)
2021-11-18 19:45:33 +01:00
Nafek Norhadi
d22f079d3c Translated using Weblate (Indonesian)
Currently translated at 15.2% (2109 of 13844 strings)
2021-11-18 19:45:31 +01:00
Nurlan Aliyev
59d898b4ad Translated using Weblate (Azerbaijani)
Currently translated at 0.1% (3 of 13843 strings)
2021-11-18 11:55:37 +01:00
Lucas Araujo
b57e6fffa1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 90.9% (12587 of 13844 strings)
2021-11-18 11:55:36 +01:00
SC
bb1e7558e2 Translated using Weblate (Portuguese)
Currently translated at 82.7% (11462 of 13844 strings)
2021-11-18 11:55:33 +01:00
Lucas Araujo
96a64b0fe4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.9% (12458 of 13844 strings)
2021-11-16 22:05:41 +01:00
Кейро
e022de9e42 Translated using Weblate (Russian)
Currently translated at 90.4% (12517 of 13844 strings)
2021-11-14 20:52:34 +01:00
Lucas Araujo
8353231407 Translated using Weblate (Portuguese (Brazil))
Currently translated at 89.0% (12333 of 13844 strings)
2021-11-14 20:52:33 +01:00
Nut.andor
d45d1373de toast bugfix 2021-11-14 02:02:50 +01:00
Nut.andor
fda0becbf1 next version 2021-11-13 10:39:26 +01:00
Nut.andor
78ecc95382 Merge branch 'master' into v0715 2021-11-13 09:58:07 +01:00
Nut.andor
62fae625a4 Actualization NutANdor:master from actual release v0.78.14
Merge remote-tracking branch 'AndorsTrailRelease/master'
2021-11-13 09:52:52 +01:00
Кейро
ae48aa8bb8 Translated using Weblate (Russian)
Currently translated at 90.4% (12516 of 13844 strings)
2021-11-13 09:28:29 +01:00
Meiru
e2ce4a97bf Translated using Weblate (Japanese)
Currently translated at 90.4% (12527 of 13844 strings)
2021-11-13 09:28:27 +01:00
Alejandro Ruiz Medina
f713f9ac3d Translated using Weblate (Spanish)
Currently translated at 90.6% (12550 of 13844 strings)
2021-11-13 09:28:25 +01:00
Кейро
4cc25fcd84 Translated using Weblate (Russian)
Currently translated at 100.0% (581 of 581 strings)
2021-11-13 09:28:23 +01:00
Meiru
b71206232c Translated using Weblate (Japanese)
Currently translated at 90.4% (12526 of 13844 strings)
2021-11-12 09:52:35 +01:00
Jiri Zizkin Zizka
5db871a8d4 Translated using Weblate (Czech)
Currently translated at 100.0% (581 of 581 strings)
2021-11-10 16:51:35 +01:00
Meiru
78c9acc0ef Translated using Weblate (Japanese)
Currently translated at 90.4% (12518 of 13844 strings)
2021-11-10 16:51:35 +01:00
Alejandro Ruiz Medina
bc80d88c26 Translated using Weblate (Spanish)
Currently translated at 90.5% (12537 of 13844 strings)
2021-11-10 16:51:33 +01:00
Nut.andor
98efee7e46 Google Play description
Merge remote-tracking branch 'Andors-Trail/master'
2021-11-09 15:24:09 +01:00
Nut.andor
d9adf1239f store description 2021-11-09 15:19:47 +01:00
Nut.andor
f76ff77f65 whatsnew
Merge remote-tracking branch 'Andors-Trail/master'
2021-11-09 13:49:20 +01:00
Nut.andor
1e1dd0bb41 whatsnew 2021-11-09 13:45:11 +01:00
Reza Almanda
6b824f6fb7 Translated using Weblate (Indonesian)
Currently translated at 100.0% (581 of 581 strings)
2021-11-08 10:39:16 +01:00
Meiru
0cbb43fce0 Translated using Weblate (Japanese)
Currently translated at 90.3% (12512 of 13844 strings)
2021-11-08 10:39:16 +01:00
Reza Almanda
ac486c896a Translated using Weblate (Indonesian)
Currently translated at 15.2% (2109 of 13844 strings)
2021-11-08 10:39:14 +01:00
Meiru
9419b823aa Translated using Weblate (Japanese)
Currently translated at 100.0% (581 of 581 strings)
2021-11-08 10:39:12 +01:00
Nut.andor
969a4dd9b8 fix prim_guard7 2
Merge remote-tracking branch 'Andors-Trail/ATOmiRep'
2021-11-07 14:19:39 +01:00
Nut.andor
6f3a37d45c fix prim_guard7 2 2021-11-07 14:15:34 +01:00
Nut.andor
32e41dab18 fix Moyra reply 2 2021-11-07 13:27:02 +01:00
Nut.andor
c2b58d3fbd Merge remote-tracking branch 'Andors-Trail/ATOmiRep' 2021-11-07 13:26:42 +01:00
Nut.andor
19343cf27f fix Moyra reply 2 2021-11-07 13:22:14 +01:00
Nut.andor
52af9a5ded POTC 2021-11-07 12:50:18 +01:00
Nut.andor
9bc407c4a4 POTC 2021-11-07 12:49:44 +01:00
Nut.andor
e0365a7e5a fix Moyra reply 2021-11-07 12:37:45 +01:00
Nut.andor
8917a43ac8 Merge remote-tracking branch 'local_AndorsTrailRelease/master' into ATOmiRep 2021-11-07 12:22:41 +01:00
Nut.andor
1fe7e11fe7 Merge remote-tracking branch 'hosted.weblate/master' 2021-11-07 11:49:02 +01:00
Nut.andor
badce708d1 fix Moyra reply 2021-11-07 11:32:38 +01:00
Nut.andor
acf202b10c fix BWM32, actualize translation status 2021-11-07 11:28:57 +01:00
Nut.andor
100a93d28a fix BWM32, actualize translation status 2021-11-07 11:13:16 +01:00
SC
acd376652d Translated using Weblate (Portuguese (Brazil))
Currently translated at 88.7% (12287 of 13843 strings)
2021-11-05 11:56:03 +01:00
SC
15c78eb82f Translated using Weblate (Portuguese)
Currently translated at 82.5% (11429 of 13843 strings)
2021-11-05 11:56:01 +01:00
Oğuz Ersen
8e29e58595 Translated using Weblate (Turkish)
Currently translated at 100.0% (581 of 581 strings)
2021-11-04 00:42:44 +01:00
SC
6b2ad2af18 Translated using Weblate (Portuguese (Brazil))
Currently translated at 88.7% (12287 of 13843 strings)
2021-11-04 00:42:44 +01:00
SC
734e3b7590 Translated using Weblate (Portuguese)
Currently translated at 82.5% (11424 of 13843 strings)
2021-11-04 00:42:40 +01:00
Mallo123
7d74e3a9b2 Translated using Weblate (German)
Currently translated at 91.2% (12632 of 13843 strings)
2021-11-04 00:42:37 +01:00
SC
62987af1dc Translated using Weblate (Portuguese)
Currently translated at 100.0% (581 of 581 strings)
2021-11-04 00:42:34 +01:00
SC
76f12287cc Translated using Weblate (Portuguese)
Currently translated at 82.4% (11419 of 13843 strings)
2021-11-03 15:52:17 +01:00
Jiri Zizkin Zizka
17b2160eee Translated using Weblate (Czech)
Currently translated at 60.4% (8364 of 13843 strings)
2021-11-03 12:37:53 +01:00
Nut.andor
c018137910 Merge remote-tracking branch 'hosted.weblate/master'
# Conflicts:
#	AndorsTrail/assets/translation/cs.po
#	AndorsTrail/assets/translation/de.po
#	AndorsTrail/assets/translation/fr.po
2021-11-02 23:26:32 +01:00
Jiri Zizkin Zizka
0a53c932b2 Translated using Weblate (Czech)
Currently translated at 78.7% (9852 of 12512 strings)
2021-11-02 23:11:32 +01:00
Romain de Bossoreille
55def3f378 Translated using Weblate (French)
Currently translated at 95.7% (11982 of 12512 strings)
2021-11-02 23:11:31 +01:00
Nut Andor
9b58a2858b Translated using Weblate (German)
Currently translated at 99.9% (12509 of 12512 strings)
2021-11-02 23:11:29 +01:00
Alain
e98f1e000a Translated using Weblate (German)
Currently translated at 99.9% (12509 of 12512 strings)
2021-11-02 23:11:29 +01:00
Mallo123
8159c77645 Translated using Weblate (German)
Currently translated at 99.9% (12509 of 12512 strings)
2021-11-02 23:11:28 +01:00
Nut.andor
cf59c59202 POTComp by ATCS 2021-11-02 00:02:05 +01:00
Nut.andor
b1144aefab Merge remote-tracking branch 'hosted.weblate/master' 2021-11-01 22:40:59 +01:00
Jiri Zizkin Zizka
13d31dcb1c Translated using Weblate (Czech)
Currently translated at 78.4% (9814 of 12512 strings)
2021-11-01 22:36:52 +01:00
Nut.andor
8de9790705 Merge remote-tracking branch 'Andors-Trail/ATOmiRep'
# Conflicts:
#	AndorsTrail/AndroidManifest.xml
#	AndorsTrail/assets/translation/ar.mo
#	AndorsTrail/assets/translation/bg.mo
#	AndorsTrail/assets/translation/ca.mo
#	AndorsTrail/assets/translation/cs.mo
#	AndorsTrail/assets/translation/de.mo
#	AndorsTrail/assets/translation/el.mo
#	AndorsTrail/assets/translation/es.mo
#	AndorsTrail/assets/translation/fr.mo
#	AndorsTrail/assets/translation/hu.mo
#	AndorsTrail/assets/translation/id.mo
#	AndorsTrail/assets/translation/it.mo
#	AndorsTrail/assets/translation/ja.mo
#	AndorsTrail/assets/translation/ko.mo
#	AndorsTrail/assets/translation/ms.mo
#	AndorsTrail/assets/translation/nb.mo
#	AndorsTrail/assets/translation/nl.mo
#	AndorsTrail/assets/translation/pl.mo
#	AndorsTrail/assets/translation/pt.mo
#	AndorsTrail/assets/translation/pt_BR.mo
#	AndorsTrail/assets/translation/ru.mo
#	AndorsTrail/assets/translation/sq.mo
#	AndorsTrail/assets/translation/sv.mo
#	AndorsTrail/assets/translation/tr.mo
#	AndorsTrail/assets/translation/uk.mo
#	AndorsTrail/assets/translation/zh_CN.mo
#	AndorsTrail/assets/translation/zh_TW.mo
#	AndorsTrail/res/values-id/strings.xml
#	AndorsTrail/res/values-pt/strings.xml
#	AndorsTrail/res/values-sv/strings.xml
#	AndorsTrail/res/values-zh-rCN/strings.xml
#	AndorsTrail/res/values/arrays.xml
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
2021-11-01 22:33:56 +01:00
Nut.andor
c25089d368 exported by ATCS 2021-11-01 13:11:43 +01:00
Nut.andor
be9133a21a preparation V0.7.14 2021-11-01 13:02:47 +01:00
Nut.andor
2bcacffe6e Merge remote-tracking branch 'hosted.weblate/master' 2021-11-01 04:05:56 +01:00
Alain
636f8ee9ed Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 04:05:07 +01:00
Vanka
184c60f468 Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 04:05:06 +01:00
Stefanie Beck
dbf2ded1b6 Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 04:05:06 +01:00
Guido Arnold
ce5592eb7d Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 04:05:05 +01:00
Nut Andor
64a7e935a8 Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 04:05:05 +01:00
Nut.andor
2539c16022 Merge remote-tracking branch 'hosted.weblate/master' 2021-11-01 00:11:36 +01:00
Jiri Zizkin Zizka
0c91207203 Translated using Weblate (Czech)
Currently translated at 78.1% (9774 of 12512 strings)
2021-11-01 00:08:00 +01:00
Mallo123
d64ed028dd Translated using Weblate (German)
Currently translated at 99.9% (12510 of 12512 strings)
2021-11-01 00:07:58 +01:00
Nut.andor
bd68be2355 dev version including translations at beta1 date 2021-10-31 20:02:31 +01:00
Nut.andor
a5ffa4e5f3 dev version including translations at beta1 date 2021-10-31 11:23:01 +01:00
Joel A
4593b9f91a Translated using Weblate (Swedish)
Currently translated at 68.4% (395 of 577 strings)
2021-10-31 07:37:07 +01:00
Chacal Ex
bc26eba677 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.1% (12405 of 12512 strings)
2021-10-31 07:37:06 +01:00
Lucas Araujo
78ce00a9f6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 99.1% (12405 of 12512 strings)
2021-10-31 07:37:05 +01:00
Romain de Bossoreille
a2c556ca12 Translated using Weblate (French)
Currently translated at 95.7% (11982 of 12512 strings)
2021-10-31 07:37:03 +01:00
Jiri Zizkin Zizka
f1034a7a24 Translated using Weblate (Czech)
Currently translated at 77.7% (9723 of 12512 strings)
2021-10-30 14:09:45 +02:00
Jiri Zizkin Zizka
df0bc95bf1 Translated using Weblate (Czech)
Currently translated at 77.0% (9642 of 12512 strings)
2021-10-28 01:44:14 +02:00
Lucas Araujo
b16d75c43b Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.6% (12345 of 12512 strings)
2021-10-28 01:44:12 +02:00
Nut Andor
61efc7eea9 Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-10-28 01:44:10 +02:00
Jiri Zizkin Zizka
6e26ce4014 Translated using Weblate (Czech)
Currently translated at 76.9% (9630 of 12512 strings)
2021-10-26 09:04:18 +02:00
Jiri Zizkin Zizka
4531b1328c Translated using Weblate (Czech)
Currently translated at 76.9% (9627 of 12512 strings)
2021-10-25 17:07:40 +02:00
Gan Gao
230f945750 Translated using Weblate (Chinese (Simplified))
Currently translated at 42.2% (5288 of 12512 strings)
2021-10-25 17:07:37 +02:00
Romain de Bossoreille
e265e45882 Translated using Weblate (French)
Currently translated at 95.7% (11975 of 12512 strings)
2021-10-25 17:07:35 +02:00
Jiri Zizkin Zizka
97d08bde8f Translated using Weblate (Czech)
Currently translated at 75.7% (9483 of 12512 strings)
2021-10-23 02:40:50 +02:00
Malu CubeCraft
0f1e1e76b9 Translated using Weblate (Portuguese)
Currently translated at 91.1% (11410 of 12512 strings)
2021-10-23 02:40:48 +02:00
SC
d6d7e3abd0 Translated using Weblate (Portuguese)
Currently translated at 91.1% (11410 of 12512 strings)
2021-10-23 02:40:48 +02:00
Jiri Zizkin Zizka
79ae97bbae Translated using Weblate (Czech)
Currently translated at 75.6% (9466 of 12512 strings)
2021-10-22 10:40:41 +02:00
Jiri Zizkin Zizka
5664334236 Translated using Weblate (Czech)
Currently translated at 75.3% (9430 of 12512 strings)
2021-10-22 05:19:00 +02:00
SC
a60412c9c6 Translated using Weblate (Portuguese)
Currently translated at 91.1% (11405 of 12512 strings)
2021-10-22 05:18:58 +02:00
Jiri Zizkin Zizka
e58cfd14d9 Translated using Weblate (Czech)
Currently translated at 75.2% (9421 of 12512 strings)
2021-10-21 13:33:46 +02:00
Jiri Zizkin Zizka
c6b882fac1 Translated using Weblate (Czech)
Currently translated at 74.9% (9382 of 12512 strings)
2021-10-21 02:14:40 +02:00
SC
99c4928c77 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.2% (12287 of 12512 strings)
2021-10-21 02:14:36 +02:00
SC
06b5083ee2 Translated using Weblate (Portuguese)
Currently translated at 90.8% (11372 of 12512 strings)
2021-10-21 02:14:34 +02:00
Jiri Zizkin Zizka
e3c10d2c82 Translated using Weblate (Czech)
Currently translated at 73.6% (9214 of 12512 strings)
2021-10-20 05:57:19 +02:00
Romain de Bossoreille
3fb0c263f0 Translated using Weblate (French)
Currently translated at 95.7% (11975 of 12512 strings)
2021-10-20 05:57:15 +02:00
Jiri Zizkin Zizka
20fb1b8f84 Translated using Weblate (Czech)
Currently translated at 70.6% (8842 of 12512 strings)
2021-10-18 17:31:48 +02:00
Gan Gao
73f61c04a5 Translated using Weblate (Chinese (Simplified))
Currently translated at 42.1% (5270 of 12512 strings)
2021-10-18 17:31:46 +02:00
Jiri Zizkin Zizka
7ac99f8067 Translated using Weblate (Czech)
Currently translated at 69.9% (8750 of 12512 strings)
2021-10-15 21:47:51 +02:00
Jiri Zizkin Zizka
298d099beb Translated using Weblate (Czech)
Currently translated at 69.7% (8727 of 12512 strings)
2021-10-14 20:40:35 +02:00
Jiri Zizkin Zizka
c4ed3a697c Translated using Weblate (Czech)
Currently translated at 69.5% (8696 of 12512 strings)
2021-10-14 06:56:23 +02:00
SC
ea910554ce Translated using Weblate (Portuguese)
Currently translated at 89.8% (11248 of 12512 strings)
2021-10-14 06:56:20 +02:00
SC
c4d7a6d156 Translated using Weblate (Portuguese)
Currently translated at 100.0% (577 of 577 strings)
2021-10-14 06:56:18 +02:00
Jiri Zizkin Zizka
fbc07c5979 Translated using Weblate (Czech)
Currently translated at 68.2% (8542 of 12512 strings)
2021-10-11 17:16:47 +02:00
Jiri Zizkin Zizka
5423f759a4 Translated using Weblate (Czech)
Currently translated at 67.6% (8470 of 12512 strings)
2021-10-10 02:30:56 +02:00
Jiri Zizkin Zizka
09d757dcfc Translated using Weblate (Czech)
Currently translated at 67.4% (8445 of 12512 strings)
2021-10-08 05:57:05 +02:00
SC
b1e2042530 Translated using Weblate (Portuguese)
Currently translated at 100.0% (577 of 577 strings)
2021-10-08 05:57:03 +02:00
SC
4e142ad8ba Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (577 of 577 strings)
2021-10-08 05:57:02 +02:00
Afghan Translation Association (ATA)
3a0ca47908 Translated using Weblate (Pashto)
Currently translated at 0.1% (6 of 12511 strings)
2021-10-06 23:06:57 +02:00
Jiri Zizkin Zizka
c80e2d37e2 Translated using Weblate (Czech)
Currently translated at 67.0% (8389 of 12512 strings)
2021-10-06 23:06:56 +02:00
T. A. Wicaksono
c070f96772 Translated using Weblate (Indonesian)
Currently translated at 100.0% (577 of 577 strings)
2021-10-04 18:08:47 +02:00
Jiri Zizkin Zizka
f3daab8ee1 Translated using Weblate (Czech)
Currently translated at 66.9% (8377 of 12512 strings)
2021-10-04 18:08:47 +02:00
daudiffa
c95b0d3882 Translated using Weblate (Indonesian)
Currently translated at 16.8% (2110 of 12512 strings)
2021-10-04 18:08:26 +02:00
T. A. Wicaksono
8d914bab11 Translated using Weblate (Indonesian)
Currently translated at 16.8% (2110 of 12512 strings)
2021-10-04 18:08:25 +02:00
Nut.andor
a06420c884 Merge remote-tracking branch 'hosted.weblate/master' 2021-10-02 18:40:46 +02:00
Rhenaud Dubois
9cc2a97a61 Translated using Weblate (French)
Currently translated at 95.5% (11949 of 12512 strings)
2021-10-02 18:37:11 +02:00
Meiru
d54924909e Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-09-30 09:11:47 +02:00
Rhenaud Dubois
57fe205c72 Translated using Weblate (French)
Currently translated at 95.2% (11916 of 12512 strings)
2021-09-30 09:11:45 +02:00
Bugra Bezgin
6d97bb797a Translated using Weblate (Turkish)
Currently translated at 40.4% (5062 of 12512 strings)
2021-09-28 09:31:53 +02:00
Rhenaud Dubois
43a1dec280 Translated using Weblate (French)
Currently translated at 94.8% (11862 of 12512 strings)
2021-09-28 09:31:50 +02:00
Alexandre Jigue
e6250dea76 Translated using Weblate (French)
Currently translated at 93.8% (11746 of 12512 strings)
2021-09-27 11:33:22 +02:00
J. Lavoie
1d85e94075 Translated using Weblate (French)
Currently translated at 93.8% (11746 of 12512 strings)
2021-09-27 11:33:22 +02:00
Rhenaud Dubois
003827ada7 Translated using Weblate (French)
Currently translated at 93.8% (11746 of 12512 strings)
2021-09-27 11:33:21 +02:00
wsh1997.c
5de208d084 Translated using Weblate (Chinese (Simplified))
Currently translated at 42.0% (5262 of 12512 strings)
2021-09-25 18:05:12 +02:00
Jiri Zizkin Zizka
7447a87d92 Translated using Weblate (Czech)
Currently translated at 66.4% (8313 of 12512 strings)
2021-09-24 14:47:58 +02:00
soplatnik
3cf02ac84b Translated using Weblate (Basque)
Currently translated at 63.2% (365 of 577 strings)
2021-09-23 23:57:45 +02:00
Jiri Zizkin Zizka
fc37e19904 Translated using Weblate (Czech)
Currently translated at 66.1% (8281 of 12512 strings)
2021-09-23 23:57:44 +02:00
michael kunadi
398a8938e8 Translated using Weblate (Indonesian)
Currently translated at 16.7% (2093 of 12512 strings)
2021-09-23 23:57:43 +02:00
Jiri Zizkin Zizka
abd79475a8 Translated using Weblate (Czech)
Currently translated at 65.8% (8238 of 12512 strings)
2021-09-23 07:39:40 +02:00
Jiri Zizkin Zizka
40ebfacdac Translated using Weblate (Czech)
Currently translated at 64.0% (8019 of 12512 strings)
2021-09-19 20:37:59 +02:00
Bugra Bezgin
42a75ddffa Translated using Weblate (Turkish)
Currently translated at 38.9% (4868 of 12512 strings)
2021-09-19 20:37:57 +02:00
Jiri Zizkin Zizka
bdb9a8451e Translated using Weblate (Czech)
Currently translated at 63.7% (7979 of 12512 strings)
2021-09-15 23:32:19 +02:00
猫奴永不翻身
678c083291 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.4% (5180 of 12512 strings)
2021-09-15 23:32:16 +02:00
Bugra Bezgin
c309943953 Translated using Weblate (Turkish)
Currently translated at 38.5% (4826 of 12512 strings)
2021-09-15 23:32:15 +02:00
Lucas Araujo
20e2f6ddc6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.2% (12287 of 12512 strings)
2021-09-15 23:32:10 +02:00
Urszula
59ee40d092 Translated using Weblate (Polish)
Currently translated at 80.6% (10093 of 12512 strings)
2021-09-15 23:32:08 +02:00
猫奴永不翻身
26af3fe12d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (577 of 577 strings)
2021-09-12 20:48:24 +02:00
猫奴永不翻身
bb14652b29 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 20:48:22 +02:00
Donald Yiu
af804223a8 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 17:26:30 +02:00
猫奴永不翻身
47547552a6 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 17:26:29 +02:00
wsh1997.c
2f6a6aab4a Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 17:26:29 +02:00
猫奴永不翻身
5f8683d959 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 17:13:37 +02:00
Donald Yiu
644f191c90 Translated using Weblate (Chinese (Simplified))
Currently translated at 41.3% (5179 of 12512 strings)
2021-09-12 17:13:36 +02:00
Marco Santos
cab263b88b Translated using Weblate (Filipino)
Currently translated at 31.3% (181 of 577 strings)
2021-09-10 12:34:59 +02:00
Jiri Zizkin Zizka
6122198731 Translated using Weblate (Czech)
Currently translated at 62.6% (7841 of 12512 strings)
2021-09-10 12:34:54 +02:00
Donald Yiu
6e3ae6f3bc Translated using Weblate (Chinese (Simplified))
Currently translated at 40.5% (5078 of 12512 strings)
2021-09-10 12:34:52 +02:00
wsh1997.c
ccc95e46cc Translated using Weblate (Chinese (Simplified))
Currently translated at 40.5% (5078 of 12512 strings)
2021-09-10 12:34:51 +02:00
Marco Santos
260f46c4c3 Added translation using Weblate (Filipino) 2021-09-09 05:26:55 +02:00
wsh1997.c
0f9a43bc2b Translated using Weblate (Chinese (Simplified))
Currently translated at 40.0% (5011 of 12512 strings)
2021-09-08 19:16:48 +02:00
Jiri Zizkin Zizka
df38715c0a Translated using Weblate (Czech)
Currently translated at 62.2% (7785 of 12512 strings)
2021-09-08 00:34:37 +02:00
Jiri Zizkin Zizka
43c8595d8d Translated using Weblate (Czech)
Currently translated at 61.7% (7726 of 12512 strings)
2021-09-05 23:36:21 +02:00
Jiri Zizkin Zizka
424d0504cd Translated using Weblate (Czech)
Currently translated at 61.6% (7715 of 12512 strings)
2021-09-05 12:35:35 +02:00
Lordsem
dbf278fa07 Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-09-05 12:35:33 +02:00
Jiri Zizkin Zizka
01491c4042 Translated using Weblate (Czech)
Currently translated at 61.5% (7697 of 12512 strings)
2021-08-30 23:35:03 +02:00
Mingun
ffb2694039 Translated using Weblate (Russian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-08-30 23:35:02 +02:00
Соловейга Юдина
c1b5089ba9 Added translation using Weblate (Latvian) 2021-08-28 11:14:57 +02:00
Sam
de2f32fab9 Translated using Weblate (Chinese (Simplified))
Currently translated at 39.3% (4928 of 12512 strings)
2021-08-27 16:35:24 +02:00
A M
eb146a1c08 Translated using Weblate (Polish)
Currently translated at 80.6% (10086 of 12512 strings)
2021-08-25 06:49:08 +02:00
Jiri Zizkin Zizka
3176cb27fc Translated using Weblate (Czech)
Currently translated at 61.2% (7658 of 12512 strings)
2021-08-24 00:18:47 +02:00
Bugra Bezgin
8dab4b9f60 Translated using Weblate (Turkish)
Currently translated at 34.8% (4361 of 12512 strings)
2021-08-23 11:54:16 +02:00
Nut.andor
1467e7d61f preparation beta1 2021-08-22 19:51:30 +02:00
Nut.andor
fc2bfb6b65 Merge remote-tracking branch 'hosted.weblate/master' into master 2021-08-22 00:36:07 +02:00
Jiri Zizkin Zizka
b2754bd782 Translated using Weblate (Czech)
Currently translated at 61.1% (7646 of 12512 strings)
2021-08-22 00:34:49 +02:00
Nut Andor
84e71e024b Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-08-22 00:34:47 +02:00
Nut.andor
b7ed340de2 Merge remote-tracking branch 'hosted.weblate/master' into master 2021-08-21 14:40:24 +02:00
Jiri Zizkin Zizka
dcede566c7 Translated using Weblate (Czech)
Currently translated at 61.0% (7633 of 12512 strings)
2021-08-21 14:38:10 +02:00
Nut Andor
20db8af71d Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-08-21 14:38:08 +02:00
Jiri Zizkin Zizka
d1a7eefbe9 Translated using Weblate (Czech)
Currently translated at 60.9% (7623 of 12512 strings)
2021-08-20 23:36:14 +02:00
Jiri Zizkin Zizka
39fdaadedf Translated using Weblate (Czech)
Currently translated at 60.8% (7615 of 12512 strings)
2021-08-20 16:38:24 +02:00
Oliver Lew
ff8ab4bcd6 Translated using Weblate (Chinese (Simplified))
Currently translated at 39.3% (4928 of 12512 strings)
2021-08-20 09:33:36 +02:00
Thiago Carmona Monteiro
29eaeca327 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.0% (12270 of 12512 strings)
2021-08-20 09:33:35 +02:00
Tymofii Lytvynenko
91895bec82 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (577 of 577 strings)
2021-08-18 02:38:45 +02:00
Jiri Zizkin Zizka
45a9caf583 Translated using Weblate (Czech)
Currently translated at 60.7% (7602 of 12512 strings)
2021-08-14 05:12:06 +02:00
Никита
7f816df024 Translated using Weblate (Ukrainian)
Currently translated at 11.4% (1434 of 12512 strings)
2021-08-12 18:37:28 +02:00
Jiri Zizkin Zizka
aa265b7878 Translated using Weblate (Czech)
Currently translated at 60.5% (7571 of 12512 strings)
2021-08-12 18:37:26 +02:00
Alexandre Jigue
96a5f53298 Translated using Weblate (French)
Currently translated at 93.5% (11699 of 12512 strings)
2021-08-12 18:37:24 +02:00
François D
dc8b5ddb7e Translated using Weblate (French)
Currently translated at 93.5% (11699 of 12512 strings)
2021-08-12 18:37:24 +02:00
Alexandre Jigue
0c4381b3d0 Translated using Weblate (French)
Currently translated at 93.2% (11665 of 12512 strings)
2021-08-12 14:46:53 +02:00
Jiri Zizkin Zizka
5e56c018a0 Translated using Weblate (Czech)
Currently translated at 60.1% (7522 of 12512 strings)
2021-08-11 17:49:51 +02:00
François D
65e3c1bb65 Translated using Weblate (French)
Currently translated at 93.2% (11664 of 12512 strings)
2021-08-11 17:49:50 +02:00
François D
a1ff055f28 Translated using Weblate (French)
Currently translated at 100.0% (577 of 577 strings)
2021-08-11 17:49:48 +02:00
François D
527ad87f7b Translated using Weblate (French)
Currently translated at 93.2% (11664 of 12512 strings)
2021-08-11 17:13:01 +02:00
Lacrom
42bae77141 Translated using Weblate (French)
Currently translated at 93.2% (11664 of 12512 strings)
2021-08-11 17:13:00 +02:00
Jean-Pascal Rhir
4ecfacdb11 Translated using Weblate (French)
Currently translated at 93.2% (11664 of 12512 strings)
2021-08-11 17:13:00 +02:00
Alexandre Jigue
f83c53cf3b Translated using Weblate (French)
Currently translated at 93.2% (11664 of 12512 strings)
2021-08-11 17:12:59 +02:00
François D
1316f8d42f Translated using Weblate (French)
Currently translated at 93.2% (11663 of 12512 strings)
2021-08-11 17:05:19 +02:00
Alexandre Jigue
a978f7ab28 Translated using Weblate (French)
Currently translated at 93.2% (11663 of 12512 strings)
2021-08-11 17:05:18 +02:00
François D
4cdbe80259 Translated using Weblate (French)
Currently translated at 93.2% (11662 of 12512 strings)
2021-08-11 17:04:23 +02:00
Alexandre Jigue
67aaf73a7a Translated using Weblate (French)
Currently translated at 93.2% (11662 of 12512 strings)
2021-08-11 17:04:22 +02:00
François D
d0455831e0 Translated using Weblate (French)
Currently translated at 93.1% (11660 of 12512 strings)
2021-08-11 17:03:37 +02:00
Alexandre Jigue
7f60cec354 Translated using Weblate (French)
Currently translated at 93.1% (11660 of 12512 strings)
2021-08-11 17:03:36 +02:00
François D
c524ca5fdc Translated using Weblate (French)
Currently translated at 93.1% (11657 of 12512 strings)
2021-08-11 17:01:55 +02:00
Alexandre Jigue
404ee1a92e Translated using Weblate (French)
Currently translated at 93.1% (11657 of 12512 strings)
2021-08-11 17:01:54 +02:00
François D
805c64b607 Translated using Weblate (French)
Currently translated at 93.1% (11654 of 12512 strings)
2021-08-11 17:01:10 +02:00
Alexandre Jigue
bf5dc8ffd8 Translated using Weblate (French)
Currently translated at 93.1% (11654 of 12512 strings)
2021-08-11 17:01:09 +02:00
François D
d08a57d491 Translated using Weblate (French)
Currently translated at 93.1% (11653 of 12512 strings)
2021-08-11 17:00:57 +02:00
Alexandre Jigue
0479070610 Translated using Weblate (French)
Currently translated at 93.1% (11653 of 12512 strings)
2021-08-11 17:00:56 +02:00
François D
6332f62030 Translated using Weblate (French)
Currently translated at 93.1% (11652 of 12512 strings)
2021-08-11 17:00:42 +02:00
Alexandre Jigue
8cf47452bd Translated using Weblate (French)
Currently translated at 93.1% (11652 of 12512 strings)
2021-08-11 17:00:42 +02:00
François D
d48b64a0df Translated using Weblate (French)
Currently translated at 93.1% (11651 of 12512 strings)
2021-08-11 17:00:29 +02:00
Alexandre Jigue
7c0c60ca7f Translated using Weblate (French)
Currently translated at 93.1% (11651 of 12512 strings)
2021-08-11 17:00:28 +02:00
Alexandre Jigue
061c608f65 Translated using Weblate (French)
Currently translated at 93.1% (11649 of 12512 strings)
2021-08-11 16:59:04 +02:00
François D
0e35995bbb Translated using Weblate (French)
Currently translated at 93.0% (11647 of 12512 strings)
2021-08-11 16:58:38 +02:00
Alexandre Jigue
d434dd1ae7 Translated using Weblate (French)
Currently translated at 93.0% (11647 of 12512 strings)
2021-08-11 16:58:38 +02:00
François D
cbcbdc022b Translated using Weblate (French)
Currently translated at 93.0% (11645 of 12512 strings)
2021-08-11 16:57:54 +02:00
Alexandre Jigue
2d1252aef8 Translated using Weblate (French)
Currently translated at 93.0% (11645 of 12512 strings)
2021-08-11 16:57:53 +02:00
François D
2380895b07 Translated using Weblate (French)
Currently translated at 93.0% (11644 of 12512 strings)
2021-08-11 16:57:19 +02:00
Alexandre Jigue
6e10a8f27b Translated using Weblate (French)
Currently translated at 93.0% (11644 of 12512 strings)
2021-08-11 16:57:18 +02:00
François D
881501ed86 Translated using Weblate (French)
Currently translated at 93.0% (11643 of 12512 strings)
2021-08-11 16:57:00 +02:00
Alexandre Jigue
57de174802 Translated using Weblate (French)
Currently translated at 93.0% (11643 of 12512 strings)
2021-08-11 16:56:59 +02:00
François D
7e69025f15 Translated using Weblate (French)
Currently translated at 93.0% (11640 of 12512 strings)
2021-08-11 16:49:24 +02:00
Alexandre Jigue
f0112d8f8b Translated using Weblate (French)
Currently translated at 93.0% (11640 of 12512 strings)
2021-08-11 16:49:24 +02:00
Alexandre Jigue
c93c56a536 Translated using Weblate (French)
Currently translated at 93.0% (11640 of 12512 strings)
2021-08-11 15:51:34 +02:00
François D
0e4e60ee16 Translated using Weblate (French)
Currently translated at 93.0% (11640 of 12512 strings)
2021-08-11 15:51:14 +02:00
François D
75abdf8fc5 Translated using Weblate (French)
Currently translated at 93.0% (11639 of 12512 strings)
2021-08-11 15:50:16 +02:00
Alexandre Jigue
0d0080db65 Translated using Weblate (French)
Currently translated at 93.0% (11639 of 12512 strings)
2021-08-11 15:50:16 +02:00
François D
7c2778a7b6 Translated using Weblate (French)
Currently translated at 93.0% (11637 of 12512 strings)
2021-08-11 15:45:23 +02:00
Alexandre Jigue
f18492c1cb Translated using Weblate (French)
Currently translated at 93.0% (11637 of 12512 strings)
2021-08-11 15:45:23 +02:00
François D
9a75f4c4ab Translated using Weblate (French)
Currently translated at 92.9% (11636 of 12512 strings)
2021-08-11 15:45:01 +02:00
Alexandre Jigue
1cf3f810a4 Translated using Weblate (French)
Currently translated at 92.9% (11636 of 12512 strings)
2021-08-11 15:45:00 +02:00
François D
01d422537d Translated using Weblate (French)
Currently translated at 92.9% (11634 of 12512 strings)
2021-08-11 15:43:36 +02:00
Alexandre Jigue
414c05d9c8 Translated using Weblate (French)
Currently translated at 92.9% (11634 of 12512 strings)
2021-08-11 15:43:35 +02:00
François D
f9f55f965b Translated using Weblate (French)
Currently translated at 92.9% (11633 of 12512 strings)
2021-08-11 15:43:15 +02:00
Alexandre Jigue
b6c3ede860 Translated using Weblate (French)
Currently translated at 92.9% (11633 of 12512 strings)
2021-08-11 15:43:14 +02:00
François D
5b05a66980 Translated using Weblate (French)
Currently translated at 92.9% (11632 of 12512 strings)
2021-08-11 15:37:08 +02:00
Alexandre Jigue
ac3c041ced Translated using Weblate (French)
Currently translated at 92.9% (11632 of 12512 strings)
2021-08-11 15:37:07 +02:00
François D
3affd6f4c0 Translated using Weblate (French)
Currently translated at 92.9% (11631 of 12512 strings)
2021-08-11 15:35:48 +02:00
Alexandre Jigue
68840f1687 Translated using Weblate (French)
Currently translated at 92.9% (11631 of 12512 strings)
2021-08-11 15:35:48 +02:00
Joel A
9985e4035e Translated using Weblate (Swedish)
Currently translated at 68.1% (393 of 577 strings)
2021-08-09 19:34:08 +02:00
Jiri Zizkin Zizka
243279bdb4 Translated using Weblate (Czech)
Currently translated at 60.0% (7514 of 12512 strings)
2021-08-09 19:34:08 +02:00
Kett Lovahr
ccda7ca9f0 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.9% (12258 of 12512 strings)
2021-08-09 19:34:06 +02:00
Thiago Carmona Monteiro
c34fc6e0d6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.9% (12258 of 12512 strings)
2021-08-09 19:34:05 +02:00
forheinn
14530b6bce Translated using Weblate (Indonesian)
Currently translated at 16.7% (2091 of 12512 strings)
2021-08-09 19:34:02 +02:00
Jiri Zizkin Zizka
38f1a62a57 Translated using Weblate (Czech)
Currently translated at 59.4% (7435 of 12512 strings)
2021-08-05 10:54:57 +02:00
Joel A
c3b146ffa3 Translated using Weblate (Swedish)
Currently translated at 67.5% (390 of 577 strings)
2021-08-04 17:34:06 +02:00
Kristoffer Grundström
aaac4f77bc Translated using Weblate (Swedish)
Currently translated at 5.3% (666 of 12512 strings)
2021-08-04 17:34:03 +02:00
Joel A
b341a96a5d Translated using Weblate (Swedish)
Currently translated at 5.3% (666 of 12512 strings)
2021-08-04 17:34:02 +02:00
Jiri Zizkin Zizka
88632f91b5 Translated using Weblate (Czech)
Currently translated at 59.3% (7422 of 12512 strings)
2021-08-04 17:34:01 +02:00
Joel A
a71e8d1019 Translated using Weblate (Swedish)
Currently translated at 5.2% (663 of 12512 strings)
2021-08-04 01:48:46 +02:00
Gonk
505409938f Enable the worldmap to load when targetting sdk 30 2021-08-03 17:06:34 +02:00
Jiri Zizkin Zizka
89ded3e72a Translated using Weblate (Czech)
Currently translated at 59.2% (7414 of 12512 strings)
2021-08-02 23:10:11 +02:00
Jiri Zizkin Zizka
60ffadda86 Translated using Weblate (Czech)
Currently translated at 59.2% (7413 of 12512 strings)
2021-08-02 21:21:46 +02:00
Allan Nordhøy
b3b9c62e2c Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.2% (402 of 12512 strings)
2021-07-30 11:15:33 +02:00
Jiri Zizkin Zizka
0899241c49 Translated using Weblate (Czech)
Currently translated at 57.8% (7234 of 12512 strings)
2021-07-30 11:15:31 +02:00
Jiri Zizkin Zizka
147452be42 Translated using Weblate (Czech)
Currently translated at 56.5% (7078 of 12512 strings)
2021-07-28 08:40:10 +02:00
Sofia Fernanda
4923235658 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.3% (12050 of 12512 strings)
2021-07-28 08:40:08 +02:00
Hosted Weblate
90575990d8 Merge branch 'origin/master' into Weblate. 2021-07-26 23:40:31 +02:00
Jiri Zizkin Zizka
008f6d71ea Translated using Weblate (Czech)
Currently translated at 56.4% (7066 of 12512 strings)
2021-07-25 23:31:32 +02:00
Jiri Zizkin Zizka
bc0ecdc07b Translated using Weblate (Czech)
Currently translated at 55.3% (6923 of 12512 strings)
2021-07-23 21:34:43 +02:00
Gonk
b6a2ceb6e0 Adjust tabbeldlayout to new android support library (otherwise the tabs won't be displayed) 2021-07-18 21:15:22 +02:00
Alexandre Jigue
632e6a0b09 Translated using Weblate (French)
Currently translated at 92.9% (11627 of 12512 strings)
2021-07-17 04:34:21 +02:00
Jiri Zizkin Zizka
e8c81a6646 Translated using Weblate (Czech)
Currently translated at 55.2% (6915 of 12512 strings)
2021-07-16 00:16:53 +02:00
Irina
af2bab7412 Translated using Weblate (Russian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-07-16 00:16:52 +02:00
Alexandre Jigue
7e8ee15eb6 Translated using Weblate (French)
Currently translated at 92.9% (11626 of 12512 strings)
2021-07-16 00:16:50 +02:00
Jiri Zizkin Zizka
a397de3991 Translated using Weblate (Czech)
Currently translated at 55.1% (6904 of 12512 strings)
2021-07-15 02:33:47 +02:00
Lihan Zhu
5e64264b34 Translated using Weblate (Albanian)
Currently translated at 0.1% (1 of 12511 strings)
2021-07-13 23:46:26 +02:00
Lihan Zhu
19667aa839 Translated using Weblate (Arabic)
Currently translated at 8.8% (1111 of 12511 strings)
2021-07-13 23:46:25 +02:00
Jiri Zizkin Zizka
a4e9220357 Translated using Weblate (Czech)
Currently translated at 54.6% (6838 of 12512 strings)
2021-07-13 23:46:23 +02:00
Irina
f3200baadd Translated using Weblate (Russian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-07-13 23:46:21 +02:00
Lihan Zhu
65b71d15f7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.1% (12027 of 12512 strings)
2021-07-13 23:46:19 +02:00
Gonk
58f04af511 Merge branch 'scopedstorage_prototype' into ATOmiRep 2021-07-11 21:58:53 +02:00
Gonk
dec1a548cd Smaller changes and bugfixes 2021-07-11 21:49:05 +02:00
Jiri Zizkin Zizka
87a45a7d4f Translated using Weblate (Czech)
Currently translated at 53.8% (6734 of 12512 strings)
2021-07-10 23:05:40 +02:00
Gonk
5d572187df Altered code to production quality 2021-07-10 20:18:29 +02:00
Tymofii Lytvynenko
beef9904c3 Translated using Weblate (Ukrainian)
Currently translated at 11.2% (1405 of 12512 strings)
2021-07-10 10:33:54 +02:00
Jiri Zizkin Zizka
d3891144ce Translated using Weblate (Czech)
Currently translated at 53.3% (6678 of 12512 strings)
2021-07-10 10:33:53 +02:00
Nut.andor
b0f356afcc fix missing base layer in worldmap 2021-07-09 23:13:05 +02:00
Jiri Zizkin Zizka
219bc77251 Translated using Weblate (Czech)
Currently translated at 53.1% (6650 of 12512 strings)
2021-07-08 15:33:59 +02:00
ArunJRK
24e6a842d7 Translated using Weblate (Tamil)
Currently translated at 0.1% (17 of 12511 strings)
2021-07-07 08:33:51 +02:00
ArunJRK
23c2486c27 Added translation using Weblate (Tamil) 2021-07-06 07:49:19 +02:00
Bugra Bezgin
803648d557 Translated using Weblate (Turkish)
Currently translated at 34.3% (4292 of 12512 strings)
2021-07-05 23:33:44 +02:00
Wladimir Castañeda Sánchez
a39a8e13d0 Translated using Weblate (Spanish)
Currently translated at 100.0% (12512 of 12512 strings)
2021-07-05 23:33:41 +02:00
Dante Avila
b9baaa4772 Translated using Weblate (Spanish)
Currently translated at 100.0% (12512 of 12512 strings)
2021-07-05 23:33:41 +02:00
Bugra Bezgin
830ea8c6b6 Translated using Weblate (Turkish)
Currently translated at 32.3% (4051 of 12512 strings)
2021-07-04 19:18:55 +02:00
Genís Torrents Verdaguer
abcb7dec53 Translated using Weblate (Catalan)
Currently translated at 19.8% (2486 of 12512 strings)
2021-07-04 19:17:08 +02:00
Tymofii Lytvynenko
ae47a5e0e7 Translated using Weblate (Ukrainian)
Currently translated at 11.2% (1402 of 12512 strings)
2021-07-04 19:17:04 +02:00
hasan köksal
bd00ab68fb Translated using Weblate (Turkish)
Currently translated at 32.3% (4046 of 12512 strings)
2021-07-04 19:17:02 +02:00
Bugra Bezgin
86fa2cdf0b Translated using Weblate (Turkish)
Currently translated at 32.3% (4046 of 12512 strings)
2021-07-04 19:17:02 +02:00
Genís Torrents Verdaguer
6a16983830 Translated using Weblate (Catalan)
Currently translated at 100.0% (577 of 577 strings)
2021-07-04 09:37:20 +02:00
Genís Torrents Verdaguer
8676c6aff7 Translated using Weblate (Catalan)
Currently translated at 16.9% (2120 of 12512 strings)
2021-07-04 09:37:18 +02:00
Genís Torrents Verdaguer
b4f6969b9a Translated using Weblate (Catalan)
Currently translated at 9.8% (1230 of 12512 strings)
2021-07-03 12:01:05 +02:00
Mateusz Mendel
e3eb9d4e05 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-07-01 17:05:09 +02:00
Meiru
fa79428dba Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-07-01 17:05:08 +02:00
Mateusz Mendel
c257f35ba2 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-30 18:35:45 +02:00
Jiri Zizkin Zizka
14c64aa3de Translated using Weblate (Czech)
Currently translated at 53.0% (6636 of 12512 strings)
2021-06-29 04:02:29 +02:00
Jiri Zizkin Zizka
fe60a9fa9f Translated using Weblate (Czech)
Currently translated at 52.9% (6621 of 12512 strings)
2021-06-28 15:32:29 +02:00
Ido Shdaimah
850d66cc97 Translated using Weblate (Hebrew)
Currently translated at 1.3% (167 of 12511 strings)
2021-06-28 00:16:19 +02:00
Jiri Zizkin Zizka
9bfc439351 Translated using Weblate (Czech)
Currently translated at 52.9% (6619 of 12512 strings)
2021-06-28 00:16:16 +02:00
Stilian
463582e904 Translated using Weblate (Bulgarian)
Currently translated at 0.6% (87 of 12512 strings)
2021-06-25 17:33:46 +02:00
Lucas Araujo
67ded45bec Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.1% (12027 of 12512 strings)
2021-06-24 09:43:29 +02:00
Jiri Zizkin Zizka
bf804d3e4e Translated using Weblate (Czech)
Currently translated at 52.6% (6592 of 12512 strings)
2021-06-24 00:30:20 +02:00
Mateusz Mendel
f175385342 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-24 00:30:18 +02:00
Mateusz Mendel
cf1cbb6fdc Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-23 16:20:29 +02:00
Jiri Zizkin Zizka
f3373b3d5e Translated using Weblate (Czech)
Currently translated at 52.4% (6568 of 12512 strings)
2021-06-23 13:09:55 +02:00
Mateusz Mendel
3ac4f7b30e Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-23 13:09:53 +02:00
Jiri Zizkin Zizka
1e9b7a58a4 Translated using Weblate (Czech)
Currently translated at 52.3% (6547 of 12512 strings)
2021-06-22 13:52:07 +02:00
Jiri Zizkin Zizka
334465467b Translated using Weblate (Czech)
Currently translated at 52.2% (6536 of 12512 strings)
2021-06-22 08:38:58 +02:00
Jiri Zizkin Zizka
b60874b870 Translated using Weblate (Czech)
Currently translated at 52.1% (6530 of 12512 strings)
2021-06-21 10:04:39 +02:00
Mateusz Mendel
3c8f913ce8 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-20 19:33:56 +02:00
Jiri Zizkin Zizka
37bc895db0 Translated using Weblate (Czech)
Currently translated at 52.0% (6515 of 12512 strings)
2021-06-18 17:34:54 +02:00
Gökhan Demirden
4a8a69a12d Translated using Weblate (Turkish)
Currently translated at 31.6% (3964 of 12512 strings)
2021-06-18 17:34:52 +02:00
Damian Tokarski
65f29a2c1a Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-18 17:34:50 +02:00
Mateusz Mendel
c6c4b1b7cb Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-18 17:34:50 +02:00
Mateusz Mendel
c7a6e51d68 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-18 15:37:13 +02:00
Damian Tokarski
3d30e3b08f Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-18 15:37:10 +02:00
Jiri Zizkin Zizka
5a61227213 Translated using Weblate (Czech)
Currently translated at 51.9% (6506 of 12512 strings)
2021-06-17 04:32:27 +02:00
Bugra Bezgin
fca1104f44 Translated using Weblate (Turkish)
Currently translated at 31.6% (3960 of 12512 strings)
2021-06-17 04:32:26 +02:00
Mateusz Mendel
7aa4d0937a Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-17 04:32:24 +02:00
J. Lavoie
b4eeafa8e9 Translated using Weblate (French)
Currently translated at 99.8% (576 of 577 strings)
2021-06-17 04:32:22 +02:00
Jiri Zizkin Zizka
26e5e1c8d7 Translated using Weblate (Czech)
Currently translated at 51.8% (6491 of 12512 strings)
2021-06-15 23:32:27 +02:00
Mateusz Mendel
27388f83c0 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-15 23:32:24 +02:00
Mateusz Mendel
3d2fcc8cc7 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-12 18:14:05 +02:00
Jiri Zizkin Zizka
5fe5cbb185 Translated using Weblate (Czech)
Currently translated at 50.7% (6354 of 12512 strings)
2021-06-11 03:36:35 +02:00
zoollcar
eeba3287e6 Translated using Weblate (Chinese (Simplified))
Currently translated at 39.3% (4926 of 12512 strings)
2021-06-11 03:36:33 +02:00
Jiri Zizkin Zizka
3439c5f859 Translated using Weblate (Czech)
Currently translated at 50.2% (6288 of 12512 strings)
2021-06-08 02:13:07 +02:00
Jiri Zizkin Zizka
7fadea910d Translated using Weblate (Czech)
Currently translated at 50.0% (6262 of 12512 strings)
2021-06-07 12:58:11 +02:00
zoollcar
a05351a821 Translated using Weblate (Chinese (Simplified))
Currently translated at 39.2% (4910 of 12512 strings)
2021-06-07 12:58:09 +02:00
Mateusz Mendel
e69c9a59c6 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-06-07 12:58:07 +02:00
Guido Arnold
c1c5071c33 Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-06-07 12:58:05 +02:00
Nut Andor
5dc457dbdd Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-06-05 22:25:59 +02:00
Roman Leo
d181122072 Translated using Weblate (German)
Currently translated at 100.0% (12512 of 12512 strings)
2021-06-05 22:25:58 +02:00
Roman Leo
d0f346dae6 Translated using Weblate (German)
Currently translated at 99.6% (12468 of 12512 strings)
2021-06-05 17:38:01 +02:00
Nut Andor
d00fc4a93d Translated using Weblate (German)
Currently translated at 99.6% (12468 of 12512 strings)
2021-06-05 17:37:59 +02:00
Guido Arnold
d68f43eac3 Translated using Weblate (German)
Currently translated at 98.9% (12378 of 12512 strings)
2021-06-05 17:14:57 +02:00
Roman Leo
8edbfd1804 Translated using Weblate (German)
Currently translated at 98.9% (12378 of 12512 strings)
2021-06-05 17:14:56 +02:00
Nut Andor
db466a6f1d Translated using Weblate (German)
Currently translated at 92.1% (11532 of 12512 strings)
2021-06-05 09:30:34 +02:00
Guido Arnold
7e6ac79f09 Translated using Weblate (German)
Currently translated at 92.1% (11532 of 12512 strings)
2021-06-05 09:30:34 +02:00
THANOS SIOURDAKIS
311d41e3d7 Translated using Weblate (Greek)
Currently translated at 99.4% (574 of 577 strings)
2021-06-04 00:52:34 +02:00
THANOS SIOURDAKIS
385dd5c3e4 Translated using Weblate (Greek)
Currently translated at 10.7% (1339 of 12511 strings)
2021-06-04 00:52:33 +02:00
Kristoffer Grundström
a3a58d71e1 Translated using Weblate (Swedish)
Currently translated at 4.7% (596 of 12512 strings)
2021-06-04 00:52:32 +02:00
Jiri Zizkin Zizka
9d0ebcddcb Translated using Weblate (Czech)
Currently translated at 49.9% (6251 of 12512 strings)
2021-06-04 00:52:31 +02:00
zoollcar
5a75b2233a Translated using Weblate (Chinese (Simplified))
Currently translated at 38.8% (4856 of 12512 strings)
2021-06-04 00:51:50 +02:00
Jacque Fresco
0ce02f181b Translated using Weblate (Malay)
Currently translated at 4.5% (570 of 12512 strings)
2021-06-04 00:51:48 +02:00
Nut Andor
e301e815e1 Translated using Weblate (German)
Currently translated at 91.5% (11455 of 12512 strings)
2021-06-04 00:51:46 +02:00
Guido Arnold
28a9080163 Translated using Weblate (German)
Currently translated at 91.5% (11455 of 12512 strings)
2021-06-04 00:51:45 +02:00
Guido Arnold
a48f0b016e Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-06-04 00:51:43 +02:00
zoollcar
b99597fbe9 Translated using Weblate (Chinese (Simplified))
Currently translated at 38.4% (4811 of 12512 strings)
2021-06-02 10:19:06 +02:00
Donald Yiu
ab0ff7c864 Translated using Weblate (Chinese (Simplified))
Currently translated at 38.4% (4811 of 12512 strings)
2021-06-02 10:19:04 +02:00
Jiri Zizkin Zizka
7b021c4450 Translated using Weblate (Czech)
Currently translated at 48.7% (6095 of 12512 strings)
2021-06-02 00:37:50 +02:00
zoollcar
d84232de0c Translated using Weblate (Chinese (Simplified))
Currently translated at 37.0% (4637 of 12512 strings)
2021-06-02 00:37:49 +02:00
Jacque Fresco
eec6cc7e9d Translated using Weblate (Malay)
Currently translated at 4.5% (568 of 12512 strings)
2021-06-02 00:37:46 +02:00
Jacque Fresco
7a71c2bdbe Translated using Weblate (Indonesian)
Currently translated at 16.5% (2076 of 12512 strings)
2021-06-02 00:37:44 +02:00
Nut Andor
3061324d91 Translated using Weblate (German)
Currently translated at 90.2% (11296 of 12512 strings)
2021-06-02 00:37:43 +02:00
Nut Andor
428efb1afd Translated using Weblate (German)
Currently translated at 99.8% (576 of 577 strings)
2021-06-02 00:37:41 +02:00
Donald Yiu
447723c2c7 Translated using Weblate (Chinese (Simplified))
Currently translated at 36.1% (4519 of 12512 strings)
2021-06-01 08:54:38 +02:00
zoollcar
71eb8a9266 Translated using Weblate (Chinese (Simplified))
Currently translated at 36.1% (4519 of 12512 strings)
2021-06-01 08:54:37 +02:00
Jiri Zizkin Zizka
95e4185508 Translated using Weblate (Czech)
Currently translated at 48.4% (6064 of 12512 strings)
2021-05-31 10:31:58 +02:00
Mateusz Mendel
f5bc0b4343 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-31 10:31:56 +02:00
Jacque Fresco
5811b7465c Translated using Weblate (Malay)
Currently translated at 4.1% (515 of 12512 strings)
2021-05-31 10:31:55 +02:00
Lumies
2c146568cd Translated using Weblate (Korean)
Currently translated at 11.1% (1398 of 12512 strings)
2021-05-31 10:31:51 +02:00
Jacque Fresco
40ea70b29f Translated using Weblate (Indonesian)
Currently translated at 16.0% (2005 of 12512 strings)
2021-05-31 10:31:49 +02:00
Roman Leo
ec7945df33 Translated using Weblate (German)
Currently translated at 90.1% (11278 of 12512 strings)
2021-05-31 10:31:46 +02:00
Nut Andor
04e2b64587 Translated using Weblate (German)
Currently translated at 90.1% (11278 of 12512 strings)
2021-05-31 10:31:45 +02:00
Lumies
013863a0e7 Translated using Weblate (Korean)
Currently translated at 11.1% (1398 of 12512 strings)
2021-05-28 09:07:17 +02:00
Jiri Zizkin Zizka
58d2d41232 Translated using Weblate (Czech)
Currently translated at 48.3% (6050 of 12512 strings)
2021-05-27 23:33:20 +02:00
Mateusz Mendel
828598e0ff Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-27 23:33:19 +02:00
Jacque Fresco
ffa3762a0f Translated using Weblate (Malay)
Currently translated at 1.7% (213 of 12512 strings)
2021-05-27 23:33:17 +02:00
Lumies
b5a9ff65ff Translated using Weblate (Korean)
Currently translated at 11.1% (1398 of 12512 strings)
2021-05-27 23:33:15 +02:00
Christian Weikusat
639885087e Translated using Weblate (German)
Currently translated at 89.1% (11150 of 12512 strings)
2021-05-27 23:33:14 +02:00
Roman Leo
efeb6773bc Translated using Weblate (German)
Currently translated at 89.1% (11150 of 12512 strings)
2021-05-27 23:33:13 +02:00
Roman Leo
d21dd8921c Translated using Weblate (German)
Currently translated at 99.8% (576 of 577 strings)
2021-05-27 23:33:10 +02:00
Jiri Zizkin Zizka
a3ce447047 Translated using Weblate (Czech)
Currently translated at 48.0% (6013 of 12512 strings)
2021-05-26 00:41:32 +02:00
Roman Leo
16e89036cb Translated using Weblate (German)
Currently translated at 86.2% (10793 of 12512 strings)
2021-05-26 00:41:30 +02:00
Roman Leo
73b22d51af Translated using Weblate (French)
Currently translated at 99.8% (576 of 577 strings)
2021-05-26 00:41:27 +02:00
Roman Leo
62b1a34288 Translated using Weblate (German)
Currently translated at 99.8% (576 of 577 strings)
2021-05-26 00:41:27 +02:00
Jiri Zizkin Zizka
2f4664adfd Translated using Weblate (Czech)
Currently translated at 47.7% (5972 of 12512 strings)
2021-05-25 00:12:06 +02:00
Mateusz Mendel
d0a7babc33 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-25 00:12:05 +02:00
Nut Andor
2a02ad9afa Translated using Weblate (German)
Currently translated at 85.3% (10682 of 12512 strings)
2021-05-25 00:12:02 +02:00
Roman Leo
aff0cf1e0d Translated using Weblate (German)
Currently translated at 85.3% (10682 of 12512 strings)
2021-05-25 00:12:02 +02:00
Mo Ro
bee47f3715 Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-05-24 18:21:16 +02:00
Roman Leo
79b65e12ed Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-05-24 18:21:16 +02:00
Nut Andor
47d905d7d6 Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-05-24 18:19:22 +02:00
Roman Leo
2f1cde5eab Translated using Weblate (German)
Currently translated at 100.0% (577 of 577 strings)
2021-05-24 18:19:22 +02:00
Roman Leo
3d4e147a2a Translated using Weblate (German)
Currently translated at 83.2% (10413 of 12512 strings)
2021-05-24 14:36:45 +02:00
Nut Andor
a847704a43 Translated using Weblate (German)
Currently translated at 83.2% (10413 of 12512 strings)
2021-05-24 14:36:45 +02:00
Roman Leo
b6ecd7ac71 Translated using Weblate (German)
Currently translated at 83.2% (10411 of 12512 strings)
2021-05-24 14:32:36 +02:00
Nut Andor
aca4da79b3 Translated using Weblate (German)
Currently translated at 83.2% (10411 of 12512 strings)
2021-05-24 14:32:36 +02:00
Roman Leo
a6aafb4ad3 Translated using Weblate (German)
Currently translated at 83.1% (10399 of 12512 strings)
2021-05-24 14:19:30 +02:00
Nut Andor
11b2d998eb Translated using Weblate (German)
Currently translated at 83.1% (10399 of 12512 strings)
2021-05-24 14:19:29 +02:00
Roman Leo
23ccc9ac56 Translated using Weblate (German)
Currently translated at 83.0% (10395 of 12512 strings)
2021-05-24 14:15:35 +02:00
Nut Andor
59ef64d595 Translated using Weblate (German)
Currently translated at 83.0% (10395 of 12512 strings)
2021-05-24 14:15:35 +02:00
Roman Leo
9531c5f876 Translated using Weblate (German)
Currently translated at 83.0% (10393 of 12512 strings)
2021-05-24 14:13:55 +02:00
Nut Andor
5c28bed0ac Translated using Weblate (German)
Currently translated at 83.0% (10393 of 12512 strings)
2021-05-24 14:13:54 +02:00
Roman Leo
ef98fb3232 Translated using Weblate (German)
Currently translated at 83.0% (10388 of 12512 strings)
2021-05-24 14:10:42 +02:00
Nut Andor
039bd15cf9 Translated using Weblate (German)
Currently translated at 83.0% (10388 of 12512 strings)
2021-05-24 14:10:41 +02:00
Roman Leo
b0e6e17c3e Translated using Weblate (German)
Currently translated at 83.0% (10387 of 12512 strings)
2021-05-24 14:08:24 +02:00
Nut Andor
def46b6765 Translated using Weblate (German)
Currently translated at 83.0% (10387 of 12512 strings)
2021-05-24 14:08:23 +02:00
Roman Leo
8403d18588 Translated using Weblate (German)
Currently translated at 83.0% (10386 of 12512 strings)
2021-05-24 14:07:28 +02:00
Nut Andor
d4afb6585c Translated using Weblate (German)
Currently translated at 83.0% (10386 of 12512 strings)
2021-05-24 14:07:27 +02:00
Roman Leo
5b66c1b6fd Translated using Weblate (German)
Currently translated at 82.9% (10383 of 12512 strings)
2021-05-24 14:01:19 +02:00
Nut Andor
03a3413710 Translated using Weblate (German)
Currently translated at 82.9% (10383 of 12512 strings)
2021-05-24 14:01:18 +02:00
Roman Leo
ca6fd5042c Translated using Weblate (German)
Currently translated at 82.8% (10371 of 12512 strings)
2021-05-24 12:20:42 +02:00
Nut Andor
7197a1031f Translated using Weblate (German)
Currently translated at 82.8% (10371 of 12512 strings)
2021-05-24 12:20:42 +02:00
Jiri Zizkin Zizka
2701617548 Translated using Weblate (Czech)
Currently translated at 47.4% (5935 of 12512 strings)
2021-05-24 05:11:17 +02:00
Jacque Fresco
03be71ffff Translated using Weblate (Arabic)
Currently translated at 8.8% (1109 of 12511 strings)
2021-05-23 23:32:23 +02:00
Jiri Zizkin Zizka
859de4efec Translated using Weblate (Czech)
Currently translated at 47.2% (5917 of 12512 strings)
2021-05-23 23:32:21 +02:00
Jacque Fresco
5225c55783 Translated using Weblate (Dutch)
Currently translated at 8.5% (1069 of 12512 strings)
2021-05-23 23:32:19 +02:00
Jacque Fresco
a3920f6b8a Translated using Weblate (German)
Currently translated at 82.8% (10364 of 12512 strings)
2021-05-23 23:32:17 +02:00
Jiri Zizkin Zizka
0f6b97a09d Translated using Weblate (Czech)
Currently translated at 46.8% (5858 of 12512 strings)
2021-05-22 00:14:36 +02:00
Jakub Fabijan
c384325962 Translated using Weblate (Esperanto)
Currently translated at 0.5% (66 of 12511 strings)
2021-05-21 15:52:00 +02:00
Jiri Zizkin Zizka
ec5f8211ae Translated using Weblate (Czech)
Currently translated at 46.2% (5782 of 12512 strings)
2021-05-21 15:51:59 +02:00
Chairin Zaim
f9e30b4092 Translated using Weblate (Malay)
Currently translated at 1.4% (185 of 12512 strings)
2021-05-21 15:51:56 +02:00
Jacque Fresco
1762803d92 Translated using Weblate (Malay)
Currently translated at 1.4% (185 of 12512 strings)
2021-05-21 15:51:55 +02:00
Jacque Fresco
75857dae42 Translated using Weblate (Indonesian)
Currently translated at 14.2% (1785 of 12512 strings)
2021-05-21 15:51:53 +02:00
Syed Abdul Wakeel Hashimi
1d71c2b9d3 Translated using Weblate (Pashto)
Currently translated at 0.1% (2 of 12511 strings)
2021-05-19 21:56:11 +02:00
Jiri Zizkin Zizka
abcf44469f Translated using Weblate (Czech)
Currently translated at 45.7% (5719 of 12512 strings)
2021-05-19 21:56:10 +02:00
Jacque Fresco
bd20d0eab6 Translated using Weblate (Malay)
Currently translated at 1.0% (132 of 12512 strings)
2021-05-19 21:56:08 +02:00
Chairin Zaim
f26926d58e Translated using Weblate (Malay)
Currently translated at 1.0% (132 of 12512 strings)
2021-05-19 21:56:08 +02:00
Jacque Fresco
baece11a5c Translated using Weblate (Indonesian)
Currently translated at 13.9% (1744 of 12512 strings)
2021-05-19 21:56:06 +02:00
Syed Abdul Wakeel Hashimi
a3c243f129 Added translation using Weblate (Pashto) 2021-05-19 11:05:32 +02:00
Jiri Zizkin Zizka
e31a89aa6e Translated using Weblate (Czech)
Currently translated at 45.6% (5713 of 12512 strings)
2021-05-19 00:12:04 +02:00
Mateusz Mendel
aa3d4f077c Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-19 00:12:02 +02:00
Nicolas Cosson
c94d8494ce Translated using Weblate (Dutch)
Currently translated at 8.4% (1052 of 12512 strings)
2021-05-17 02:57:17 +02:00
Kristoffer Grundström
40f09d7d22 Translated using Weblate (Swedish)
Currently translated at 4.6% (581 of 12512 strings)
2021-05-15 23:32:11 +02:00
SmallDragon Chen
cdb9a99516 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.8% (483 of 12512 strings)
2021-05-14 18:30:21 +02:00
Mateusz Mendel
958b84413b Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-14 04:27:20 +02:00
Nicolas Cosson
d7255b8e5b Translated using Weblate (Dutch)
Currently translated at 99.1% (572 of 577 strings)
2021-05-13 12:24:18 +02:00
Kristoffer Grundström
6b8dbbb2ab Translated using Weblate (Swedish)
Currently translated at 47.6% (275 of 577 strings)
2021-05-13 12:24:16 +02:00
Kristoffer Grundström
61c033e0c9 Translated using Weblate (Swedish)
Currently translated at 4.6% (579 of 12512 strings)
2021-05-13 12:24:15 +02:00
Mateusz Mendel
e5183a8512 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-13 12:24:14 +02:00
Nicolas Cosson
8c3533b3a3 Translated using Weblate (Dutch)
Currently translated at 7.9% (990 of 12512 strings)
2021-05-13 12:24:12 +02:00
Ido Ido
db90ba7de1 Translated using Weblate (Hebrew)
Currently translated at 9.7% (56 of 577 strings)
2021-05-12 01:29:39 +02:00
Jiri Zizkin Zizka
c2c4af429c Translated using Weblate (Czech)
Currently translated at 45.3% (5668 of 12512 strings)
2021-05-12 01:29:37 +02:00
I. Musthafa
a97f254870 Translated using Weblate (Indonesian)
Currently translated at 13.8% (1728 of 12512 strings)
2021-05-12 01:29:34 +02:00
Ido Ido
4daeb6262e Added translation using Weblate (Hebrew) 2021-05-11 13:44:14 +02:00
Ido Ido
8941f1d106 Added translation using Weblate (Hebrew) 2021-05-11 13:43:47 +02:00
Jiri Zizkin Zizka
1c85b6035a Translated using Weblate (Czech)
Currently translated at 44.9% (5618 of 12512 strings)
2021-05-10 00:22:39 +02:00
Oliver Lew
28200b7940 Translated using Weblate (Chinese (Simplified))
Currently translated at 35.3% (4417 of 12512 strings)
2021-05-10 00:22:37 +02:00
ssantos
8f9e12c65b Translated using Weblate (Portuguese)
Currently translated at 89.8% (11244 of 12512 strings)
2021-05-10 00:22:36 +02:00
Daniel Stasiak
c325207615 Translated using Weblate (Polish)
Currently translated at 80.5% (10084 of 12512 strings)
2021-05-10 00:22:34 +02:00
이정희
c5e67fb05a Translated using Weblate (Korean)
Currently translated at 11.1% (1396 of 12512 strings)
2021-05-10 00:22:33 +02:00
ssantos
732956dc8d Translated using Weblate (Portuguese)
Currently translated at 100.0% (577 of 577 strings)
2021-05-10 00:22:31 +02:00
Mateusz Mendel
9e739b7b13 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-05-08 12:00:06 +02:00
fresh
2d197f4b95 Translated using Weblate (Greek)
Currently translated at 99.4% (574 of 577 strings)
2021-05-07 04:58:00 +02:00
fresh
3dc92b5c42 Translated using Weblate (Greek)
Currently translated at 10.7% (1344 of 12511 strings)
2021-05-07 04:58:00 +02:00
Jiri Zizkin Zizka
36f1131911 Translated using Weblate (Czech)
Currently translated at 44.3% (5550 of 12512 strings)
2021-05-07 04:57:58 +02:00
Mateusz Mendel
9adad50c37 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-05-07 04:57:56 +02:00
Jenni Hollis
5293e9896e Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.2% (402 of 12512 strings)
2021-05-04 18:32:13 +02:00
Jenni Hollis
261e8c5948 Translated using Weblate (Norwegian Bokmål)
Currently translated at 93.0% (537 of 577 strings)
2021-05-04 18:32:11 +02:00
Jiri Zizkin Zizka
f92719e40f Translated using Weblate (Czech)
Currently translated at 44.1% (5526 of 12512 strings)
2021-05-04 18:32:11 +02:00
Mateusz Mendel
96ac82fd03 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-05-04 18:32:08 +02:00
ssantos
92bdab0d1b Translated using Weblate (Portuguese)
Currently translated at 100.0% (577 of 577 strings)
2021-05-04 18:32:06 +02:00
Gökhan Demirden
b48a317cd7 Translated using Weblate (Turkish)
Currently translated at 100.0% (577 of 577 strings)
2021-05-01 21:32:16 +02:00
Jiri Zizkin Zizka
c75c58f61e Translated using Weblate (Czech)
Currently translated at 43.7% (5480 of 12512 strings)
2021-05-01 21:32:15 +02:00
Oliver Lew
de6d7d28e3 Translated using Weblate (Chinese (Simplified))
Currently translated at 35.2% (4416 of 12512 strings)
2021-05-01 21:32:14 +02:00
Gökhan Demirden
6aa78e435e Translated using Weblate (Turkish)
Currently translated at 31.1% (3894 of 12512 strings)
2021-05-01 21:32:12 +02:00
Mateusz Mendel
98b9234815 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-05-01 21:32:10 +02:00
J. Lavoie
bb8554a5ae Translated using Weblate (French)
Currently translated at 99.4% (574 of 577 strings)
2021-05-01 21:32:06 +02:00
Jiri Zizkin Zizka
7f95b60260 Translated using Weblate (Czech)
Currently translated at 43.6% (5459 of 12512 strings)
2021-04-29 06:57:01 +02:00
Mateusz Mendel
7537df9024 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-29 06:56:58 +02:00
Jiri Zizkin Zizka
270ca76237 Translated using Weblate (Czech)
Currently translated at 43.2% (5413 of 12512 strings)
2021-04-27 09:37:30 +02:00
Oliver Lew
11fbb4e187 Translated using Weblate (Chinese (Simplified))
Currently translated at 35.2% (4410 of 12512 strings)
2021-04-27 09:37:29 +02:00
soft9
08da93cf92 Translated using Weblate (Chinese (Simplified))
Currently translated at 35.2% (4410 of 12512 strings)
2021-04-27 09:37:28 +02:00
Donald Yiu
d09bfffbe5 Translated using Weblate (Chinese (Simplified))
Currently translated at 35.2% (4410 of 12512 strings)
2021-04-27 09:37:23 +02:00
soft9
7e34b910f2 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.9% (3998 of 12512 strings)
2021-04-25 08:22:42 +02:00
Donald Yiu
b2ab99495d Translated using Weblate (Chinese (Simplified))
Currently translated at 31.9% (3998 of 12512 strings)
2021-04-25 08:22:42 +02:00
Donald Yiu
645c24b5f5 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.9% (3994 of 12512 strings)
2021-04-25 08:09:56 +02:00
soft9
bae8c85ea9 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.9% (3994 of 12512 strings)
2021-04-25 08:09:56 +02:00
Jiri Zizkin Zizka
c0cd1671f9 Translated using Weblate (Czech)
Currently translated at 43.2% (5408 of 12512 strings)
2021-04-24 23:16:00 +02:00
Oliver Lew
4e348ad617 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.8% (3985 of 12512 strings)
2021-04-24 19:31:54 +02:00
Luka Giacco
b4e22bd1e9 Translated using Weblate (Catalan)
Currently translated at 8.8% (1102 of 12512 strings)
2021-04-23 09:32:06 +02:00
Oliver Lew
75b35102b5 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.8% (3980 of 12512 strings)
2021-04-23 09:32:05 +02:00
Donald Yiu
83096ce1cb Translated using Weblate (Chinese (Simplified))
Currently translated at 31.6% (3958 of 12512 strings)
2021-04-21 17:58:48 +02:00
Jiri Zizkin Zizka
68d5f56f8c Translated using Weblate (Czech)
Currently translated at 43.1% (5400 of 12512 strings)
2021-04-20 23:59:24 +02:00
Donald Yiu
5ee3ea5347 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.6% (3956 of 12512 strings)
2021-04-20 23:59:22 +02:00
Oliver Lew
58026ab202 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.6% (3956 of 12512 strings)
2021-04-20 23:59:21 +02:00
Jakub Fabijan
2f8127e521 Translated using Weblate (Esperanto)
Currently translated at 18.1% (105 of 577 strings)
2021-04-19 17:49:36 +02:00
Luka Giacco
197e79f0a2 Translated using Weblate (Catalan)
Currently translated at 8.5% (1069 of 12512 strings)
2021-04-19 17:49:34 +02:00
Oliver Lew
7b6e1b080c Translated using Weblate (Chinese (Simplified))
Currently translated at 31.5% (3947 of 12512 strings)
2021-04-19 17:49:27 +02:00
Luka Giacco
c739734685 Translated using Weblate (Catalan)
Currently translated at 85.0% (491 of 577 strings)
2021-04-19 10:01:00 +02:00
Luka Giacco
2172c4c40f Translated using Weblate (Catalan)
Currently translated at 4.5% (565 of 12512 strings)
2021-04-19 10:00:56 +02:00
Jiri Zizkin Zizka
23a92f51fd Translated using Weblate (Czech)
Currently translated at 42.9% (5378 of 12512 strings)
2021-04-19 10:00:53 +02:00
Oliver Lew
0b4db8ba58 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.2% (3908 of 12512 strings)
2021-04-19 10:00:50 +02:00
Verdulo
85966a7249 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-19 10:00:49 +02:00
forheinn
dca75063e3 Translated using Weblate (Indonesian)
Currently translated at 13.7% (1721 of 12512 strings)
2021-04-19 10:00:47 +02:00
guru_meditation_no42
6d18e00535 Move canAcceptInput() checks into handler. 2021-04-17 09:23:42 -07:00
guru_meditation_no42
127cba55f5 Change keyMap to SparseInit array. 2021-04-17 08:54:58 -07:00
Jiri Zizkin Zizka
1b19d899cd Translated using Weblate (Czech)
Currently translated at 42.4% (5306 of 12512 strings)
2021-04-15 23:24:17 +02:00
Mateusz Mendel
dc6275356a Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-15 23:24:14 +02:00
forheinn
68f0abc124 Translated using Weblate (Indonesian)
Currently translated at 13.7% (1719 of 12512 strings)
2021-04-15 23:24:12 +02:00
Oliver Lew
30675d8ed2 Translated using Weblate (Chinese (Simplified))
Currently translated at 31.1% (3892 of 12512 strings)
2021-04-14 19:13:07 +02:00
Mateusz Mendel
9e06b0d1c2 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-14 19:13:05 +02:00
Verdulo
8cbd09126a Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-14 19:13:04 +02:00
forheinn
4b952c3613 Translated using Weblate (Indonesian)
Currently translated at 13.6% (1713 of 12512 strings)
2021-04-14 19:13:02 +02:00
guru_meditation_no42
a4e95b1c98 Move keycode mapping to keyMap array instead of switch case entries. 2021-04-13 22:50:59 -07:00
Tymofij Lytvynenko
174d34ad71 Translated using Weblate (Ukrainian)
Currently translated at 11.1% (1399 of 12512 strings)
2021-04-13 14:01:53 +02:00
forheinn
1b5e88fc94 Translated using Weblate (Indonesian)
Currently translated at 12.5% (1574 of 12512 strings)
2021-04-13 14:01:51 +02:00
guru_meditation_no42
2649471c5f Added shortcut to Hero Info activity, tweaked some button state logic a bit, added comments 2021-04-13 00:08:16 -07:00
Šimon Novotný
1b3dbd59a8 Translated using Weblate (Czech)
Currently translated at 41.9% (5253 of 12512 strings)
2021-04-12 14:48:27 +02:00
Jiri Zizkin Zizka
60d055d660 Translated using Weblate (Czech)
Currently translated at 41.9% (5253 of 12512 strings)
2021-04-12 14:48:26 +02:00
forheinn
bcad893b86 Translated using Weblate (Indonesian)
Currently translated at 12.1% (1518 of 12512 strings)
2021-04-12 14:48:22 +02:00
guru_meditation_no42
bd17ea8cee Fixed whitespace. Again. D*mn editor. 2021-04-11 21:48:35 -07:00
forheinn
1eee4fc4de Translated using Weblate (Indonesian)
Currently translated at 11.5% (1442 of 12512 strings)
2021-04-12 05:36:14 +02:00
daudiffa
5a470ccceb Translated using Weblate (Indonesian)
Currently translated at 11.5% (1442 of 12512 strings)
2021-04-12 05:36:13 +02:00
guru_meditation_no42
c24c8d1444 Fix to attack shortcut logic 2021-04-11 19:46:12 -07:00
guru_meditation_no42
a3c632947b Fix whitespace changes, tweak canAcceptInput() handling. 2021-04-11 19:34:14 -07:00
guru_meditation_no42
edd147e970 Redo keyboard input handling to allow diagonal movement using either keypad or two-key combos, and add keyboard/dpad shortcuts for Flee, Attack, and End Turn. 2021-04-11 18:54:37 -07:00
Jiri Zizkin Zizka
a299fa1619 Translated using Weblate (Czech)
Currently translated at 41.5% (5193 of 12512 strings)
2021-04-10 23:27:21 +02:00
Šimon Novotný
80ba78a81b Translated using Weblate (Czech)
Currently translated at 41.5% (5193 of 12512 strings)
2021-04-10 23:27:20 +02:00
Daniel Stasiak
4851ca93f8 Translated using Weblate (Polish)
Currently translated at 80.4% (10062 of 12512 strings)
2021-04-10 21:32:22 +02:00
Daniel Stasiak
21faa9a504 Translated using Weblate (Polish)
Currently translated at 99.6% (575 of 577 strings)
2021-04-10 21:32:19 +02:00
Šimon Novotný
6fd7e22dca Translated using Weblate (Czech)
Currently translated at 41.4% (5191 of 12512 strings)
2021-04-09 12:57:10 +02:00
Ömer Faruk Çakmak
93cd18c14d Translated using Weblate (Turkish)
Currently translated at 30.7% (3843 of 12512 strings)
2021-04-09 12:57:09 +02:00
guru_meditation_no42
4f1dd93ba6 Add body count to monster info display 2021-04-08 18:19:24 -07:00
guru_meditation_no42
737736dca2 Track and report monster kills by name instead of id 2021-04-08 10:25:19 -07:00
guru_meditation_no42
0f32f09b0d Track and report monster kills by name instead of id 2021-04-08 09:32:50 -07:00
guru_meditation_no42
324be2768c Track and report monster kills by name instead of id 2021-04-07 22:30:08 -07:00
daudiffa
4e9845294c Translated using Weblate (Indonesian)
Currently translated at 100.0% (577 of 577 strings)
2021-04-07 10:26:47 +02:00
daudiffa
479a6351ae Translated using Weblate (Indonesian)
Currently translated at 11.4% (1433 of 12512 strings)
2021-04-07 10:26:46 +02:00
Ömer Faruk Çakmak
952e8a8f58 Translated using Weblate (Turkish)
Currently translated at 29.0% (3640 of 12512 strings)
2021-04-06 02:44:59 +02:00
Christian Eichert
642bebd66a Translated using Weblate (Romanian)
Currently translated at 56.6% (327 of 577 strings)
2021-04-05 22:27:04 +02:00
Christian Eichert
27f4d6a39b Translated using Weblate (Romanian)
Currently translated at 1.0% (129 of 12511 strings)
2021-04-05 22:27:03 +02:00
Rener kaka
8c0caf5856 Translated using Weblate (Kurdish (Central))
Currently translated at 0.1% (6 of 12511 strings)
2021-04-05 22:27:01 +02:00
Ömer Faruk Çakmak
907feba02e Translated using Weblate (Turkish)
Currently translated at 100.0% (577 of 577 strings)
2021-04-05 22:27:00 +02:00
Ömer Faruk Çakmak
71b47eb979 Translated using Weblate (Turkish)
Currently translated at 28.0% (3506 of 12512 strings)
2021-04-05 22:26:59 +02:00
Kett Lovahr
7aa33ce46b Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.0% (12012 of 12512 strings)
2021-04-05 22:26:57 +02:00
Nathan Watson
d06f51ac33 add support for numpad + diagonal dpad key inputs 2021-04-01 22:03:02 -07:00
Nut Andor
c216f38d49 Translated using Weblate (German)
Currently translated at 82.6% (10347 of 12512 strings)
2021-04-01 23:26:42 +02:00
Johny The Pvp God
41b0473bbb Translated using Weblate (Romanian)
Currently translated at 54.5% (315 of 577 strings)
2021-03-31 21:26:57 +02:00
adel nasri
e0b42690ad Translated using Weblate (Arabic)
Currently translated at 8.7% (1092 of 12511 strings)
2021-03-31 21:26:49 +02:00
Pegasus Liao
39f6609a46 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.8% (480 of 12512 strings)
2021-03-31 21:26:48 +02:00
Jiri Zizkin Zizka
2e0b72808f Translated using Weblate (Czech)
Currently translated at 41.4% (5189 of 12512 strings)
2021-03-31 21:26:41 +02:00
Nut Andor
420af508d9 Translated using Weblate (German)
Currently translated at 99.4% (574 of 577 strings)
2021-03-31 21:26:39 +02:00
Johny The Pvp God
e248cae13d Translated using Weblate (Romanian)
Currently translated at 0.9% (123 of 12511 strings)
2021-03-29 15:50:01 +02:00
Pegasus Liao
2996ca79d7 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.3% (418 of 12512 strings)
2021-03-29 15:49:58 +02:00
Jiri Zizkin Zizka
51e40b9976 Translated using Weblate (Czech)
Currently translated at 41.3% (5177 of 12512 strings)
2021-03-29 15:49:57 +02:00
Johny The Pvp God
83cfed4e87 Added translation using Weblate (Romanian) 2021-03-29 09:24:46 +02:00
Nut.andor
7afc3e422c Added Base layer 2021-03-28 03:29:24 +02:00
Jiri Zizkin Zizka
0983de54ef Translated using Weblate (Czech)
Currently translated at 41.3% (5173 of 12512 strings)
2021-03-28 01:12:39 +01:00
Mateusz Mendel
fef2d5bc48 Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-03-28 01:12:38 +01:00
Jean-Pascal Rhir
88d1f4ad20 Translated using Weblate (French)
Currently translated at 97.2% (561 of 577 strings)
2021-03-27 14:37:07 +01:00
Wladimir Castañeda Sánchez
e1f9e1b777 Translated using Weblate (Spanish)
Currently translated at 100.0% (12512 of 12512 strings)
2021-03-27 11:06:22 +01:00
Jiri Zizkin Zizka
e6e649d45d Translated using Weblate (Czech)
Currently translated at 41.2% (5160 of 12512 strings)
2021-03-27 03:29:49 +01:00
Ömer Faruk Çakmak
32676730a3 Translated using Weblate (Turkish)
Currently translated at 28.0% (3506 of 12512 strings)
2021-03-27 03:29:48 +01:00
kty919
096d3b692e Translated using Weblate (Korean)
Currently translated at 11.1% (1396 of 12512 strings)
2021-03-27 03:29:45 +01:00
Nut Andor
61a20aeefa Translated using Weblate (German)
Currently translated at 82.6% (10343 of 12512 strings)
2021-03-27 03:29:43 +01:00
Nut Andor
6067136a88 Translated using Weblate (German)
Currently translated at 99.4% (574 of 577 strings)
2021-03-27 03:29:38 +01:00
Jean-Pascal Rhir
0aeba2d5e0 Translated using Weblate (French)
Currently translated at 92.8% (11615 of 12512 strings)
2021-03-27 00:04:23 +01:00
Jean-Pascal Rhir
2273bcfb3a Translated using Weblate (French)
Currently translated at 92.8% (11615 of 12512 strings)
2021-03-26 23:53:33 +01:00
Nathan Watson
266553473c Fix immunity duration counter (https://andorstrail.com/viewtopic.php?p=72151) 2021-03-26 14:33:51 -07:00
kty919
5b253d3b2a Translated using Weblate (Korean)
Currently translated at 10.9% (1366 of 12512 strings)
2021-03-25 01:00:13 +01:00
Jiri Zizkin Zizka
010cf462ec Translated using Weblate (Czech)
Currently translated at 41.1% (5147 of 12512 strings)
2021-03-24 23:39:26 +01:00
Meiru
f78f76b36b Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-03-24 23:39:24 +01:00
forheinn
b6f51c9d78 Translated using Weblate (Indonesian)
Currently translated at 11.2% (1409 of 12512 strings)
2021-03-24 23:39:23 +01:00
Nathan Watson
24c507d963 Draw a block under Ground layer to find transparency bugs 2021-03-23 21:11:18 -07:00
fresh
a466aa0080 Translated using Weblate (Greek)
Currently translated at 97.5% (563 of 577 strings)
2021-03-20 15:58:12 +01:00
fresh
72e7be4dd5 Translated using Weblate (Greek)
Currently translated at 10.1% (1273 of 12511 strings)
2021-03-20 15:58:11 +01:00
Neea Rusch
4c2ea8e34d Translated using Weblate (Finnish)
Currently translated at 5.8% (34 of 577 strings)
2021-03-20 15:58:05 +01:00
Alexander Gavrilov
087f5b5b2b Translated using Weblate (Hungarian)
Currently translated at 91.8% (530 of 577 strings)
2021-03-20 15:58:04 +01:00
Jiri Zizkin Zizka
c388de1331 Translated using Weblate (Czech)
Currently translated at 40.8% (5113 of 12512 strings)
2021-03-20 15:58:04 +01:00
Meiru
ff2493297f Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-03-20 15:58:02 +01:00
Nut.andor
80f55d6d14 compiled translations shouldn't be on git 2021-03-20 11:58:20 +01:00
Nut.andor
97769fd1de debug settings + version nbr 2021-03-19 01:00:38 +01:00
Nut.andor
5823e98887 Merge remote-tracking branch 'AndorsTrailRelease/master' into master 2021-03-19 00:41:43 +01:00
Nut.andor
3f6ae96410 Merge remote-tracking branch 'AndorsTrailRelease/master' into master 2021-03-19 00:29:12 +01:00
Nut.andor
09cde7def0 translation state,
bump version to v0.7.13.2 (60)
2021-03-19 00:24:07 +01:00
Nut.andor
a86c88559e Merge remote-tracking branch 'Weblate_translations/master' into master 2021-03-19 00:09:29 +01:00
Nut Andor
9d8a3c2bd9 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.6% (575 of 577 strings)
2021-03-19 00:08:00 +01:00
Nut.andor
ff139c74aa Merge remote-tracking branch 'Weblate_translations/master' into master 2021-03-19 00:03:19 +01:00
Nut Andor
c25955b707 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.6% (575 of 577 strings)
2021-03-18 23:54:06 +01:00
Nut.andor
cf9018b20e Merge remote-tracking branch 'hosted.weblate/master' into master 2021-03-18 23:00:48 +01:00
Jiri Zizkin Zizka
9fded3a8fe Translated using Weblate (Czech)
Currently translated at 40.7% (5098 of 12512 strings)
2021-03-18 22:57:10 +01:00
Jakub Fabijan
d71197c5c1 Translated using Weblate (Esperanto)
Currently translated at 0.2% (27 of 12511 strings)
2021-03-18 22:56:39 +01:00
Jakub Fabijan
fd0ed17112 Translated using Weblate (Esperanto)
Currently translated at 16.9% (98 of 577 strings)
2021-03-18 22:56:37 +01:00
Jakub Fabijan
cb07e4e0ef Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-03-18 22:56:35 +01:00
Jakub Fabijan
e18bd12614 Added translation using Weblate (Esperanto) 2021-03-18 19:50:10 +01:00
Jakub Fabijan
531544c89b Translated using Weblate (Esperanto)
Currently translated at 0.1% (1 of 577 strings)
2021-03-18 05:34:08 +01:00
Allan Nordhøy
83b3619eda Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.1% (391 of 12512 strings)
2021-03-18 05:34:07 +01:00
Jenni Hollis
c937cc91d0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.1% (391 of 12512 strings)
2021-03-18 05:34:07 +01:00
Jakub Fabijan
d301b6097a Added translation using Weblate (Esperanto) 2021-03-18 01:08:41 +01:00
Stefan Gamer YTB
f6f826d8df Added translation using Weblate (Romanian) 2021-03-17 17:12:43 +01:00
Jiri Zizkin Zizka
e2fd52ded3 Translated using Weblate (Czech)
Currently translated at 40.7% (5096 of 12512 strings)
2021-03-17 07:08:04 +01:00
kty919
613293f342 Translated using Weblate (Korean)
Currently translated at 10.8% (1362 of 12512 strings)
2021-03-17 07:08:02 +01:00
Jenni Hollis
811745d8d9 Translated using Weblate (Norwegian Bokmål)
Currently translated at 3.1% (390 of 12512 strings)
2021-03-16 15:51:28 +01:00
hasan köksal
23c9e9a2d1 Translated using Weblate (Turkish)
Currently translated at 27.2% (3406 of 12512 strings)
2021-03-16 15:51:27 +01:00
Alessandro Mandelli
2c595d6b31 Translated using Weblate (Italian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-03-16 15:51:25 +01:00
Tymofij Lytvynenko
993eac6e3e Translated using Weblate (Ukrainian)
Currently translated at 11.1% (1390 of 12512 strings)
2021-03-15 16:21:31 +01:00
Jiri Zizkin Zizka
d675b5d5ed Translated using Weblate (Czech)
Currently translated at 40.6% (5089 of 12512 strings)
2021-03-15 16:21:30 +01:00
hasan köksal
efc6d22fda Translated using Weblate (Turkish)
Currently translated at 27.0% (3387 of 12512 strings)
2021-03-15 16:21:28 +01:00
kty919
8b9b133e03 Translated using Weblate (Korean)
Currently translated at 10.7% (1350 of 12512 strings)
2021-03-15 16:21:27 +01:00
Nut
09b295bce6 Merge pull request #32 from atsymboldot/patch-3
Bump version code for FDroid build
2021-03-13 21:45:46 +01:00
atsymboldot
6cb0e4bd11 Bump version code for FDroid build 2021-03-13 08:11:05 -08:00
adel nasri
0901e683f1 Translated using Weblate (Arabic)
Currently translated at 28.0% (162 of 577 strings)
2021-03-12 15:03:50 +01:00
Tymofij Lytvynenko
9679a75e28 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (577 of 577 strings)
2021-03-12 15:02:56 +01:00
Tymofij Lytvynenko
17f903efc2 Translated using Weblate (Ukrainian)
Currently translated at 11.0% (1386 of 12512 strings)
2021-03-12 15:02:55 +01:00
Vladimir
e4056a7e25 Translated using Weblate (Russian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-03-12 15:02:54 +01:00
kty919
f0fe4284f8 Translated using Weblate (Korean)
Currently translated at 10.4% (1306 of 12512 strings)
2021-03-12 15:02:53 +01:00
Vladimir
0ba28dc6d3 Translated using Weblate (Russian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-03-10 14:18:34 +01:00
Chriz76
29d12d35dd Merge pull request #31 from atsymboldot/patch-2
Update Android target to API 29
2021-03-08 17:38:20 +01:00
atsymboldot
757f1faf01 Update Android target to API 29 2021-03-08 08:00:35 -08:00
adel nasri
fbe4cdd3b4 Translated using Weblate (Arabic)
Currently translated at 8.6% (1086 of 12511 strings)
2021-03-08 14:03:43 +01:00
Vladimir
fb91696894 Translated using Weblate (Russian)
Currently translated at 97.5% (12206 of 12512 strings)
2021-03-08 14:03:40 +01:00
adel nasri
6eb7e9926e Translated using Weblate (Arabic)
Currently translated at 7.3% (923 of 12511 strings)
2021-03-06 23:23:35 +01:00
Vladimir
4a61f1d99f Translated using Weblate (Russian)
Currently translated at 97.1% (12151 of 12512 strings)
2021-03-06 23:23:34 +01:00
adel nasri
f19805b88b Translated using Weblate (Arabic)
Currently translated at 7.3% (917 of 12511 strings)
2021-03-06 14:50:36 +01:00
UAzpeitia
8cfff5d4c3 Translated using Weblate (Basque)
Currently translated at 63.0% (364 of 577 strings)
2021-03-06 14:50:35 +01:00
Jiri Zizkin Zizka
546b505234 Translated using Weblate (Czech)
Currently translated at 40.5% (5076 of 12512 strings)
2021-03-06 14:50:34 +01:00
kty919
31d4771551 Translated using Weblate (Korean)
Currently translated at 9.9% (1239 of 12512 strings)
2021-03-06 14:50:33 +01:00
UAzpeitia
d9385b6cff Added translation using Weblate (Basque) 2021-03-05 14:32:55 +01:00
Jiri Zizkin Zizka
35ce473d31 Translated using Weblate (Czech)
Currently translated at 40.4% (5059 of 12512 strings)
2021-03-04 14:01:54 +01:00
adel nasri
c91911387b Translated using Weblate (Arabic)
Currently translated at 6.2% (782 of 12511 strings)
2021-03-03 07:08:58 +01:00
Jiri Zizkin Zizka
9306a163cf Translated using Weblate (Czech)
Currently translated at 40.2% (5041 of 12512 strings)
2021-03-03 07:08:56 +01:00
forheinn
a810355aef Translated using Weblate (Indonesian)
Currently translated at 11.1% (1392 of 12512 strings)
2021-03-03 07:08:53 +01:00
adel nasri
505525dff1 Translated using Weblate (Arabic)
Currently translated at 6.1% (767 of 12511 strings)
2021-03-01 22:12:15 +01:00
Jiri Zizkin Zizka
71a36c6a5d Translated using Weblate (Czech)
Currently translated at 40.1% (5021 of 12512 strings)
2021-03-01 22:12:13 +01:00
Vladimir
8b15777b8a Translated using Weblate (Russian)
Currently translated at 96.8% (12117 of 12512 strings)
2021-03-01 22:12:11 +01:00
forheinn
79a3d74265 Translated using Weblate (Indonesian)
Currently translated at 9.4% (1188 of 12512 strings)
2021-03-01 22:12:09 +01:00
adel nasri
947e4511e6 Translated using Weblate (Arabic)
Currently translated at 5.4% (687 of 12511 strings)
2021-02-28 23:04:17 +01:00
Vladimir
90abda95b5 Translated using Weblate (Russian)
Currently translated at 95.8% (11997 of 12512 strings)
2021-02-28 23:04:15 +01:00
adel nasri
e04dd0e5cd Translated using Weblate (Arabic)
Currently translated at 27.2% (157 of 577 strings)
2021-02-28 16:52:10 +01:00
adel nasri
f29124a2a4 Translated using Weblate (Arabic)
Currently translated at 4.7% (594 of 12511 strings)
2021-02-28 16:52:08 +01:00
Jiri Zizkin Zizka
be30144f4c Translated using Weblate (Czech)
Currently translated at 40.0% (5009 of 12512 strings)
2021-02-28 16:52:06 +01:00
Vladimir
a1290aca48 Translated using Weblate (Russian)
Currently translated at 94.1% (11782 of 12512 strings)
2021-02-28 16:52:04 +01:00
Elton Viana Gonçalves da Luz
f4ffc26641 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.8% (11872 of 12512 strings)
2021-02-28 16:52:03 +01:00
Chacal Ex
0289c2e1f7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.8% (11872 of 12512 strings)
2021-02-28 16:52:03 +01:00
Mateusz Mendel
ccc85c3d12 Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-02-28 16:52:00 +01:00
kty919
21e1cc9f8f Translated using Weblate (Korean)
Currently translated at 9.4% (1188 of 12512 strings)
2021-02-28 16:51:58 +01:00
Meiru
4e1be033df Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-28 16:51:56 +01:00
forheinn
6f51e89067 Translated using Weblate (Indonesian)
Currently translated at 8.7% (1093 of 12512 strings)
2021-02-28 16:51:35 +01:00
Jorge Luis Rico Víquez
38d474c505 Translated using Weblate (Spanish)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-28 16:50:33 +01:00
Nut.andor
b1046ee3db drawables
ResourceLoader definitions
2021-02-26 21:52:19 +01:00
Nut.andor
6a035c0767 drawables 2021-02-26 21:22:44 +01:00
Nut.andor
c6a7b2df03 next release nbr 2021-02-26 20:55:21 +01:00
kty919
e763bbdd2b Translated using Weblate (Korean)
Currently translated at 100.0% (577 of 577 strings)
2021-02-24 15:17:46 +01:00
Jiri Zizkin Zizka
7fb49b9027 Translated using Weblate (Czech)
Currently translated at 39.8% (4983 of 12512 strings)
2021-02-24 15:17:45 +01:00
zoollcar
028380f73d Translated using Weblate (Chinese (Simplified))
Currently translated at 30.7% (3842 of 12512 strings)
2021-02-24 15:17:44 +01:00
Mateusz Mendel
499daca20e Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-02-24 15:17:42 +01:00
kty919
7b09b02032 Translated using Weblate (Korean)
Currently translated at 8.6% (1081 of 12512 strings)
2021-02-24 15:17:39 +01:00
forheinn
983316b493 Translated using Weblate (Indonesian)
Currently translated at 6.2% (787 of 12512 strings)
2021-02-24 15:17:37 +01:00
zoollcar
a11dcaf84d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (577 of 577 strings)
2021-02-23 20:00:16 +01:00
kty919
0131699a0d Translated using Weblate (Korean)
Currently translated at 100.0% (577 of 577 strings)
2021-02-23 20:00:15 +01:00
zoollcar
64d00d2d3f Translated using Weblate (Chinese (Simplified))
Currently translated at 30.6% (3838 of 12512 strings)
2021-02-23 20:00:14 +01:00
Daniel Stasiak
c4221c3ab6 Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-02-23 20:00:11 +01:00
Mateusz Mendel
872fce1b86 Translated using Weblate (Polish)
Currently translated at 80.2% (10047 of 12512 strings)
2021-02-23 20:00:10 +01:00
kty919
66f31ef6dd Translated using Weblate (Korean)
Currently translated at 7.9% (989 of 12512 strings)
2021-02-23 19:59:57 +01:00
Alessandro Perlo
f84061a8de Translated using Weblate (Italian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-23 19:59:55 +01:00
forheinn
9f505d5dd6 Translated using Weblate (Indonesian)
Currently translated at 4.8% (610 of 12512 strings)
2021-02-23 19:59:53 +01:00
Jorge Luis Rico Víquez
d6d8cca90e Translated using Weblate (Spanish)
Currently translated at 96.8% (12112 of 12512 strings)
2021-02-23 19:59:50 +01:00
Daniel Stasiak
122f680d33 Translated using Weblate (Polish)
Currently translated at 99.4% (574 of 577 strings)
2021-02-23 19:59:46 +01:00
ShahinF27
20342456c2 Added translation using Weblate (Azerbaijani) 2021-02-22 18:35:20 +01:00
kty919
9efdf37b4c Translated using Weblate (Korean)
Currently translated at 6.1% (774 of 12512 strings)
2021-02-22 03:06:18 +01:00
김현수
1b49947be8 Translated using Weblate (Korean)
Currently translated at 6.1% (774 of 12512 strings)
2021-02-22 03:06:18 +01:00
kty919
ba571d45f6 Translated using Weblate (Korean)
Currently translated at 6.1% (772 of 12512 strings)
2021-02-22 03:02:51 +01:00
김현수
45762f557b Translated using Weblate (Korean)
Currently translated at 6.1% (772 of 12512 strings)
2021-02-22 03:02:50 +01:00
Sofia zHU
fcf6fe4dd3 Translated using Weblate (Chinese (Simplified))
Currently translated at 30.4% (3814 of 12512 strings)
2021-02-22 00:47:57 +01:00
forheinn
91c23658ee Translated using Weblate (Indonesian)
Currently translated at 4.4% (557 of 12512 strings)
2021-02-22 00:47:55 +01:00
Jorge Luis Rico Víquez
f48ccc24b2 Translated using Weblate (Spanish)
Currently translated at 94.4% (11812 of 12512 strings)
2021-02-22 00:47:52 +01:00
forheinn
3febf3f5e3 Translated using Weblate (Indonesian)
Currently translated at 98.9% (571 of 577 strings)
2021-02-21 04:45:58 +01:00
Jiri Zizkin Zizka
d7c9853054 Translated using Weblate (Czech)
Currently translated at 39.6% (4967 of 12512 strings)
2021-02-21 04:45:56 +01:00
m khoirul fatikhin
1bf16545f5 Translated using Weblate (Indonesian)
Currently translated at 2.3% (289 of 12512 strings)
2021-02-21 04:45:54 +01:00
forheinn
50a678d646 Translated using Weblate (Indonesian)
Currently translated at 2.3% (289 of 12512 strings)
2021-02-21 04:45:53 +01:00
m khoirul fatikhin
49ccbb1cb4 Translated using Weblate (Indonesian)
Currently translated at 0.7% (99 of 12512 strings)
2021-02-20 13:35:37 +01:00
HAN CHEN
a46350a516 Translated using Weblate (Chinese (Simplified))
Currently translated at 30.4% (3809 of 12512 strings)
2021-02-20 12:13:41 +01:00
Liu Tao
b1903afe4a Translated using Weblate (Chinese (Simplified))
Currently translated at 30.4% (3809 of 12512 strings)
2021-02-20 12:13:41 +01:00
zoollcar
5ba562d4eb Translated using Weblate (Chinese (Simplified))
Currently translated at 30.2% (3791 of 12512 strings)
2021-02-20 10:52:13 +01:00
HAN CHEN
1e30f6179f Translated using Weblate (Chinese (Simplified))
Currently translated at 30.2% (3791 of 12512 strings)
2021-02-20 10:52:12 +01:00
Jiri Zizkin Zizka
2d98e601c9 Translated using Weblate (Czech)
Currently translated at 39.5% (4953 of 12512 strings)
2021-02-20 00:29:47 +01:00
Jorge Luis Rico Víquez
960d0f0e79 Translated using Weblate (Spanish)
Currently translated at 93.8% (11742 of 12512 strings)
2021-02-20 00:29:45 +01:00
Ye Yang
d4df52a78e Translated using Weblate (Chinese (Simplified))
Currently translated at 30.1% (3775 of 12512 strings)
2021-02-19 16:00:01 +01:00
Jorge Luis Rico Víquez
cbcdabe281 Translated using Weblate (Spanish)
Currently translated at 93.6% (11722 of 12512 strings)
2021-02-19 15:59:58 +01:00
Meiru
18efe50088 Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-02-19 15:59:56 +01:00
Jiri Zizkin Zizka
b52946de24 Translated using Weblate (Czech)
Currently translated at 39.5% (4952 of 12512 strings)
2021-02-19 01:06:30 +01:00
Liu Tao
24b1559e5b Translated using Weblate (Chinese (Simplified))
Currently translated at 30.1% (3773 of 12512 strings)
2021-02-19 01:06:29 +01:00
Vladimir
6a33968937 Translated using Weblate (Russian)
Currently translated at 93.8% (11745 of 12512 strings)
2021-02-19 01:06:26 +01:00
Jorge Luis Rico Víquez
6197edcb2a Translated using Weblate (Spanish)
Currently translated at 92.5% (11581 of 12512 strings)
2021-02-19 01:06:24 +01:00
Abin Isaac
72aa8e306d Added translation using Weblate (Hindi) 2021-02-18 09:24:11 +01:00
Jiri Zizkin Zizka
dbc5a5470d Translated using Weblate (Czech)
Currently translated at 39.1% (4902 of 12512 strings)
2021-02-17 09:25:21 +01:00
Liu Tao
d01b0c3b27 Translated using Weblate (Chinese (Simplified))
Currently translated at 30.0% (3764 of 12512 strings)
2021-02-16 22:43:16 +01:00
Mateusz Mendel
028b732059 Translated using Weblate (Polish)
Currently translated at 80.2% (10045 of 12512 strings)
2021-02-16 22:43:15 +01:00
Meiru
bfb41a381c Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-16 22:43:13 +01:00
Kurd As
ed3dc867a7 Added translation using Weblate (Kurdish (Central)) 2021-02-16 11:56:22 +01:00
Nut.andor
5c350c9406 Merge commit 'e776c86aff8f541f87ce6e402f47083386171b18' into master
# Conflicts:
#	AndorsTrail/AndroidManifest.xml
#	AndorsTrail/assets/translation/ar.mo
#	AndorsTrail/assets/translation/ca.mo
#	AndorsTrail/assets/translation/cs.mo
#	AndorsTrail/assets/translation/de.mo
#	AndorsTrail/assets/translation/el.mo
#	AndorsTrail/assets/translation/es.mo
#	AndorsTrail/assets/translation/fil.mo
#	AndorsTrail/assets/translation/fr.mo
#	AndorsTrail/assets/translation/hu.mo
#	AndorsTrail/assets/translation/it.mo
#	AndorsTrail/assets/translation/ja.mo
#	AndorsTrail/assets/translation/ko.mo
#	AndorsTrail/assets/translation/nb.mo
#	AndorsTrail/assets/translation/nl.mo
#	AndorsTrail/assets/translation/pl.mo
#	AndorsTrail/assets/translation/pt.mo
#	AndorsTrail/assets/translation/pt_BR.mo
#	AndorsTrail/assets/translation/ru.mo
#	AndorsTrail/assets/translation/sv.mo
#	AndorsTrail/assets/translation/tr.mo
#	AndorsTrail/assets/translation/uk.mo
#	AndorsTrail/assets/translation/zh_CN.mo
#	AndorsTrail/assets/translation/zh_TW.mo
#	AndorsTrail/res/values/authors.xml
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
2021-02-16 00:33:14 +01:00
Nut.andor
06f168124f test push 2021-02-16 00:01:20 +01:00
Jiri Zizkin Zizka
9724fb01c9 Translated using Weblate (Czech)
Currently translated at 39.0% (4883 of 12512 strings)
2021-02-15 23:48:48 +01:00
Liu Tao
e182ca85e6 Translated using Weblate (Chinese (Simplified))
Currently translated at 30.0% (3762 of 12512 strings)
2021-02-15 23:48:47 +01:00
Elton Viana Gonçalves da Luz
147071c92a Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.7% (11855 of 12512 strings)
2021-02-15 23:48:45 +01:00
Mateusz Mendel
ff6552f764 Translated using Weblate (Polish)
Currently translated at 80.2% (10045 of 12512 strings)
2021-02-15 23:48:44 +01:00
Jorge Luis Rico Víquez
10c18f1792 Translated using Weblate (Spanish)
Currently translated at 91.2% (11422 of 12512 strings)
2021-02-15 23:48:42 +01:00
Jorge Luis Rico Víquez
431d30b82d Translated using Weblate (Spanish)
Currently translated at 90.4% (11322 of 12512 strings)
2021-02-15 11:55:12 +01:00
Jorge Luis Rico Víquez
b86693a611 Translated using Weblate (Spanish)
Currently translated at 90.4% (11313 of 12512 strings)
2021-02-15 02:01:40 +01:00
adel nasri
f342c34295 Translated using Weblate (Arabic)
Currently translated at 13.5% (78 of 577 strings)
2021-02-13 00:42:49 +01:00
adel nasri
64031d7195 Translated using Weblate (Arabic)
Currently translated at 3.0% (386 of 12511 strings)
2021-02-13 00:42:16 +01:00
Jorge Luis Rico Víquez
8d8d5945f5 Translated using Weblate (Spanish)
Currently translated at 89.3% (11182 of 12512 strings)
2021-02-13 00:42:14 +01:00
adel nasri
08ac09a95b Translated using Weblate (Arabic)
Currently translated at 2.5% (315 of 12511 strings)
2021-02-12 18:09:12 +01:00
Jiri Zizkin Zizka
f44dace8b1 Translated using Weblate (Czech)
Currently translated at 38.9% (4871 of 12512 strings)
2021-02-12 18:09:11 +01:00
Meiru
cf3d6a21bf Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-12 18:09:09 +01:00
Da C
4d16b90201 Translated using Weblate (Italian)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-12 18:09:06 +01:00
Jorge Luis Rico Víquez
f3d33854f0 Translated using Weblate (Spanish)
Currently translated at 89.3% (11175 of 12512 strings)
2021-02-12 18:09:04 +01:00
adel nasri
a71876d60e Translated using Weblate (Arabic)
Currently translated at 2.3% (297 of 12511 strings)
2021-02-11 17:58:20 +01:00
Jiri Zizkin Zizka
2826f5a39c Translated using Weblate (Czech)
Currently translated at 38.7% (4851 of 12512 strings)
2021-02-11 17:57:56 +01:00
Da C
6cca9ed061 Translated using Weblate (Italian)
Currently translated at 99.3% (12426 of 12512 strings)
2021-02-11 17:57:44 +01:00
Jorge Luis Rico Víquez
3af2859335 Translated using Weblate (Spanish)
Currently translated at 88.3% (11052 of 12512 strings)
2021-02-11 17:57:39 +01:00
adel nasri
9b56acc310 Translated using Weblate (Arabic)
Currently translated at 1.3% (165 of 12511 strings)
2021-02-09 14:00:18 +01:00
Da C
1865f4f8d5 Translated using Weblate (Italian)
Currently translated at 93.7% (11735 of 12512 strings)
2021-02-09 13:59:53 +01:00
Michalis
52943da6a5 Translated using Weblate (Greek)
Currently translated at 8.8% (1112 of 12511 strings)
2021-02-09 08:26:30 +01:00
adel nasri
f18524e8e2 Translated using Weblate (Arabic)
Currently translated at 0.4% (57 of 12511 strings)
2021-02-09 08:26:29 +01:00
Jiri Zizkin Zizka
7bc24ac371 Translated using Weblate (Czech)
Currently translated at 37.7% (4729 of 12512 strings)
2021-02-09 08:26:27 +01:00
Lucas Araujo
8e542c5665 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.6% (11841 of 12512 strings)
2021-02-09 08:26:26 +01:00
Pol
b8d9ec36e5 Translated using Weblate (Spanish)
Currently translated at 86.8% (10862 of 12512 strings)
2021-02-09 08:26:24 +01:00
Jorge Luis Rico Víquez
e3ef1952eb Translated using Weblate (Spanish)
Currently translated at 86.8% (10862 of 12512 strings)
2021-02-09 08:26:23 +01:00
Jorge Luis Rico Víquez
758c5f7f3f Translated using Weblate (Spanish)
Currently translated at 86.2% (10795 of 12512 strings)
2021-02-08 19:14:05 +01:00
Juan Manuel Cantero Diego
98f0a0322e Translated using Weblate (Spanish)
Currently translated at 86.2% (10795 of 12512 strings)
2021-02-08 19:14:04 +01:00
Pol
6941ce6543 Translated using Weblate (Spanish)
Currently translated at 86.2% (10795 of 12512 strings)
2021-02-08 19:14:03 +01:00
Lucas Araujo
6727f6c163 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.5% (11835 of 12512 strings)
2021-02-08 18:03:33 +01:00
Jorge Luis Rico Víquez
e60758fa0c Translated using Weblate (Spanish)
Currently translated at 86.2% (10795 of 12512 strings)
2021-02-08 18:03:25 +01:00
Michalis
c2e46d4de8 Translated using Weblate (Greek)
Currently translated at 8.8% (1112 of 12511 strings)
2021-02-08 02:27:32 +01:00
Reza Almanda
dda5a9d17a Translated using Weblate (Indonesian)
Currently translated at 95.8% (553 of 577 strings)
2021-02-08 02:27:30 +01:00
Jiri Zizkin Zizka
24107abbef Translated using Weblate (Czech)
Currently translated at 37.6% (4716 of 12512 strings)
2021-02-08 02:27:29 +01:00
Carlos Santana
805cbf4733 Translated using Weblate (Spanish)
Currently translated at 85.6% (10712 of 12512 strings)
2021-02-08 02:27:27 +01:00
Jorge Luis Rico Víquez
9d341c4e0b Translated using Weblate (Spanish)
Currently translated at 85.6% (10712 of 12512 strings)
2021-02-08 02:27:27 +01:00
Jorge Luis Rico Víquez
a9641b4970 Translated using Weblate (Spanish)
Currently translated at 100.0% (577 of 577 strings)
2021-02-07 10:13:57 +01:00
Jiri Zizkin Zizka
0278c45d34 Translated using Weblate (Czech)
Currently translated at 37.1% (4646 of 12512 strings)
2021-02-07 10:13:56 +01:00
Meiru
143262b6fc Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-07 10:13:52 +01:00
Evaristo Sintetas
c0a798e3e3 Translated using Weblate (Spanish)
Currently translated at 84.8% (10615 of 12512 strings)
2021-02-07 10:13:47 +01:00
Jorge Luis Rico Víquez
0855873117 Translated using Weblate (Spanish)
Currently translated at 84.8% (10615 of 12512 strings)
2021-02-07 10:13:46 +01:00
Jiri Zizkin Zizka
e35a1df79a Translated using Weblate (Czech)
Currently translated at 100.0% (577 of 577 strings)
2021-02-06 00:42:38 +01:00
Jorge Luis Rico Víquez
516ff7389a Translated using Weblate (Spanish)
Currently translated at 100.0% (577 of 577 strings)
2021-02-06 00:42:37 +01:00
Jiri Zizkin Zizka
22d28666ea Translated using Weblate (Czech)
Currently translated at 36.5% (4570 of 12512 strings)
2021-02-06 00:42:30 +01:00
Vladimir
ed6831595f Translated using Weblate (Russian)
Currently translated at 93.4% (11696 of 12512 strings)
2021-02-06 00:42:27 +01:00
Mateusz Mendel
894a4275af Translated using Weblate (Polish)
Currently translated at 80.2% (10045 of 12512 strings)
2021-02-06 00:42:06 +01:00
Meiru
65d56f3135 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-06 00:42:05 +01:00
Manuel Bolivar
6be899fe1c Translated using Weblate (Spanish)
Currently translated at 82.0% (10263 of 12512 strings)
2021-02-06 00:42:02 +01:00
Sergio Oton
d0f300890c Translated using Weblate (Spanish)
Currently translated at 82.0% (10263 of 12512 strings)
2021-02-06 00:42:02 +01:00
Pol
860dc466aa Translated using Weblate (Spanish)
Currently translated at 82.0% (10263 of 12512 strings)
2021-02-06 00:42:01 +01:00
Jorge Luis Rico Víquez
f9bce7be7b Translated using Weblate (Spanish)
Currently translated at 82.0% (10263 of 12512 strings)
2021-02-06 00:42:00 +01:00
Meiru
ccf4f11095 Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-02-06 00:41:57 +01:00
Manuel Bolivar
6c68bb0f73 Translated using Weblate (Spanish)
Currently translated at 100.0% (577 of 577 strings)
2021-02-04 23:57:50 +01:00
Echedey
3434e5d738 Translated using Weblate (Spanish)
Currently translated at 100.0% (577 of 577 strings)
2021-02-04 23:57:50 +01:00
Manuel Bolivar
575c7236cd Translated using Weblate (Spanish)
Currently translated at 77.4% (9693 of 12512 strings)
2021-02-04 21:06:59 +01:00
Jorge Luis Rico Víquez
d4c7146850 Translated using Weblate (Spanish)
Currently translated at 77.4% (9693 of 12512 strings)
2021-02-04 21:06:59 +01:00
Manuel Bolivar
08d8d04c8c Translated using Weblate (Spanish)
Currently translated at 77.4% (9687 of 12512 strings)
2021-02-04 21:01:28 +01:00
Jorge Luis Rico Víquez
fae9cdf292 Translated using Weblate (Spanish)
Currently translated at 77.4% (9687 of 12512 strings)
2021-02-04 21:01:28 +01:00
Jorge Luis Rico Víquez
7c62376d7e Translated using Weblate (Spanish)
Currently translated at 77.3% (9677 of 12512 strings)
2021-02-04 20:56:13 +01:00
Jorge Luis Rico Víquez
410bf9cc63 Translated using Weblate (Spanish)
Currently translated at 77.3% (9675 of 12512 strings)
2021-02-04 20:54:40 +01:00
Manuel Bolivar
79f47d8830 Translated using Weblate (Spanish)
Currently translated at 77.3% (9675 of 12512 strings)
2021-02-04 20:54:39 +01:00
Jiri Zizkin Zizka
0ed844ef0d Translated using Weblate (Czech)
Currently translated at 34.7% (4345 of 12512 strings)
2021-02-03 00:02:28 +01:00
Vladimir
017012cd05 Translated using Weblate (Russian)
Currently translated at 93.4% (11693 of 12512 strings)
2021-02-03 00:02:26 +01:00
Lucas Araujo
e0f960dd28 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.2% (11795 of 12512 strings)
2021-02-03 00:02:25 +01:00
Mateusz Mendel
20e377dca3 Translated using Weblate (Polish)
Currently translated at 80.2% (10045 of 12512 strings)
2021-02-03 00:02:22 +01:00
Meiru
b373785ec3 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-03 00:02:20 +01:00
Alessandro Perlo
d8f7d27511 Translated using Weblate (Italian)
Currently translated at 92.8% (11621 of 12512 strings)
2021-02-03 00:02:18 +01:00
Vladimir
7eff687b4c Translated using Weblate (Russian)
Currently translated at 100.0% (577 of 577 strings)
2021-02-03 00:02:17 +01:00
SmallDragon Chen
e056bc3209 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.1% (395 of 12512 strings)
2021-02-01 14:16:02 +01:00
Meiru
be520fc104 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-01 14:16:01 +01:00
Meiru
f80536944d Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-01 09:02:48 +01:00
SmallDragon Chen
81f54aca1d Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (577 of 577 strings)
2021-02-01 00:52:13 +01:00
SmallDragon Chen
13004de111 Translated using Weblate (Chinese (Traditional))
Currently translated at 3.1% (393 of 12512 strings)
2021-02-01 00:52:08 +01:00
Jiri Zizkin Zizka
82e8b57e89 Translated using Weblate (Czech)
Currently translated at 34.4% (4305 of 12512 strings)
2021-02-01 00:51:07 +01:00
Harita Ustası
9b32cf08d8 Translated using Weblate (Turkish)
Currently translated at 26.9% (3367 of 12512 strings)
2021-02-01 00:51:04 +01:00
Gökhan Demirden
098fe77a54 Translated using Weblate (Turkish)
Currently translated at 26.9% (3367 of 12512 strings)
2021-02-01 00:51:04 +01:00
Lucas Araujo
64e037ad90 Translated using Weblate (Portuguese (Brazil))
Currently translated at 94.0% (11768 of 12512 strings)
2021-02-01 00:51:02 +01:00
Mateusz Mendel
7894ed7e0f Translated using Weblate (Polish)
Currently translated at 80.2% (10044 of 12512 strings)
2021-02-01 00:50:59 +01:00
dz2701
3523bc669b Translated using Weblate (Korean)
Currently translated at 6.1% (768 of 12512 strings)
2021-02-01 00:50:58 +01:00
Meiru
dd919eb029 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-02-01 00:50:56 +01:00
Lucas Araujo
1c15204198 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (577 of 577 strings)
2021-02-01 00:50:55 +01:00
Meiru
d5f0d2bbb2 Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-02-01 00:50:54 +01:00
Alessandro Perlo
5ae9cf18c9 Translated using Weblate (Italian)
Currently translated at 100.0% (577 of 577 strings)
2021-02-01 00:50:54 +01:00
Meiru
a06d55a00a Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-01-30 15:15:06 +01:00
Meiru
486774c8f7 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-01-30 15:14:55 +01:00
Csaba
583c728245 Translated using Weblate (Hungarian)
Currently translated at 33.2% (4156 of 12512 strings)
2021-01-30 11:32:35 +01:00
Jiri Zizkin Zizka
988067eedc Translated using Weblate (Czech)
Currently translated at 33.8% (4234 of 12512 strings)
2021-01-30 11:32:34 +01:00
Ömer Faruk Çakmak
b044b17d8a Translated using Weblate (Turkish)
Currently translated at 26.3% (3300 of 12512 strings)
2021-01-30 11:32:31 +01:00
Max Nalsky
329b38b5d3 Translated using Weblate (Russian)
Currently translated at 92.8% (11615 of 12512 strings)
2021-01-30 11:32:29 +01:00
Meiru
cec353a96c Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-01-30 11:32:28 +01:00
Meiru
a93545f7af Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-01-30 11:32:26 +01:00
Ömer Faruk Çakmak
826efc6074 Translated using Weblate (Turkish)
Currently translated at 24.3% (3041 of 12512 strings)
2021-01-29 20:42:15 +01:00
Meiru
97d84936aa Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-01-29 10:58:22 +01:00
Meiru
7070cd6853 Translated using Weblate (Japanese)
Currently translated at 100.0% (12512 of 12512 strings)
2021-01-29 09:29:04 +01:00
Meiru
87e2202c51 Translated using Weblate (Japanese)
Currently translated at 99.8% (12498 of 12512 strings)
2021-01-29 02:35:34 +01:00
Chriz76
e776c86aff Update full-description.txt
Quest and map count for v0.7.13
2021-01-28 19:14:44 +01:00
Chriz76
0e85c9d05f Update full-description.txt
V.0.7.13
2021-01-28 19:11:44 +01:00
Jiri Zizkin Zizka
84899b4410 Translated using Weblate (Czech)
Currently translated at 100.0% (577 of 577 strings)
2021-01-27 00:26:30 +01:00
Oğuz Ersen
9e2a21c80a Translated using Weblate (Turkish)
Currently translated at 100.0% (577 of 577 strings)
2021-01-27 00:26:29 +01:00
Jiri Zizkin Zizka
2e9f7ced10 Translated using Weblate (Czech)
Currently translated at 33.5% (4199 of 12512 strings)
2021-01-27 00:26:29 +01:00
Oğuz Ersen
4e2c0cf349 Translated using Weblate (Turkish)
Currently translated at 23.6% (2965 of 12512 strings)
2021-01-27 00:26:27 +01:00
Lucas Araujo
83d1241ec9 Translated using Weblate (Portuguese (Brazil))
Currently translated at 93.2% (11669 of 12512 strings)
2021-01-27 00:26:26 +01:00
Nut.andor
aa946bb047 fix merge conflict 2021-01-26 15:22:47 +01:00
Ricardo
65c8a0e499 Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.8% (11616 of 12512 strings)
2021-01-26 15:16:15 +01:00
Meiru
f8f625e5a1 Translated using Weblate (Japanese)
Currently translated at 99.8% (12498 of 12512 strings)
2021-01-26 15:15:35 +01:00
Meiru
c1d8ce51d5 Translated using Weblate (Japanese)
Currently translated at 100.0% (577 of 577 strings)
2021-01-26 15:15:29 +01:00
Nut.andor
34603c287f translations % 2021-01-26 01:14:07 +01:00
Nut.andor
cddd7b5ee3 generated translations, author 2021-01-26 00:04:51 +01:00
Nut.andor
c6f4c64a67 fix unicode char 2021-01-25 19:53:47 +01:00
Nut.andor
bd33ec7edd Merge remote-tracking branch 'Andors-Trail/test_fungi' into master
# Conflicts:
#	AndorsTrail/AndroidManifest.xml
#	AndorsTrail/assets/translation/cs.po
#	AndorsTrail/assets/translation/de.po
#	AndorsTrail/assets/translation/es.po
#	AndorsTrail/assets/translation/ja.po
#	AndorsTrail/assets/translation/ru.po
#	AndorsTrail/assets/translation/tr.po
#	AndorsTrail/assets/translation/zh_CN.po
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/AndorsTrailApplication.java
2021-01-24 23:18:45 +01:00
Nut.andor
2b533f9617 fungi_panic 2021-01-24 22:44:06 +01:00
Nut.andor
85d26e9c8e Merge remote-tracking branch 'Weblate_translations/master' into master 2021-01-24 19:19:56 +01:00
01qwasa10
3442d0da70 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2021-01-24 19:09:41 +01:00
01qwasa10
fb7317a667 Translated using Weblate (Chinese (Traditional))
Currently translated at 54.5% (307 of 563 strings)
2021-01-24 19:09:41 +01:00
01qwasa10
bab395f982 Translated using Weblate (Chinese (Traditional))
Currently translated at 2.8% (328 of 11616 strings)
2021-01-24 19:09:39 +01:00
Nut.andor
d092879a74 Authors 2021-01-24 11:54:08 +01:00
Nut.andor
005f22a349 version v0,7.12.2 (just translations) 2021-01-23 23:22:18 +01:00
Nut.andor
96bbd2e038 generated mo+strings 2021-01-23 19:54:02 +01:00
Nut.andor
a6f75d030d Merge remote-tracking branch 'AndorsTrailRelease/master' into master 2021-01-23 19:40:38 +01:00
Nut.andor
c054de0c67 Merge remote-tracking branch 'hosted.weblate/master' into master 2021-01-23 19:34:13 +01:00
Jiri Zizkin Zizka
fcfd656c4b Translated using Weblate (Czech)
Currently translated at 35.9% (4177 of 11616 strings)
2021-01-23 09:32:10 +01:00
Jiri Zizkin Zizka
79f7ea4277 Translated using Weblate (Czech)
Currently translated at 35.7% (4147 of 11616 strings)
2021-01-21 01:53:31 +01:00
Виталий
1c45d841d2 Translated using Weblate (Ukrainian)
Currently translated at 11.9% (1384 of 11616 strings)
2021-01-18 22:08:05 +01:00
Meiru
8a6ab625cc Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-18 09:57:49 +01:00
Nathan Watson
59f0015cc0 fix dpad direction change handling 2021-01-17 21:02:40 -08:00
Nut.andor
dfadbfffd5 beta 2021-01-18 01:19:27 +01:00
Nathan Watson
099acfcdb6 Configurable dpad transparency 2021-01-16 17:34:33 -08:00
Meiru
162127c2a1 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-16 14:42:18 +01:00
zoollcar
b9dbda107a Translated using Weblate (Chinese (Simplified))
Currently translated at 32.0% (3720 of 11616 strings)
2021-01-15 09:32:10 +01:00
Виталий
5352998818 Translated using Weblate (Russian)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-15 09:32:09 +01:00
Pol
fc0984f082 Translated using Weblate (Spanish)
Currently translated at 82.6% (9605 of 11616 strings)
2021-01-15 09:32:08 +01:00
Meiru
0c717ea672 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-13 10:32:11 +01:00
Meiru
4493d902b2 Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2021-01-13 10:32:10 +01:00
Meiru
85975857f0 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-12 09:48:07 +01:00
Nut.andor
ac9f25abf3 some more author credits 2021-01-12 00:34:04 +01:00
Nut.andor
953d458a37 3 other languages: Japanese, Czech, Chinese
some author credits
2021-01-10 22:45:25 +01:00
zoollcar
c343f30af6 Translated using Weblate (Chinese (Simplified))
Currently translated at 32.0% (3718 of 11616 strings)
2021-01-10 22:38:52 +01:00
Виталий
2e07586089 Translated using Weblate (Russian)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-10 22:38:46 +01:00
Meiru
8702577308 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-10 22:38:44 +01:00
Vines&Bells
fe7302df80 Translated using Weblate (German)
Currently translated at 86.4% (10045 of 11616 strings)
2021-01-10 22:38:42 +01:00
Ricardo
d04ff2a22e Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (563 of 563 strings)
2021-01-10 22:38:41 +01:00
Meiru
5a505f76e5 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-10 09:26:33 +01:00
Nathan Watson
f9a08dcf16 Inventory filters: segregate jewelry from armor; and potions from food 2021-01-09 20:00:45 -08:00
Nathan Watson
d5f00b25d6 Make sortByType split potions from food 2021-01-09 19:07:17 -08:00
Nathan Watson
4d73eaa341 bugfix: compile error typo left unstaged in prior commit 2021-01-09 13:50:14 -08:00
Nathan Watson
66bb28661e Improve granularity of inventory sortByType 2021-01-09 12:52:58 -08:00
Meiru
fe79d134fd Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-09 14:32:08 +01:00
Nut.andor
83bd59c595 Merge remote-tracking branch 'hosted.weblate/master' into master 2021-01-09 01:50:18 +01:00
Nathan Watson
6f209951e4 update authors 2021-01-08 08:16:33 -08:00
Jiri Zizkin Zizka
daddd02fcf Translated using Weblate (Czech)
Currently translated at 35.6% (4141 of 11616 strings)
2021-01-07 22:17:41 +01:00
Meiru
fdc64682af Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2021-01-03 11:32:41 +01:00
Nut
748f0bf36f actual translations 2021-01-03 03:02:24 +01:00
İsmail Emre Sırmalı
3e06a573e7 Translated using Weblate (Turkish)
Currently translated at 100.0% (563 of 563 strings)
2021-01-01 20:29:17 +01:00
卢剑辉
8b8beb3f0c Translated using Weblate (Chinese (Simplified))
Currently translated at 31.9% (3708 of 11616 strings)
2021-01-01 20:29:16 +01:00
İsmail Emre Sırmalı
9346df94f5 Translated using Weblate (Turkish)
Currently translated at 25.0% (2913 of 11616 strings)
2021-01-01 20:29:13 +01:00
Meiru
2e7b7c10f7 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-29 13:59:54 +01:00
Meiru
1268dbeba6 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-29 08:51:02 +01:00
Nut Andor
1e1be4bd86 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-29 00:45:39 +01:00
卢剑辉
0dfbaba2e3 Translated using Weblate (Chinese (Simplified))
Currently translated at 29.3% (3409 of 11616 strings)
2020-12-29 00:45:38 +01:00
Meiru
e709e45880 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-29 00:45:37 +01:00
Echedey
f59cd035c8 Translated using Weblate (Spanish)
Currently translated at 82.6% (9604 of 11616 strings)
2020-12-29 00:45:35 +01:00
Ruben Rodriguez Martin
aeadfaa27e Translated using Weblate (Spanish)
Currently translated at 82.6% (9604 of 11616 strings)
2020-12-29 00:45:35 +01:00
Hakuchi
7746d97019 Translated using Weblate (German)
Currently translated at 86.4% (10040 of 11616 strings)
2020-12-29 00:45:33 +01:00
卢剑辉
44251a73c0 Translated using Weblate (Chinese (Simplified))
Currently translated at 28.8% (3351 of 11616 strings)
2020-12-28 08:03:17 +01:00
Nathan Watson
605748b35b Don't warn when 'top' is missing (old maps don't have it, and that's ok) 2020-12-27 19:20:36 -08:00
卢剑辉
a659a2f176 Translated using Weblate (Chinese (Simplified))
Currently translated at 28.3% (3295 of 11616 strings)
2020-12-27 13:16:14 +01:00
Meiru
b6d7231248 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-27 13:16:10 +01:00
Meiru
7760efac74 Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-12-27 13:16:09 +01:00
Meiru
d263c6e4cc Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-27 09:33:31 +01:00
卢剑辉
693b8eb490 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-26 03:29:26 +01:00
Jiri Zizkin Zizka
9197e97d9e Translated using Weblate (Czech)
Currently translated at 35.6% (4137 of 11616 strings)
2020-12-26 03:29:24 +01:00
卢剑辉
a4b83b576e Translated using Weblate (Chinese (Simplified))
Currently translated at 22.1% (2571 of 11616 strings)
2020-12-26 03:29:19 +01:00
Meiru
18fd76bdbd Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-26 03:29:12 +01:00
J. Lavoie
444bbfb5aa Translated using Weblate (German)
Currently translated at 99.8% (562 of 563 strings)
2020-12-26 03:29:10 +01:00
Meiru
139e19e747 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-25 14:03:14 +01:00
Meiru
a77cfd091c Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-25 05:25:54 +01:00
Meiru
66b4df7a65 Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-24 05:26:21 +01:00
William Li
4831b43114 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 03:54:51 +01:00
zhnxin
c4ed6341fe Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 03:54:51 +01:00
zoollcar
b837053eee Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 03:54:51 +01:00
卢剑辉
cf415d45d3 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 03:54:51 +01:00
卢剑辉
2c7fedc90c Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 02:33:52 +01:00
Sky Forest
674b608a8f Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (563 of 563 strings)
2020-12-24 02:33:47 +01:00
Nut
917956c6b4 Merge pull request #48 from AndorsTrailRelease/master
version 56
2020-12-23 07:44:59 +01:00
Nut
7f839cd2f9 translation credit 2020-12-23 07:13:14 +01:00
Meiru
0a36d2741a Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-22 13:51:49 +01:00
Meiru
213314e324 Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-22 09:03:25 +01:00
THANOS SIOURDAKIS
eab055c906 Translated using Weblate (Greek)
Currently translated at 97.1% (547 of 563 strings)
2020-12-21 22:29:12 +01:00
Jiri Zizkin Zizka
d1622d5bfa Translated using Weblate (Czech)
Currently translated at 35.1% (4085 of 11616 strings)
2020-12-21 22:29:11 +01:00
卢剑辉
2dbe7a9cc2 Translated using Weblate (Chinese (Simplified))
Currently translated at 7.6% (885 of 11616 strings)
2020-12-21 22:29:10 +01:00
Meiru
d84198743c Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-21 22:29:09 +01:00
Jiri Zizkin Zizka
a89dd87c35 Translated using Weblate (Czech)
Currently translated at 34.9% (4057 of 11616 strings)
2020-12-20 13:22:17 +01:00
卢剑辉
4a914bae43 Translated using Weblate (Chinese (Simplified))
Currently translated at 7.5% (877 of 11616 strings)
2020-12-20 13:22:15 +01:00
Meiru
3236eb239c Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-20 13:21:42 +01:00
Nathan Watson
7b439696b9 Implement immobility for NPCs with moveCost = 999 2020-12-19 15:52:20 -08:00
Nathan Watson
6bc5e9ed13 Bugfix: Move spore immunity to the end of the skill list to preserve existing skill order 2020-12-19 15:36:20 -08:00
卢剑辉
9651ac3ece Translated using Weblate (Chinese (Simplified))
Currently translated at 55.0% (310 of 563 strings)
2020-12-18 14:29:11 +01:00
Jiri Zizkin Zizka
7c8f737b43 Translated using Weblate (Czech)
Currently translated at 34.2% (3982 of 11616 strings)
2020-12-18 14:29:10 +01:00
卢剑辉
0198a3e8a9 Translated using Weblate (Chinese (Simplified))
Currently translated at 7.4% (867 of 11616 strings)
2020-12-18 14:29:09 +01:00
Meiru
c17ad66af6 Translated using Weblate (Japanese)
Currently translated at 99.9% (11611 of 11616 strings)
2020-12-18 14:29:08 +01:00
Nut
9943bf336e Tomb ghosts 2020-12-17 14:48:19 +01:00
Jiri Zizkin Zizka
95f048daf0 Translated using Weblate (Czech)
Currently translated at 34.0% (3961 of 11616 strings)
2020-12-16 23:22:31 +01:00
Jiri Zizkin Zizka
4899361c7a Translated using Weblate (Czech)
Currently translated at 33.8% (3932 of 11616 strings)
2020-12-16 16:37:05 +01:00
Meiru
98b82110b8 Translated using Weblate (Japanese)
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-16 13:34:23 +01:00
Meiru
3bb09ad2d9 Translated using Weblate (Japanese)
Currently translated at 99.0% (11505 of 11616 strings)
2020-12-15 15:28:44 +01:00
Meiru
8c66daed6d Translated using Weblate (Japanese)
Currently translated at 98.1% (11403 of 11616 strings)
2020-12-15 05:42:34 +01:00
Meiru
b92c2d428a Translated using Weblate (Japanese)
Currently translated at 96.2% (11183 of 11616 strings)
2020-12-14 06:17:57 +01:00
Jiri Zizkin Zizka
c54a1d0b0b Translated using Weblate (Czech)
Currently translated at 33.0% (3834 of 11616 strings)
2020-12-13 23:23:04 +01:00
Meiru
8094acebdf Translated using Weblate (Japanese)
Currently translated at 96.2% (11183 of 11616 strings)
2020-12-13 23:23:01 +01:00
Jiri Zizkin Zizka
e0f4112f49 Translated using Weblate (Czech)
Currently translated at 32.5% (3781 of 11616 strings)
2020-12-13 18:41:14 +01:00
Meiru
2979561044 Translated using Weblate (Japanese)
Currently translated at 96.2% (11183 of 11616 strings)
2020-12-13 18:41:11 +01:00
Meiru
5aeeefa0f0 Translated using Weblate (Japanese)
Currently translated at 95.5% (11097 of 11616 strings)
2020-12-13 03:34:25 +01:00
Meiru
2e8fea9bcd Translated using Weblate (Japanese)
Currently translated at 93.9% (10918 of 11616 strings)
2020-12-12 08:55:00 +01:00
Meiru
4dd3ab85b4 Translated using Weblate (Japanese)
Currently translated at 93.0% (10809 of 11616 strings)
2020-12-10 16:24:59 +01:00
Meiru
e0d6c7b354 Translated using Weblate (Japanese)
Currently translated at 92.0% (10695 of 11616 strings)
2020-12-10 07:45:25 +01:00
Jiri Zizkin Zizka
18f4df9949 Translated using Weblate (Czech)
Currently translated at 31.1% (3617 of 11616 strings)
2020-12-09 12:00:56 +01:00
Ricardo
1c0058a0a4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (11616 of 11616 strings)
2020-12-09 12:00:34 +01:00
Meiru
7a9bd42b15 Translated using Weblate (Japanese)
Currently translated at 90.5% (10515 of 11616 strings)
2020-12-09 12:00:30 +01:00
Meiru
53d691666c Translated using Weblate (Japanese)
Currently translated at 88.9% (10327 of 11616 strings)
2020-12-06 15:00:50 +01:00
Meiru
ca453cb066 Translated using Weblate (Japanese)
Currently translated at 88.4% (10273 of 11616 strings)
2020-12-06 08:54:33 +01:00
Meiru
4dbd4197df Translated using Weblate (Japanese)
Currently translated at 87.1% (10119 of 11616 strings)
2020-12-04 11:01:04 +01:00
Meiru
e2cd220b5c Translated using Weblate (Japanese)
Currently translated at 86.3% (10031 of 11616 strings)
2020-12-03 15:13:35 +01:00
Meiru
2edf1cf3f1 Translated using Weblate (Japanese)
Currently translated at 85.4% (9930 of 11616 strings)
2020-12-02 07:50:22 +01:00
Meiru
be3d751164 Translated using Weblate (Japanese)
Currently translated at 85.2% (9908 of 11616 strings)
2020-12-02 03:30:21 +01:00
atsymboldot
4f8a035c22 Update whatsnew.txt
minor wording in whatsnew
2020-11-29 19:22:18 -08:00
Meiru
c0e047672e Translated using Weblate (Japanese)
Currently translated at 83.7% (9730 of 11616 strings)
2020-11-30 03:15:44 +01:00
Jiri Zizkin Zizka
9345865ee0 Translated using Weblate (Czech)
Currently translated at 24.3% (2831 of 11616 strings)
2020-11-29 12:25:04 +01:00
Echedey
3d30d4e3bb Translated using Weblate (Spanish)
Currently translated at 82.4% (9576 of 11616 strings)
2020-11-29 12:25:02 +01:00
Meiru
c948927ba5 Translated using Weblate (Japanese)
Currently translated at 82.9% (9634 of 11616 strings)
2020-11-29 08:17:47 +01:00
Meiru
05e47e7d50 Translated using Weblate (Japanese)
Currently translated at 82.2% (9556 of 11616 strings)
2020-11-28 14:27:28 +01:00
Echedey
7a7b79074a Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-27 20:29:07 +01:00
Jiri Zizkin Zizka
f90372c9df Translated using Weblate (Czech)
Currently translated at 23.9% (2781 of 11616 strings)
2020-11-27 20:29:06 +01:00
Ricardo
758ee87ab8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-27 20:29:04 +01:00
Meiru
6a4957e4bc Translated using Weblate (Japanese)
Currently translated at 81.2% (9435 of 11616 strings)
2020-11-27 20:29:02 +01:00
Echedey
f22f7f606c Translated using Weblate (Spanish)
Currently translated at 81.1% (9427 of 11616 strings)
2020-11-27 20:29:00 +01:00
Ruben Rodriguez Martin
484c786f61 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:45:18 +01:00
Anderson Guzman Abreu
8e3e6b89ef Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:45:18 +01:00
Echedey
f44c695a04 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:45:18 +01:00
Echedey
3468880077 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:40:12 +01:00
Evaristo Sintetas
21f2dd62f5 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:40:11 +01:00
Ruben Rodriguez Martin
608c253e8e Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:40:11 +01:00
Daniel-Ømicrón Rodríguez Garcí
30edb77b30 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-11-26 19:40:10 +01:00
Meiru
a6f76bf1ff Translated using Weblate (Japanese)
Currently translated at 79.7% (9263 of 11616 strings)
2020-11-26 04:29:15 +01:00
Nathan Watson
592c676e98 add passive achievement check when sleeping/respawning 2020-11-24 21:05:28 -08:00
Meiru
6c3b357a5e Translated using Weblate (Japanese)
Currently translated at 77.8% (9041 of 11616 strings)
2020-11-23 13:29:01 +01:00
Jean-Pascal Rhir
9661560698 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-23 13:28:59 +01:00
Jean-Pascal Rhir
f33c3dc44a Translated using Weblate (French)
Currently translated at 100.0% (563 of 563 strings)
2020-11-23 13:28:57 +01:00
Meiru
2db9fe181e Translated using Weblate (Japanese)
Currently translated at 76.9% (8936 of 11616 strings)
2020-11-22 12:47:57 +01:00
Meiru
63f6ff48cf Translated using Weblate (Japanese)
Currently translated at 76.6% (8901 of 11616 strings)
2020-11-22 11:18:11 +01:00
Jean-Pascal Rhir
dc366f6ed4 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-22 11:18:10 +01:00
Meiru
5ce3d00570 Translated using Weblate (Japanese)
Currently translated at 76.4% (8879 of 11616 strings)
2020-11-20 15:08:02 +01:00
Meiru
72db7b3f19 Translated using Weblate (Japanese)
Currently translated at 75.5% (8777 of 11616 strings)
2020-11-20 02:54:04 +01:00
Jiri Zizkin Zizka
4e5dfecccc Translated using Weblate (Czech)
Currently translated at 21.6% (2511 of 11616 strings)
2020-11-20 00:01:45 +01:00
Meiru
8da40e60cf Translated using Weblate (Japanese)
Currently translated at 75.3% (8753 of 11616 strings)
2020-11-20 00:01:43 +01:00
Jiri Zizkin Zizka
2aaf902d83 Translated using Weblate (Czech)
Currently translated at 20.0% (2330 of 11616 strings)
2020-11-18 06:28:51 +01:00
Meiru
2b5d1bec94 Translated using Weblate (Japanese)
Currently translated at 74.6% (8670 of 11616 strings)
2020-11-18 06:28:49 +01:00
Meiru
0f79254c8c Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-11-18 06:28:48 +01:00
atsymboldot
825538d653 Merge pull request #46 from atsymboldot/patch-2
Update whatsnew.txt
2020-11-17 19:18:32 -08:00
atsymboldot
c487a52cbd Merge pull request #47 from atsymboldot/test_fungi
Update the dpad graphic
2020-11-17 19:17:10 -08:00
Nathan Watson
b987272a4a update dpad graphic 2020-11-17 17:34:53 -08:00
Meiru
519e082a85 Translated using Weblate (Japanese)
Currently translated at 74.4% (8648 of 11616 strings)
2020-11-17 14:27:45 +01:00
Meiru
85d91f0b89 Translated using Weblate (Japanese)
Currently translated at 74.1% (8611 of 11616 strings)
2020-11-17 08:35:15 +01:00
Meiru
b895b660b6 Translated using Weblate (Japanese)
Currently translated at 73.4% (8530 of 11616 strings)
2020-11-16 12:28:56 +01:00
Jean-Pascal Rhir
ce50baedb5 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-16 12:28:55 +01:00
Meiru
8a7c628095 Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-11-16 12:28:53 +01:00
Meiru
79629f4d10 Translated using Weblate (Japanese)
Currently translated at 73.3% (8520 of 11616 strings)
2020-11-16 04:04:14 +01:00
Meiru
45e44e513b Translated using Weblate (Japanese)
Currently translated at 72.8% (8461 of 11616 strings)
2020-11-15 03:36:07 +01:00
Jean-Pascal Rhir
5529382a05 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-15 03:36:04 +01:00
Meiru
e6475fe58e Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-11-15 03:36:03 +01:00
Jean-Pascal Rhir
a46483f080 Translated using Weblate (French)
Currently translated at 100.0% (563 of 563 strings)
2020-11-15 03:36:03 +01:00
atsymboldot
f846b5d50b Update whatsnew.txt
add descriptions for the atsymboldot PRs (sorry, I don't have write access here)
2020-11-14 23:15:42 +00:00
Nut
7c95793fc0 Whats new for Fungi_panic release 2020-11-15 00:06:48 +01:00
Meiru
c8eb41f7f5 Translated using Weblate (Japanese)
Currently translated at 71.5% (8314 of 11616 strings)
2020-11-12 16:17:15 +01:00
Xeon Determined
494b124599 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.0% (310 of 563 strings)
2020-11-11 16:28:59 +01:00
zoollcar
b8ce971fc8 Translated using Weblate (Chinese (Simplified))
Currently translated at 55.0% (310 of 563 strings)
2020-11-11 16:28:58 +01:00
huzhanrong
3ef96948c8 Translated using Weblate (Chinese (Simplified))
Currently translated at 7.3% (853 of 11616 strings)
2020-11-11 16:28:56 +01:00
zoollcar
84b2e470ee Translated using Weblate (Chinese (Simplified))
Currently translated at 7.3% (853 of 11616 strings)
2020-11-11 16:28:56 +01:00
Meiru
f4aa4dee53 Translated using Weblate (Japanese)
Currently translated at 71.5% (8314 of 11616 strings)
2020-11-11 16:28:52 +01:00
Jean-Pascal Rhir
ebc3d93774 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-11 16:28:46 +01:00
Meiru
61febe0299 Translated using Weblate (Japanese)
Currently translated at 71.5% (8314 of 11616 strings)
2020-11-11 14:31:15 +01:00
Gerardyang
ce45d0b5bd Translated using Weblate (Chinese (Simplified))
Currently translated at 6.5% (762 of 11616 strings)
2020-11-11 04:25:56 +01:00
zoollcar
5e21375181 Translated using Weblate (Chinese (Simplified))
Currently translated at 6.5% (762 of 11616 strings)
2020-11-11 04:25:55 +01:00
huzhanrong
49697c20d4 Translated using Weblate (Chinese (Simplified))
Currently translated at 6.5% (762 of 11616 strings)
2020-11-11 04:25:55 +01:00
Gonk
19e0d6d3c4 Fix, thanks to Nathan 2020-11-10 20:08:09 +01:00
Meiru
9934a1312a Translated using Weblate (Japanese)
Currently translated at 71.5% (8314 of 11616 strings)
2020-11-10 04:47:04 +01:00
Meiru
a8ebe2dcf3 Translated using Weblate (Japanese)
Currently translated at 71.5% (8314 of 11616 strings)
2020-11-10 04:31:25 +01:00
Jean-Pascal Rhir
3cf92843fb Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-10 04:31:22 +01:00
Gonk
6dc33bcac2 Fixed rounding issues regarding skills and also a fix for gold quantity 2020-11-09 20:44:01 +01:00
Meiru
d5df5ae95d Translated using Weblate (Japanese)
Currently translated at 71.2% (8276 of 11616 strings)
2020-11-09 15:31:50 +01:00
Gökhan Demirden
7e47e5862e Translated using Weblate (Turkish)
Currently translated at 24.9% (2897 of 11616 strings)
2020-11-09 14:26:52 +01:00
Jean-Pascal Rhir
264937dded Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-09 14:26:51 +01:00
Meiru
d5595c1fcc Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-11-09 14:26:49 +01:00
Meiru
24da584d20 Translated using Weblate (Japanese)
Currently translated at 71.2% (8276 of 11616 strings)
2020-11-09 13:57:24 +01:00
Meiru
c852d47373 Translated using Weblate (Japanese)
Currently translated at 71.1% (8269 of 11616 strings)
2020-11-09 03:18:22 +01:00
Meiru
b4a542a0e7 Translated using Weblate (Japanese)
Currently translated at 69.8% (8115 of 11616 strings)
2020-11-04 15:29:53 +01:00
Meiru
1f2269395f Translated using Weblate (Japanese)
Currently translated at 69.7% (8103 of 11616 strings)
2020-11-04 08:34:23 +01:00
Jean-Pascal Rhir
d90e60f171 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-04 00:31:36 +01:00
Meiru
b5b089043d Translated using Weblate (Japanese)
Currently translated at 69.1% (8028 of 11616 strings)
2020-11-03 14:17:51 +01:00
Lacrom
c5caec66c1 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-03 14:17:49 +01:00
Jean-Pascal Rhir
f5e43fe0c5 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-03 14:17:49 +01:00
Meiru
4803d838ab Translated using Weblate (Japanese)
Currently translated at 69.0% (8016 of 11616 strings)
2020-11-03 11:00:56 +01:00
Jean-Pascal Rhir
0c3f32344e Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-03 11:00:55 +01:00
Lacrom
dbacb524c9 Translated using Weblate (French)
Currently translated at 100.0% (11616 of 11616 strings)
2020-11-03 11:00:54 +01:00
Meiru
e5d7fa8bf6 Translated using Weblate (Japanese)
Currently translated at 68.3% (7944 of 11616 strings)
2020-11-01 23:29:41 +01:00
Jean-Pascal Rhir
f7301f9217 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-11-01 23:29:39 +01:00
Gonk
3ca676c57b Merge branch 'test_fungi' of https://github.com/NutAndor/andors-trail into nut_test_fungi 2020-11-01 18:17:59 +01:00
Gonk
eaca079fe2 Made proceedToPhrase non recursive too allow longer chains of dialogues 2020-11-01 18:17:33 +01:00
Nut
53cdf18299 Merge commit '460c92617da80f3cff3ee672de1abbe4c68c4358' into test_fungi 2020-11-01 08:22:12 +01:00
Jean-Pascal Rhir
9180a125e6 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-11-01 00:31:45 +01:00
Meiru
32f0b01cd8 Translated using Weblate (Japanese)
Currently translated at 67.4% (7835 of 11616 strings)
2020-11-01 00:31:26 +01:00
Jean-Pascal Rhir
c9cb420377 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-11-01 00:31:24 +01:00
Meiru
eff1e3272f Translated using Weblate (Japanese)
Currently translated at 66.9% (7772 of 11616 strings)
2020-10-31 04:06:23 +01:00
Meiru
cda3a327d9 Translated using Weblate (Japanese)
Currently translated at 65.5% (7615 of 11616 strings)
2020-10-29 06:24:02 +01:00
Jean-Pascal Rhir
be78b4d868 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-29 06:23:59 +01:00
Meiru
bb12b85dfd Translated using Weblate (Japanese)
Currently translated at 64.6% (7505 of 11616 strings)
2020-10-28 03:26:54 +01:00
Jean-Pascal Rhir
9599e4e3ee Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-28 03:26:51 +01:00
Meiru
b88b807a2b Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-10-28 03:26:48 +01:00
Jean-Pascal Rhir
f2907f6b0c Translated using Weblate (French)
Currently translated at 100.0% (563 of 563 strings)
2020-10-28 03:26:48 +01:00
Meiru
bdff300787 Translated using Weblate (Japanese)
Currently translated at 63.8% (7418 of 11616 strings)
2020-10-27 05:53:29 +01:00
Meiru
c0bd9c836a Translated using Weblate (Japanese)
Currently translated at 61.8% (7183 of 11616 strings)
2020-10-25 15:57:52 +01:00
Gonk
1b105083d4 Merge branch 'test_fungi' of https://github.com/NutAndor/andors-trail into nut_test_fungi 2020-10-23 20:42:56 +02:00
Gonk
ea03067b2b Damage modifier when dual wielding now depends on the dual wield skill 2020-10-23 20:42:29 +02:00
JEROME ADVINCULA
dc2f606bf9 Translated using Weblate (Filipino)
Currently translated at 2.0% (242 of 11616 strings)
2020-10-23 15:26:49 +02:00
Xeon Determined
a09fb92936 Translated using Weblate (Chinese (Simplified))
Currently translated at 34.9% (197 of 563 strings)
2020-10-23 15:26:47 +02:00
Meiru
bfd0b3d206 Translated using Weblate (Japanese)
Currently translated at 60.5% (7033 of 11616 strings)
2020-10-23 15:26:47 +02:00
Jean-Pascal Rhir
3d73f58744 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-23 15:26:45 +02:00
Meiru
609851d4d1 Translated using Weblate (Japanese)
Currently translated at 60.5% (7033 of 11616 strings)
2020-10-23 13:03:27 +02:00
Meiru
74a80b34b7 Translated using Weblate (Japanese)
Currently translated at 60.3% (7012 of 11616 strings)
2020-10-23 09:14:13 +02:00
Meiru
737bf305b0 Translated using Weblate (Japanese)
Currently translated at 59.7% (6944 of 11616 strings)
2020-10-22 13:47:54 +02:00
Meiru
e892f22a4c Translated using Weblate (Japanese)
Currently translated at 59.3% (6895 of 11616 strings)
2020-10-22 13:26:51 +02:00
roberto
3b2b4856f6 Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-22 13:26:49 +02:00
Jean-Pascal Rhir
e282f97202 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-22 13:26:47 +02:00
Jean-Pascal Rhir
680dc57a8d Translated using Weblate (French)
Currently translated at 100.0% (563 of 563 strings)
2020-10-22 13:26:44 +02:00
Ricardo
d4a060520c Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-20 23:30:34 +02:00
Meiru
a14f21b024 Translated using Weblate (Japanese)
Currently translated at 58.5% (6805 of 11616 strings)
2020-10-20 23:30:32 +02:00
roberto
61c3a2756e Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-20 23:30:30 +02:00
Jean-Pascal Rhir
626e64a58e Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-20 23:30:29 +02:00
Meiru
fb56c7073d Translated using Weblate (Japanese)
Currently translated at 58.5% (6805 of 11616 strings)
2020-10-20 16:46:53 +02:00
Meiru
1daea8e21c Translated using Weblate (Japanese)
Currently translated at 57.9% (6735 of 11616 strings)
2020-10-20 04:53:11 +02:00
Ricardo
66990846cc Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.3% (11429 of 11616 strings)
2020-10-20 03:29:42 +02:00
Meiru
e51937e322 Translated using Weblate (Japanese)
Currently translated at 57.8% (6716 of 11616 strings)
2020-10-20 00:44:17 +02:00
roberto
501516ed1d Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-20 00:44:15 +02:00
Jean-Pascal Rhir
535a5737ba Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-20 00:44:14 +02:00
Meiru
2c73df1a97 Translated using Weblate (Japanese)
Currently translated at 57.7% (6706 of 11616 strings)
2020-10-19 11:32:53 +02:00
Jean-Pascal Rhir
d215046cf4 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-19 11:32:51 +02:00
Meiru
948fa47fac Translated using Weblate (Japanese)
Currently translated at 57.7% (6705 of 11616 strings)
2020-10-19 10:29:46 +02:00
Meiru
7a59d2fcc1 Translated using Weblate (Japanese)
Currently translated at 55.6% (6469 of 11616 strings)
2020-10-17 19:03:31 +02:00
roberto
c2651b9beb Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-17 19:03:30 +02:00
Meiru
4dfce1430f Translated using Weblate (Japanese)
Currently translated at 55.2% (6414 of 11616 strings)
2020-10-17 04:32:06 +02:00
Meiru
e767b54526 Translated using Weblate (Japanese)
Currently translated at 54.0% (6276 of 11616 strings)
2020-10-16 03:26:43 +02:00
roberto
300a8aa5fb Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-16 03:26:42 +02:00
Meiru
27d159a698 Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-10-16 03:26:40 +02:00
Nut
3d5c6276c0 probably version 57 2020-10-15 14:03:57 +02:00
Nut
92e12f0f36 version 56 2020-10-15 12:58:35 +02:00
Nut
608d416506 version 56 2020-10-15 12:53:20 +02:00
Nut
ed28db35fb Merge remote-tracking branch 'andors-trail/master' 2020-10-15 12:39:49 +02:00
Nut
d9b857abf6 missing compiled translations (mo files) 2020-10-15 12:34:48 +02:00
Nut
edcb0984e8 missing compiled translations (mo files) 2020-10-15 12:16:08 +02:00
Meiru
9e54b70fdd Translated using Weblate (Japanese)
Currently translated at 54.0% (6275 of 11616 strings)
2020-10-15 09:35:13 +02:00
Hary Tafianoto
658930e425 Translated using Weblate (Indonesian)
Currently translated at 97.5% (549 of 563 strings)
2020-10-14 08:26:42 +02:00
Meiru
6ee0ca0485 Translated using Weblate (Japanese)
Currently translated at 53.3% (6197 of 11616 strings)
2020-10-14 08:26:41 +02:00
Hary Tafianoto
0da87913c6 Translated using Weblate (Indonesian)
Currently translated at 0.8% (97 of 11616 strings)
2020-10-14 08:26:40 +02:00
m khoirul fatikhin
daa480276f Translated using Weblate (Indonesian)
Currently translated at 0.8% (97 of 11616 strings)
2020-10-14 08:26:39 +02:00
Meiru
c99c90d574 Translated using Weblate (Japanese)
Currently translated at 53.3% (6197 of 11616 strings)
2020-10-13 15:05:41 +02:00
Hary Tafianoto
9b83e6b41e Translated using Weblate (Indonesian)
Currently translated at 93.9% (529 of 563 strings)
2020-10-13 02:26:44 +02:00
Jiri Zizkin Zizka
03a24b0155 Translated using Weblate (Czech)
Currently translated at 17.8% (2068 of 11616 strings)
2020-10-13 02:26:43 +02:00
Ömer Faruk Çakmak
1f60fe227f Translated using Weblate (Turkish)
Currently translated at 24.7% (2877 of 11616 strings)
2020-10-13 02:26:41 +02:00
Meiru
62cc2d1b7e Translated using Weblate (Japanese)
Currently translated at 52.1% (6057 of 11616 strings)
2020-10-13 02:26:40 +02:00
Meiru
61377dd5f6 Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-10-13 02:26:38 +02:00
Meiru
2c0d112f11 Translated using Weblate (Japanese)
Currently translated at 51.3% (5968 of 11616 strings)
2020-10-11 09:49:54 +02:00
Nathan Watson
460c92617d Add spore_poison immunity skill from Zuul'khan 2020-10-10 23:42:17 -07:00
Elytra Wixzo
9f6648a0c7 Translated using Weblate (Filipino)
Currently translated at 2.0% (236 of 11616 strings)
2020-10-11 07:27:05 +02:00
Hary Tafianoto
d1a2ef7edf Translated using Weblate (Indonesian)
Currently translated at 88.2% (497 of 563 strings)
2020-10-11 07:27:03 +02:00
Jiri Zizkin Zizka
8a124b8195 Translated using Weblate (Czech)
Currently translated at 17.7% (2060 of 11616 strings)
2020-10-11 07:27:02 +02:00
Meiru
6f075fc768 Translated using Weblate (Japanese)
Currently translated at 51.1% (5947 of 11616 strings)
2020-10-11 07:26:39 +02:00
Meiru
3fdf3ea21d Translated using Weblate (Japanese)
Currently translated at 49.8% (5788 of 11616 strings)
2020-10-09 17:32:58 +02:00
roberto
ca552f7748 Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-09 17:32:57 +02:00
roberto
70ac3e95e2 Translated using Weblate (Italian)
Currently translated at 100.0% (563 of 563 strings)
2020-10-09 17:32:55 +02:00
Meiru
e79d357014 Translated using Weblate (Japanese)
Currently translated at 49.1% (5710 of 11616 strings)
2020-10-09 07:03:54 +02:00
koffevar
9facf68532 Translated using Weblate (Russian)
Currently translated at 97.3% (11308 of 11616 strings)
2020-10-08 22:37:50 +02:00
Meiru
56b0f62499 Translated using Weblate (Japanese)
Currently translated at 48.9% (5683 of 11616 strings)
2020-10-08 22:37:49 +02:00
roberto
6201e1ccaa Translated using Weblate (Italian)
Currently translated at 100.0% (11616 of 11616 strings)
2020-10-08 22:37:46 +02:00
Ruben Rodriguez Martin
fc0a42bf71 Translated using Weblate (Spanish)
Currently translated at 79.7% (9269 of 11616 strings)
2020-10-08 22:37:44 +02:00
Meiru
55d57ef95a Translated using Weblate (Japanese)
Currently translated at 100.0% (563 of 563 strings)
2020-10-08 22:37:43 +02:00
Ruben Rodriguez Martin
588d045b47 Translated using Weblate (Spanish)
Currently translated at 100.0% (563 of 563 strings)
2020-10-07 08:08:21 +02:00
Gerardyang
67e0b92fc3 Translated using Weblate (Chinese (Simplified))
Currently translated at 6.3% (736 of 11616 strings)
2020-10-07 08:08:21 +02:00
Meiru
5bea8fa817 Translated using Weblate (Japanese)
Currently translated at 48.6% (5646 of 11616 strings)
2020-10-07 08:08:19 +02:00
roberto
0212a8f53d Translated using Weblate (Italian)
Currently translated at 98.1% (11406 of 11616 strings)
2020-10-07 08:08:16 +02:00
Adolfo Jayme Barrientos
96afcf86f0 Translated using Weblate (Spanish)
Currently translated at 79.5% (9245 of 11616 strings)
2020-10-07 08:08:14 +02:00
Ruben Rodriguez Martin
c389ed837e Translated using Weblate (Spanish)
Currently translated at 79.5% (9243 of 11616 strings)
2020-10-06 22:56:15 +02:00
Adolfo Jayme Barrientos
b8c898e883 Translated using Weblate (Spanish)
Currently translated at 79.5% (9243 of 11616 strings)
2020-10-06 22:56:15 +02:00
Ruben Rodriguez Martin
12159ce377 Translated using Weblate (Spanish)
Currently translated at 79.0% (9180 of 11616 strings)
2020-10-06 22:32:21 +02:00
Adolfo Jayme Barrientos
6e8646f619 Translated using Weblate (Spanish)
Currently translated at 79.0% (9180 of 11616 strings)
2020-10-06 22:32:20 +02:00
Juan Manuel Cantero Diego
e3280656a6 Translated using Weblate (Spanish)
Currently translated at 78.9% (9172 of 11616 strings)
2020-10-06 22:20:20 +02:00
Ruben Rodriguez Martin
f934bc5c5d Translated using Weblate (Spanish)
Currently translated at 78.9% (9172 of 11616 strings)
2020-10-06 22:20:19 +02:00
Adolfo Jayme Barrientos
55e1eb5f06 Translated using Weblate (Spanish)
Currently translated at 78.9% (9172 of 11616 strings)
2020-10-06 22:20:19 +02:00
Ruben Rodriguez Martin
41f0839961 Translated using Weblate (Spanish)
Currently translated at 78.6% (9141 of 11616 strings)
2020-10-06 21:56:14 +02:00
Atrate
161a9e0bf2 Translated using Weblate (Polish)
Currently translated at 86.4% (10040 of 11616 strings)
2020-10-05 14:12:35 +02:00
Meiru
969e7c0a14 Translated using Weblate (Japanese)
Currently translated at 48.3% (5619 of 11616 strings)
2020-10-05 14:12:33 +02:00
Christophe Nemo
b9c6df5503 Translated using Weblate (French)
Currently translated at 99.9% (11615 of 11616 strings)
2020-10-05 14:12:31 +02:00
ssantos
1a50f3da22 Translated using Weblate (Portuguese)
Currently translated at 99.4% (560 of 563 strings)
2020-10-05 14:12:30 +02:00
Nut
97feb1117d boss_fungi 2020-10-04 22:00:15 +02:00
Meiru
5d3278dac8 Translated using Weblate (Japanese)
Currently translated at 47.6% (5539 of 11616 strings)
2020-10-04 08:24:23 +02:00
Gonk
3423abc6b0 Increased API level to 29 so we can update AT after november 2020
Use requestLegacyExternalStorage flag to opt out of scoped storage
2020-10-03 20:13:52 +02:00
Nut
a695647175 translation fixes 2020-10-03 17:54:19 +02:00
Nut
0d1941a320 Merge remote-tracking branch 'hosted.weblate/master' 2020-10-03 16:52:24 +02:00
Nut Andor
c46dac5499 Translated using Weblate (Tagalog)
Currently translated at 100.0% (563 of 563 strings)
2020-10-03 16:50:23 +02:00
Nut Andor
4a13fd0d40 Translated using Weblate (Basque)
Currently translated at 64.6% (364 of 563 strings)
2020-10-03 16:50:23 +02:00
Meiru
88eb13fbe8 Translated using Weblate (Japanese)
Currently translated at 47.5% (5521 of 11617 strings)
2020-10-03 16:50:22 +02:00
Christophe Nemo
31c8a05d13 Translated using Weblate (French)
Currently translated at 99.8% (11597 of 11617 strings)
2020-10-03 16:50:19 +02:00
Nut Andor
0c8eac7321 Translated using Weblate (Polish)
Currently translated at 99.4% (560 of 563 strings)
2020-10-03 16:50:17 +02:00
Elytra Wixzo
957142db99 Translated using Weblate (Filipino)
Currently translated at 2.0% (235 of 11616 strings)
2020-10-02 11:41:58 +02:00
Nut Andor
ca01b72f9e Translated using Weblate (Ukrainian)
Currently translated at 99.4% (560 of 563 strings)
2020-10-02 11:41:57 +02:00
Erick Ferraz Vieira
9fd769cf65 Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.3% (11429 of 11617 strings)
2020-10-02 11:41:55 +02:00
Anderson Nogueira Silva
d329895cdb Translated using Weblate (Portuguese (Brazil))
Currently translated at 98.3% (11429 of 11617 strings)
2020-10-02 11:41:55 +02:00
Meiru
0e1f8d8f1f Translated using Weblate (Japanese)
Currently translated at 46.2% (5373 of 11617 strings)
2020-10-02 11:41:52 +02:00
Jean-Pascal Rhir
fa9e186062 Translated using Weblate (French)
Currently translated at 99.7% (11591 of 11617 strings)
2020-10-02 11:41:01 +02:00
Christophe Nemo
12b8026ade Translated using Weblate (French)
Currently translated at 99.7% (11591 of 11617 strings)
2020-10-02 11:41:01 +02:00
ssantos
2308895a68 Translated using Weblate (Portuguese)
Currently translated at 99.4% (560 of 563 strings)
2020-10-02 11:40:59 +02:00
Nut Andor
a6f14cfa9e Translated using Weblate (Portuguese)
Currently translated at 99.4% (560 of 563 strings)
2020-10-02 11:40:58 +02:00
Christophe Nemo
0d8eb9669a Translated using Weblate (French)
Currently translated at 97.6% (11346 of 11617 strings)
2020-10-02 00:15:45 +02:00
Jean-Pascal Rhir
f6798ddf82 Translated using Weblate (French)
Currently translated at 97.6% (11346 of 11617 strings)
2020-10-02 00:15:44 +02:00
Gonk
94f5296067 Merge branch 'queststepsort' into nut_test_fungi 2020-10-01 22:59:07 +02:00
Gonk
42fcbecf7c Merge remote-tracking branch 'atsymboldot/no-tapping-out-of-loot' into nut_test_fungi 2020-10-01 22:51:00 +02:00
Gonk
a8e6d27983 Merge remote-tracking branch 'atsymboldot/combat-log-improvements' into nut_test_fungi
# Conflicts:
#	AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/ItemController.java
2020-10-01 22:49:10 +02:00
Gonk
584c8885f3 Merge remote-tracking branch 'jasptravis/travis' into nut_test_fungi
Omitted PO file change

# Conflicts:
#	AndorsTrail/assets/translation/de.po
2020-10-01 22:37:49 +02:00
Jiri Zizkin Zizka
36d9e34087 Translated using Weblate (Czech)
Currently translated at 17.7% (2061 of 11617 strings)
2020-09-30 19:33:46 +02:00
Meiru
c11dcb514b Translated using Weblate (Japanese)
Currently translated at 45.5% (5286 of 11617 strings)
2020-09-30 19:33:45 +02:00
Christophe Nemo
a9a29914ef Translated using Weblate (French)
Currently translated at 95.6% (11115 of 11617 strings)
2020-09-30 19:33:43 +02:00
THANOS SIOURDAKIS
8f983029dc Translated using Weblate (Greek)
Currently translated at 96.8% (545 of 563 strings)
2020-09-30 14:32:33 +02:00
amir sadakah
fb46f5afcc Translated using Weblate (Arabic)
Currently translated at 0.1% (19 of 11616 strings)
2020-09-30 14:32:33 +02:00
Jiri Zizkin Zizka
0f788365a8 Translated using Weblate (Czech)
Currently translated at 17.7% (2061 of 11617 strings)
2020-09-30 14:32:32 +02:00
Meiru
8551592990 Translated using Weblate (Japanese)
Currently translated at 45.2% (5260 of 11617 strings)
2020-09-30 14:32:31 +02:00
Laure Runser
d12765bb92 Translated using Weblate (French)
Currently translated at 94.7% (11005 of 11617 strings)
2020-09-30 14:32:27 +02:00
Lacrom
74d01d879c Translated using Weblate (French)
Currently translated at 94.7% (11005 of 11617 strings)
2020-09-30 14:32:27 +02:00
Christophe Nemo
a193eb55ed Translated using Weblate (French)
Currently translated at 94.7% (11005 of 11617 strings)
2020-09-30 14:32:26 +02:00
Christophe Nemo
41c56d896c Translated using Weblate (French)
Currently translated at 100.0% (563 of 563 strings)
2020-09-30 14:32:24 +02:00
Meiru
13c77213df Translated using Weblate (Japanese)
Currently translated at 45.2% (5260 of 11617 strings)
2020-09-30 13:15:04 +02:00
Nut
f470cbd462 Basics changes for test fungi_panic 2020-09-30 00:10:38 +02:00
Nut
22999d5632 Merge branch 'master' into test_fungi
# Conflicts:
#	AndorsTrail/res/values/authors.xml
2020-09-30 00:04:57 +02:00
Nut
ff7c38bc35 Merge remote-tracking branch 'andors-trail/master' 2020-09-29 23:46:49 +02:00
Christophe Nemo
cf0c30c622 Translated using Weblate (French)
Currently translated at 91.3% (10614 of 11617 strings)
2020-09-29 17:02:22 +02:00
Lacrom
6fb6d326a7 Translated using Weblate (French)
Currently translated at 91.3% (10614 of 11617 strings)
2020-09-29 17:02:21 +02:00
Elytra Wixzo
41c6cb13df Translated using Weblate (Filipino)
Currently translated at 1.9% (231 of 11616 strings)
2020-09-29 12:21:36 +02:00
Passachol Tassanakul
1ad07ae491 Translated using Weblate (Thai)
Currently translated at 8.7% (49 of 563 strings)
2020-09-29 12:21:35 +02:00
Mingun
bcdf4bb8e6 Translated using Weblate (Russian)
Currently translated at 97.3% (11307 of 11617 strings)
2020-09-29 12:21:34 +02:00
Erick Ferraz Vieira
ba0cf8467b Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.7% (11351 of 11617 strings)
2020-09-29 12:21:32 +02:00
Meiru
1fbb25391f Translated using Weblate (Japanese)
Currently translated at 44.4% (5169 of 11617 strings)
2020-09-29 12:21:29 +02:00
Mingun
ee809b7cc4 Translated using Weblate (Russian)
Currently translated at 100.0% (563 of 563 strings)
2020-09-29 12:21:27 +02:00
Erick Ferraz Vieira
2f39f077f7 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (563 of 563 strings)
2020-09-29 12:21:27 +02:00
Gonk
9ab74c881d Queststeps in the quest log are now sorted in chronological order.
Until now they were sorted by step id.
2020-09-28 21:19:51 +02:00
Nut
3e6cf167ad Merge pull request #44 from AndorsTrailRelease/master
update to v0.7.12
2020-09-26 07:23:01 +02:00
Talking Panda
a7890366bb Translated using Weblate (Turkish)
Currently translated at 24.7% (2874 of 11617 strings)
2020-09-26 04:37:00 +02:00
Nikita Epifanov
23ce865aa4 Translated using Weblate (Russian)
Currently translated at 96.8% (11252 of 11617 strings)
2020-09-26 04:36:59 +02:00
Meiru
97776ad4f6 Translated using Weblate (Japanese)
Currently translated at 43.1% (5014 of 11617 strings)
2020-09-26 04:36:57 +02:00
Jannis Scheibe
7f496b7f75 Translated using Weblate (German)
Currently translated at 86.4% (10041 of 11617 strings)
2020-09-26 04:36:56 +02:00
Elytra Wixzo
3650aa8505 Translated using Weblate (Tagalog)
Currently translated at 100.0% (563 of 563 strings)
2020-09-25 04:41:06 +02:00
Elytra Wixzo
f0f9f94a1e Translated using Weblate (Filipino)
Currently translated at 1.6% (196 of 11616 strings)
2020-09-25 04:41:04 +02:00
Jiri Zizkin Zizka
1f077ef95a Translated using Weblate (Czech)
Currently translated at 17.6% (2045 of 11617 strings)
2020-09-25 04:41:03 +02:00
Oğuz Ersen
465c4f418c Translated using Weblate (Turkish)
Currently translated at 24.6% (2864 of 11617 strings)
2020-09-25 04:41:01 +02:00
Meiru
cd028ecb45 Translated using Weblate (Japanese)
Currently translated at 43.0% (5006 of 11617 strings)
2020-09-25 04:40:58 +02:00
Nathan Watson
61966ab7e2 Prevent stray taps from accidentally cancelling loot windows and the permadeath "Game Over" screen 2020-09-20 09:29:37 -07:00
Gonk
f67eb9ce67 Android 11 has new requirements regarding file access.
This prototype has working test code for Android 11 but there is still a lot missing like exlaination dialogues, refactoring, etc
2020-09-13 19:43:17 +02:00
Nut
11830ce814 Translators in authors 2020-08-25 23:33:36 +02:00
Nathan Watson
84d03a2945 Combat log enhancements
Lists experience, gold, and item pickups from combat in the combat log.
2020-08-09 14:39:53 -07:00
Nut
c5df5c5c09 basics for Fungi/Delicious soup 2020-07-05 04:07:52 +02:00
Nut
135c279e1d Merge remote-tracking branch 'andors-trail/master' 2020-06-11 03:03:24 +02:00
Javier Serrano Polo
daf3d810d1 Move source change to build patch 2020-06-10 02:27:37 +02:00
Javier Serrano Polo
84be701870 Drop pure bionic build 2020-06-10 01:24:56 +02:00
Javier Serrano Polo
54750f9287 Merge branch 'master' into travis 2020-06-10 00:40:49 +02:00
Javier Serrano Polo
51fac93c54 Fix build with pbuilder 2020-05-25 01:21:20 +02:00
Javier Serrano Polo
fbcbe4d581 Pass TERM 2020-05-24 11:37:39 +02:00
Javier Serrano Polo
1390223637 Add build for Debian stretch 2020-05-24 10:35:00 +02:00
Javier Serrano Polo
2864b747a3 Debug build (3) 2020-05-23 19:44:40 +02:00
Javier Serrano Polo
45032b7294 Debug build (2) 2020-05-23 18:26:14 +02:00
Javier Serrano Polo
d1d604abbf Debug build (1) 2020-05-23 18:07:00 +02:00
Javier Serrano Polo
691a8318f4 Add missing dependencies 2020-05-23 17:23:03 +02:00
Javier Serrano Polo
05a35a6413 Fix line feeds in German translation 2020-05-23 16:55:31 +02:00
Javier Serrano Polo
c8f6e3c3f5 Add Travis CI support 2020-05-23 16:30:02 +02:00
1091 changed files with 1447105 additions and 88736 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/AndorsTrail/.idea/workspace.xml

14
.travis.yml Normal file
View File

@@ -0,0 +1,14 @@
dist: bionic
sudo: required
cache:
directories:
- $HOME/pbuilder-bases
matrix:
include:
- env: TARGET_OS=stretch
before_install:
- "$TRAVIS_BUILD_DIR/travis/$TRAVIS_OS_NAME.$TARGET_OS.before_install"
install:
- "$TRAVIS_BUILD_DIR/travis/$TRAVIS_OS_NAME.$TARGET_OS.install"
script:
- "$TRAVIS_BUILD_DIR/travis/$TRAVIS_OS_NAME.$TARGET_OS.script"

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>

View File

@@ -1,8 +1,15 @@
# Android ignores
app/src/main/res
app/src/main/assets
gen/
bin/
target/
local.properties
app/build/intermediates/
build/
debug/
release/
.gradle/
#IntelliJ
.idea/
@@ -14,3 +21,35 @@ out/test/
# Other
.metadata
.svn/
#copied from https://github.com/github/gitignore/blob/main/Gradle.gitignore
.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
#copied from https://github.com/github/gitignore/blob/main/Gradle.gitignore
/AndorsTrail/.gradle
/AndorsTrail/gradle/wrapper
/AndorsTrail/app/build/
/AndorsTrail/app/debug/
/AndorsTrail/app/release/

View File

@@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>AndorsTrail</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager" forced_jdk="true">
<conelement value="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" />
<conelement value="com.android.ide.eclipse.adt.LIBRARIES" />
<src_description expected_position="1">
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
<src_folder value="file://$MODULE_DIR$/gen" expected_position="1" />
</src_description>
</component>
<component name="FacetManager">
<facet type="android" name="Android">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/bin/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/libs/android-support-v4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

View File

@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gpl.rpg.AndorsTrail"
android:versionCode="55"
android:versionName="0.7.12"
android:installLocation="auto"
>
<uses-sdk
android:minSdkVersion="4"
android:targetSdkVersion="28"
/>
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".AndorsTrailApplication"
android:label="@string/app_name"
android:icon="@drawable/icon"
android:description="@string/app_description"
android:allowBackup="true"
android:theme="@style/AndorsTrailTheme_Blue"
>
<activity
android:name=".activity.StartScreenActivity"
android:clearTaskOnLaunch="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name"
android:theme="@style/AndorsTrailTheme_Blue.NoBackground"
/>
<activity android:name=".activity.HeroinfoActivity" />
<activity android:name=".activity.MonsterInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.ItemInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.LevelUpActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.MonsterEncounterActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.ConversationActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.ShopActivity" />
<activity android:name=".activity.AboutActivity" />
<activity android:name=".activity.LoadingActivity" />
<activity android:name=".activity.Preferences" />
<activity android:name=".activity.LoadSaveActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.ActorConditionInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.BulkSelectionInterface" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.SkillInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name=".activity.DisplayWorldMapActivity" />
</application>
</manifest>

View File

@@ -0,0 +1,52 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.gpl.rpg.AndorsTrail"
minSdkVersion 14
targetSdkVersion 31
}
buildTypes {
release {
manifestPlaceholders icon_name: 'icon', fileproviderPath: 'AndorsTrail'
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
manifestPlaceholders icon_name: 'icon_beta', fileproviderPath: 'AndorsTrail.beta2'
applicationIdSuffix 'beta2'
}
}
}
dependencies {
implementation 'com.android.support:support-v4:28.0.0'
}
task copyRes(type: Copy) {
description "Copies the res folder to the modules res folder (& renames .tmx to .xml)"
from "${rootDir}/res"
into "${projectDir}/src/main/res"
rename "(.*)\\.tmx", "\$1.xml"
}
task copyTranslation(type: Copy) {
description("Copies the translation files to the modules translations folder")
from "${rootDir}/assets/translation"
into "${projectDir}/src/main/assets/translation"
}
task cleanup(type: Delete) {
description("Deletes the assets/translation and the res folder from the modules folder")
delete "${projectDir}/src/main/res", "${projectDir}/src/main/assets/translation"
}
afterEvaluate {
preBuild.dependsOn project.tasks.copyRes
preBuild.dependsOn project.tasks.copyTranslation
clean.dependsOn project.tasks.cleanup
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="utf-8"?>
<lint>
<issue id="MissingTranslation" severity="ignore" />
<issue id="TypographyDashes" severity="ignore" />

View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gpl.rpg.AndorsTrail"
android:versionCode="68"
android:versionName="0.8.4"
android:installLocation="auto"
>
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name="com.gpl.rpg.AndorsTrail.AndorsTrailApplication"
android:label="@string/app_name"
android:icon="@drawable/${icon_name}"
android:description="@string/app_description"
android:allowBackup="true"
android:theme="@style/AndorsTrailTheme_Blue"
android:requestLegacyExternalStorage="true"
android:hasFragileUserData="true"
android:preserveLegacyExternalStorage="true"
>
<activity
android:name="com.gpl.rpg.AndorsTrail.activity.StartScreenActivity"
android:exported="true"
android:clearTaskOnLaunch="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.gpl.rpg.AndorsTrail.activity.MainActivity"
android:label="@string/app_name"
android:theme="@style/AndorsTrailTheme_Blue.NoBackground"
/>
<activity android:name="com.gpl.rpg.AndorsTrail.activity.HeroinfoActivity" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.MonsterInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.LevelUpActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.MonsterEncounterActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.ConversationActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.ShopActivity" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.AboutActivity" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.LoadingActivity" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.Preferences" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.LoadSaveActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.ActorConditionInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.BulkSelectionInterface" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.SkillInfoActivity" android:theme="@style/AndorsTrailDialogTheme_Blue" />
<activity android:name="com.gpl.rpg.AndorsTrail.activity.DisplayWorldMapActivity" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider" />
</provider>
</application>
</manifest>

View File

@@ -1,171 +1,169 @@
package com.gpl.rpg.AndorsTrail;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.util.Pair;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Environment;
import android.view.Window;
import android.view.WindowManager;
public final class AndorsTrailApplication extends Application {
public static final boolean DEVELOPMENT_DEBUGRESOURCES = false;
public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false;
public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = false;
public static final boolean DEVELOPMENT_FASTSPEED = false;
public static final boolean DEVELOPMENT_VALIDATEDATA = false;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = false;
public static final boolean DEVELOPMENT_INCOMPATIBLE_SAVEGAMES = DEVELOPMENT_DEBUGRESOURCES || DEVELOPMENT_DEBUGBUTTONS || DEVELOPMENT_FASTSPEED;
public static final int DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION = 999;
public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION : 55;
public static final String CURRENT_VERSION_DISPLAY = "0.7.12";
public static final boolean IS_RELEASE_VERSION = !CURRENT_VERSION_DISPLAY.matches(".*[a-d].*");
private final AndorsTrailPreferences preferences = new AndorsTrailPreferences();
private WorldContext world = new WorldContext();
private ControllerContext controllers = new ControllerContext(this, world);
private WorldSetup setup = new WorldSetup(world, controllers, this);
public WorldContext getWorld() { return world; }
public WorldSetup getWorldSetup() { return setup; }
public AndorsTrailPreferences getPreferences() { return preferences; }
public ControllerContext getControllerContext() { return controllers; }
public static AndorsTrailApplication getApplicationFromActivity(Activity activity) {
return ((AndorsTrailApplication) activity.getApplication());
}
public static AndorsTrailApplication getApplicationFromActivityContext(Context context) {
return getApplicationFromActivity(getActivityFromActivityContext(context));
}
private static Activity getActivityFromActivityContext(Context context) {
return (Activity) context;
}
public boolean isInitialized() { return world.model != null; }
public void setWindowParameters(Activity activity) {
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (preferences.fullscreen) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
activity.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
//Get default locale at startup, as somehow it seems that changing the app's
//configured locale impacts the value returned by Locale.getDefault() nowadays.
private final Locale defaultLocale = Locale.getDefault();
private Pair<String, Locale> lastLocale = null;
public boolean setLocale(Activity context) {
Resources res = context.getResources();
Configuration conf = res.getConfiguration();
Locale targetLocale;
if (lastLocale != null && lastLocale.first == preferences.language) {
targetLocale = lastLocale.second;
} else {
targetLocale = localeForLanguageTag(preferences.language);
lastLocale = new Pair<String, Locale>(preferences.language, targetLocale);
}
if (targetLocale.equals(conf.locale)) {
return false;
}
conf.locale = targetLocale;
res.updateConfiguration(conf, res.getDisplayMetrics());
this.getResources().updateConfiguration(conf, res.getDisplayMetrics());
return true;
}
// Supports language or language_COUNTRY in short form e.g. "en" or "en_US"
private Locale localeForLanguageTag(String languageTag) {
Locale locale = null;
if (languageTag != null && !languageTag.equalsIgnoreCase("default")) {
final int pos = languageTag.indexOf('-');
if (pos == -1) {
locale = new Locale(languageTag);
}
else locale = new Locale(languageTag.substring(0, pos), languageTag.substring(pos+1));
}
if (locale == null) {
locale = defaultLocale;
}
return locale;
}
/**
* Logging to text file system as found on https://stackoverflow.com/questions/19565685/saving-logcat-to-a-text-file-in-android-device
*/
public void onCreate() {
super.onCreate();
if ( DEVELOPMENT_DEBUGMESSAGES && isExternalStorageWritable() ) {
File root = Environment.getExternalStorageDirectory();
File appDirectory = new File(root, Constants.FILENAME_SAVEGAME_DIRECTORY);
File logDirectory = new File( appDirectory, "log" );
File logFile = new File( logDirectory, "logcat" + System.currentTimeMillis() + ".txt" );
// create app folder
if ( !appDirectory.exists() ) {
appDirectory.mkdir();
}
// create log folder
if ( !logDirectory.exists() ) {
logDirectory.mkdir();
}
// clear the previous logcat and then write the new one to the file
try {
Process process = Runtime.getRuntime().exec("logcat -c");
process = Runtime.getRuntime().exec("logcat -f " + logFile+" *:W");
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals( state ) ) {
return true;
}
return false;
}
public void discardWorld() {
world = new WorldContext();
controllers = new ControllerContext(this, world);
setup = new WorldSetup(world, controllers, getApplicationContext());
}
}
package com.gpl.rpg.AndorsTrail;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
import com.gpl.rpg.AndorsTrail.util.Pair;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Environment;
import android.view.Window;
import android.view.WindowManager;
public final class AndorsTrailApplication extends Application {
public static final boolean DEVELOPMENT_DEBUGRESOURCES = false;
public static final boolean DEVELOPMENT_FORCE_STARTNEWGAME = false;
public static final boolean DEVELOPMENT_FORCE_CONTINUEGAME = false;
public static final boolean DEVELOPMENT_DEBUGBUTTONS = false;
public static final boolean DEVELOPMENT_FASTSPEED = false;
public static final boolean DEVELOPMENT_VALIDATEDATA = false;
public static final boolean DEVELOPMENT_DEBUGMESSAGES = false;
public static final String CURRENT_VERSION_DISPLAY = "0.8.4";
public static final boolean IS_RELEASE_VERSION = !CURRENT_VERSION_DISPLAY.matches(".*[a-d].*");
public static final boolean DEVELOPMENT_INCOMPATIBLE_SAVEGAMES = DEVELOPMENT_DEBUGRESOURCES || DEVELOPMENT_DEBUGBUTTONS || DEVELOPMENT_FASTSPEED || !IS_RELEASE_VERSION;
public static final int DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION = 999;
public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION : 68;
private final AndorsTrailPreferences preferences = new AndorsTrailPreferences();
private WorldContext world = new WorldContext();
private ControllerContext controllers = new ControllerContext(this, world);
private WorldSetup setup = new WorldSetup(world, controllers, this);
public WorldContext getWorld() { return world; }
public WorldSetup getWorldSetup() { return setup; }
public AndorsTrailPreferences getPreferences() { return preferences; }
public ControllerContext getControllerContext() { return controllers; }
public static AndorsTrailApplication getApplicationFromActivity(Activity activity) {
return ((AndorsTrailApplication) activity.getApplication());
}
public static AndorsTrailApplication getApplicationFromActivityContext(Context context) {
return getApplicationFromActivity(getActivityFromActivityContext(context));
}
private static Activity getActivityFromActivityContext(Context context) {
return (Activity) context;
}
public boolean isInitialized() { return world.model != null; }
public void setWindowParameters(Activity activity) {
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
if (preferences.fullscreen) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
activity.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
//Get default locale at startup, as somehow it seems that changing the app's
//configured locale impacts the value returned by Locale.getDefault() nowadays.
private final Locale defaultLocale = Locale.getDefault();
private Pair<String, Locale> lastLocale = null;
public boolean setLocale(Activity context) {
Resources res = context.getResources();
Configuration conf = res.getConfiguration();
Locale targetLocale;
if (lastLocale != null && lastLocale.first == preferences.language) {
targetLocale = lastLocale.second;
} else {
targetLocale = localeForLanguageTag(preferences.language);
lastLocale = new Pair<String, Locale>(preferences.language, targetLocale);
}
if (targetLocale.equals(conf.locale)) {
return false;
}
conf.locale = targetLocale;
res.updateConfiguration(conf, res.getDisplayMetrics());
this.getResources().updateConfiguration(conf, res.getDisplayMetrics());
return true;
}
// Supports language or language_COUNTRY in short form e.g. "en" or "en_US"
private Locale localeForLanguageTag(String languageTag) {
Locale locale = null;
if (languageTag != null && !languageTag.equalsIgnoreCase("default")) {
final int pos = languageTag.indexOf('-');
if (pos == -1) {
locale = new Locale(languageTag);
}
else locale = new Locale(languageTag.substring(0, pos), languageTag.substring(pos+1));
}
if (locale == null) {
locale = defaultLocale;
}
return locale;
}
/**
* Logging to text file system as found on https://stackoverflow.com/questions/19565685/saving-logcat-to-a-text-file-in-android-device
*/
public void onCreate() {
super.onCreate();
if ( DEVELOPMENT_DEBUGMESSAGES && isExternalStorageWritable() ) {
File appDirectory = AndroidStorage.getStorageDirectory(getApplicationContext(), Constants.FILENAME_SAVEGAME_DIRECTORY);
File logDirectory = new File( appDirectory, "log" );
File logFile = new File( logDirectory, "logcat" + System.currentTimeMillis() + ".txt" );
// create app folder
if ( !appDirectory.exists() ) {
appDirectory.mkdir();
}
// create log folder
if ( !logDirectory.exists() ) {
logDirectory.mkdir();
}
// clear the previous logcat and then write the new one to the file
try {
Process process = Runtime.getRuntime().exec("logcat -c");
process = Runtime.getRuntime().exec("logcat -f " + logFile+" *:W");
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if ( Environment.MEDIA_MOUNTED.equals( state ) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals( state ) ) {
return true;
}
return false;
}
public void discardWorld() {
world = new WorldContext();
controllers = new ControllerContext(this, world);
setup = new WorldSetup(world, controllers, getApplicationContext());
}
}

View File

@@ -1,106 +1,112 @@
package com.gpl.rpg.AndorsTrail;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public final class AndorsTrailPreferences {
public static final int DISPLAYLOOT_DIALOG_ALWAYS = 0;
public static final int DISPLAYLOOT_DIALOG_FOR_ITEMS = 3;
public static final int DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST = 4;
public static final int DISPLAYLOOT_TOAST = 1;
public static final int DISPLAYLOOT_TOAST_FOR_ITEMS = 5;
public static final int DISPLAYLOOT_NONE = 2;
public static final int MOVEMENTMETHOD_STRAIGHT = 0;
public static final int MOVEMENTMETHOD_DIRECTIONAL = 1;
public static final int MOVEMENTAGGRESSIVENESS_NORMAL = 0;
public static final int MOVEMENTAGGRESSIVENESS_AGGRESSIVE = 1;
public static final int MOVEMENTAGGRESSIVENESS_DEFENSIVE = 2;
public static final int DPAD_POSITION_DISABLED = 0;
public static final int DPAD_POSITION_LOWER_RIGHT = 1;
public static final int DPAD_POSITION_LOWER_LEFT = 2;
public static final int DPAD_POSITION_LOWER_CENTER = 3;
public static final int DPAD_POSITION_CENTER_LEFT = 4;
public static final int DPAD_POSITION_CENTER_RIGHT = 5;
public static final int DPAD_POSITION_UPPER_LEFT = 6;
public static final int DPAD_POSITION_UPPER_RIGHT = 7;
public static final int DPAD_POSITION_UPPER_CENTER = 8;
public static final int CONFIRM_OVERWRITE_SAVEGAME_ALWAYS = 0;
public static final int CONFIRM_OVERWRITE_SAVEGAME_WHEN_PLAYERNAME_DIFFERS = 1;
public static final int CONFIRM_OVERWRITE_SAVEGAME_NEVER = 2;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM = 0;
public static final int QUICKSLOTS_POSITION_VERTICAL_CENTER_LEFT = 1;
public static final int QUICKSLOTS_POSITION_VERTICAL_CENTER_RIGHT = 2;
public static final int QUICKSLOTS_POSITION_VERTICAL_BOTTOM_LEFT = 3;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_BOTTOM_LEFT = 4;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_BOTTOM_RIGHT = 5;
public static final int QUICKSLOTS_POSITION_VERTICAL_BOTTOM_RIGHT = 6;
public static final int ATTACKSPEED_DEFAULT_MILLISECONDS = 1000;
public boolean confirmRest = true;
public boolean confirmAttack = true;
public int displayLoot = DISPLAYLOOT_DIALOG_ALWAYS;
public boolean fullscreen = true;
public int attackspeed_milliseconds = 1000;
public int movementMethod = MOVEMENTMETHOD_STRAIGHT;
public int movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
public float scalingFactor = 1.0f;
public int dpadPosition;
public boolean dpadMinimizeable = true;
public boolean optimizedDrawing = false;
public boolean highQualityFilters = true;
public boolean enableUiAnimations = true;
public int displayOverwriteSavegame = CONFIRM_OVERWRITE_SAVEGAME_ALWAYS;
public int quickslotsPosition = QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM;
public boolean showQuickslotsWhenToolboxIsVisible = false;
public String language = "default";
public int selectedTheme = 0;
public void read(final Context androidContext) {
AndorsTrailPreferences dest = this;
try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(androidContext);
dest.confirmRest = prefs.getBoolean("confirm_rest", true);
dest.confirmAttack = prefs.getBoolean("confirm_attack", true);
dest.displayLoot = Integer.parseInt(prefs.getString("display_lootdialog", Integer.toString(DISPLAYLOOT_DIALOG_ALWAYS)));
dest.fullscreen = prefs.getBoolean("fullscreen", true);
dest.attackspeed_milliseconds = Integer.parseInt(prefs.getString("attackspeed", "1000"));
dest.movementMethod = Integer.parseInt(prefs.getString("movementmethod", Integer.toString(MOVEMENTMETHOD_STRAIGHT)));
dest.scalingFactor = Float.parseFloat(prefs.getString("scaling_factor", "1.0f"));
dest.dpadPosition = Integer.parseInt(prefs.getString("dpadposition", Integer.toString(DPAD_POSITION_DISABLED)));
dest.dpadMinimizeable = prefs.getBoolean("dpadMinimizeable", true);
dest.optimizedDrawing = prefs.getBoolean("optimized_drawing", false);
dest.highQualityFilters = prefs.getBoolean("high_quality_filters", true);
dest.enableUiAnimations = prefs.getBoolean("enableUiAnimations", true);
dest.displayOverwriteSavegame = Integer.parseInt(prefs.getString("display_overwrite_savegame", Integer.toString(CONFIRM_OVERWRITE_SAVEGAME_ALWAYS)));
dest.quickslotsPosition = Integer.parseInt(prefs.getString("quickslots_placement", Integer.toString(QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM)));
dest.showQuickslotsWhenToolboxIsVisible = prefs.getBoolean("showQuickslotsWhenToolboxIsVisible", false);
dest.language = prefs.getString("language", "default");
dest.selectedTheme = Integer.parseInt(prefs.getString("selectedTheme", Integer.toString(0)));
// This might be implemented as a skill in the future.
//dest.movementAggressiveness = Integer.parseInt(prefs.getString("movementaggressiveness", Integer.toString(MOVEMENTAGGRESSIVENESS_NORMAL)));
} catch (Exception e) {
dest.confirmRest = true;
dest.confirmAttack = true;
dest.displayLoot = DISPLAYLOOT_DIALOG_ALWAYS;
dest.fullscreen = true;
dest.attackspeed_milliseconds = 1000;
dest.movementMethod = MOVEMENTMETHOD_STRAIGHT;
dest.movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
dest.scalingFactor = 1.0f;
dest.dpadPosition = DPAD_POSITION_DISABLED;
dest.dpadMinimizeable = true;
dest.optimizedDrawing = false;
dest.highQualityFilters = true;
dest.enableUiAnimations = true;
dest.displayOverwriteSavegame = CONFIRM_OVERWRITE_SAVEGAME_ALWAYS;
dest.quickslotsPosition = QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM;
dest.showQuickslotsWhenToolboxIsVisible = false;
dest.language = "default";
dest.selectedTheme = 0;
}
}
}
package com.gpl.rpg.AndorsTrail;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
public final class AndorsTrailPreferences {
public static final int DISPLAYLOOT_DIALOG_ALWAYS = 0;
public static final int DISPLAYLOOT_DIALOG_FOR_ITEMS = 3;
public static final int DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST = 4;
public static final int DISPLAYLOOT_TOAST = 1;
public static final int DISPLAYLOOT_TOAST_FOR_ITEMS = 5;
public static final int DISPLAYLOOT_NONE = 2;
public static final int MOVEMENTMETHOD_STRAIGHT = 0;
public static final int MOVEMENTMETHOD_DIRECTIONAL = 1;
public static final int MOVEMENTAGGRESSIVENESS_NORMAL = 0;
public static final int MOVEMENTAGGRESSIVENESS_AGGRESSIVE = 1;
public static final int MOVEMENTAGGRESSIVENESS_DEFENSIVE = 2;
public static final int DPAD_POSITION_DISABLED = 0;
public static final int DPAD_POSITION_LOWER_RIGHT = 1;
public static final int DPAD_POSITION_LOWER_LEFT = 2;
public static final int DPAD_POSITION_LOWER_CENTER = 3;
public static final int DPAD_POSITION_CENTER_LEFT = 4;
public static final int DPAD_POSITION_CENTER_RIGHT = 5;
public static final int DPAD_POSITION_UPPER_LEFT = 6;
public static final int DPAD_POSITION_UPPER_RIGHT = 7;
public static final int DPAD_POSITION_UPPER_CENTER = 8;
public static final int DPAD_TRANSPARENCY_30_PERCENT = 0;
public static final int DPAD_TRANSPARENCY_40_PERCENT = 1;
public static final int DPAD_TRANSPARENCY_50_PERCENT = 2;
public static final int DPAD_TRANSPARENCY_60_PERCENT = 3;
public static final int DPAD_TRANSPARENCY_70_PERCENT = 4;
public static final int CONFIRM_OVERWRITE_SAVEGAME_ALWAYS = 0;
public static final int CONFIRM_OVERWRITE_SAVEGAME_WHEN_PLAYERNAME_DIFFERS = 1;
public static final int CONFIRM_OVERWRITE_SAVEGAME_NEVER = 2;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM = 0;
public static final int QUICKSLOTS_POSITION_VERTICAL_CENTER_LEFT = 1;
public static final int QUICKSLOTS_POSITION_VERTICAL_CENTER_RIGHT = 2;
public static final int QUICKSLOTS_POSITION_VERTICAL_BOTTOM_LEFT = 3;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_BOTTOM_LEFT = 4;
public static final int QUICKSLOTS_POSITION_HORIZONTAL_BOTTOM_RIGHT = 5;
public static final int QUICKSLOTS_POSITION_VERTICAL_BOTTOM_RIGHT = 6;
public static final int ATTACKSPEED_DEFAULT_MILLISECONDS = 1000;
public boolean confirmRest = true;
public boolean confirmAttack = true;
public int displayLoot = DISPLAYLOOT_DIALOG_ALWAYS;
public boolean fullscreen = true;
public int attackspeed_milliseconds = 1000;
public int movementMethod = MOVEMENTMETHOD_STRAIGHT;
public int movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
public float scalingFactor = 1.0f;
public int dpadPosition;
public int dpadTransparency;
public boolean dpadMinimizeable = true;
public boolean optimizedDrawing = false;
public boolean highQualityFilters = true;
public boolean enableUiAnimations = true;
public int displayOverwriteSavegame = CONFIRM_OVERWRITE_SAVEGAME_ALWAYS;
public int quickslotsPosition = QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM;
public boolean showQuickslotsWhenToolboxIsVisible = false;
public String language = "default";
public int selectedTheme = 0;
public void read(final Context androidContext) {
AndorsTrailPreferences dest = this;
try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(androidContext);
dest.confirmRest = prefs.getBoolean("confirm_rest", true);
dest.confirmAttack = prefs.getBoolean("confirm_attack", true);
dest.displayLoot = Integer.parseInt(prefs.getString("display_lootdialog", Integer.toString(DISPLAYLOOT_DIALOG_ALWAYS)));
dest.fullscreen = prefs.getBoolean("fullscreen", true);
dest.attackspeed_milliseconds = Integer.parseInt(prefs.getString("attackspeed", "1000"));
dest.movementMethod = Integer.parseInt(prefs.getString("movementmethod", Integer.toString(MOVEMENTMETHOD_STRAIGHT)));
dest.scalingFactor = Float.parseFloat(prefs.getString("scaling_factor", "1.0f"));
dest.dpadPosition = Integer.parseInt(prefs.getString("dpadposition", Integer.toString(DPAD_POSITION_DISABLED)));
dest.dpadTransparency = Integer.parseInt(prefs.getString("dpadtransparency", Integer.toString(DPAD_TRANSPARENCY_50_PERCENT)));
dest.dpadMinimizeable = prefs.getBoolean("dpadMinimizeable", true);
dest.optimizedDrawing = prefs.getBoolean("optimized_drawing", false);
dest.highQualityFilters = prefs.getBoolean("high_quality_filters", true);
dest.enableUiAnimations = prefs.getBoolean("enableUiAnimations", true);
dest.displayOverwriteSavegame = Integer.parseInt(prefs.getString("display_overwrite_savegame", Integer.toString(CONFIRM_OVERWRITE_SAVEGAME_ALWAYS)));
dest.quickslotsPosition = Integer.parseInt(prefs.getString("quickslots_placement", Integer.toString(QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM)));
dest.showQuickslotsWhenToolboxIsVisible = prefs.getBoolean("showQuickslotsWhenToolboxIsVisible", false);
dest.language = prefs.getString("language", "default");
dest.selectedTheme = Integer.parseInt(prefs.getString("selectedTheme", Integer.toString(0)));
// This might be implemented as a skill in the future.
//dest.movementAggressiveness = Integer.parseInt(prefs.getString("movementaggressiveness", Integer.toString(MOVEMENTAGGRESSIVENESS_NORMAL)));
} catch (Exception e) {
dest.confirmRest = true;
dest.confirmAttack = true;
dest.displayLoot = DISPLAYLOOT_DIALOG_ALWAYS;
dest.fullscreen = true;
dest.attackspeed_milliseconds = 1000;
dest.movementMethod = MOVEMENTMETHOD_STRAIGHT;
dest.movementAggressiveness = MOVEMENTAGGRESSIVENESS_NORMAL;
dest.scalingFactor = 1.0f;
dest.dpadPosition = DPAD_POSITION_DISABLED;
dest.dpadTransparency = DPAD_TRANSPARENCY_50_PERCENT;
dest.dpadMinimizeable = true;
dest.optimizedDrawing = false;
dest.highQualityFilters = true;
dest.enableUiAnimations = true;
dest.displayOverwriteSavegame = CONFIRM_OVERWRITE_SAVEGAME_ALWAYS;
dest.quickslotsPosition = QUICKSLOTS_POSITION_HORIZONTAL_CENTER_BOTTOM;
dest.showQuickslotsWhenToolboxIsVisible = false;
dest.language = "default";
dest.selectedTheme = 0;
}
}
}

View File

@@ -1,475 +1,476 @@
package com.gpl.rpg.AndorsTrail;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import android.*;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.activity.ActorConditionInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.BulkSelectionInterface;
import com.gpl.rpg.AndorsTrail.activity.ConversationActivity;
import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.LevelUpActivity;
import com.gpl.rpg.AndorsTrail.activity.LoadSaveActivity;
import com.gpl.rpg.AndorsTrail.activity.MainActivity;
import com.gpl.rpg.AndorsTrail.activity.MonsterEncounterActivity;
import com.gpl.rpg.AndorsTrail.activity.MonsterInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.SkillInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
public final class Dialogs {
private static void showDialogAndPause(Dialog d, final ControllerContext context) {
showDialogAndPause(d, context, null);
}
private static void showDialogAndPause(Dialog d, final ControllerContext context, final OnDismissListener onDismiss) {
context.gameRoundController.pause();
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
if (onDismiss != null) onDismiss.onDismiss(arg0);
context.gameRoundController.resume();
}
});
CustomDialogFactory.show(d);
}
public static void showKeyArea(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null);
}
public static void showMapSign(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null);
}
public static void showMapScriptMessage(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null, false);
}
public static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc) {
showConversation(currentActivity, context, phraseID, npc, true);
}
private static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc, boolean applyScriptEffectsForFirstPhrase) {
context.gameRoundController.pause();
Intent intent = new Intent(currentActivity, ConversationActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/conversation/" + phraseID));
intent.putExtra("applyScriptEffectsForFirstPhrase", applyScriptEffectsForFirstPhrase);
addMonsterIdentifiers(intent, npc);
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_CONVERSATION);
}
public static void addMonsterIdentifiers(Intent intent, Monster monster) {
if (monster == null) return;
intent.putExtra("x", monster.position.x);
intent.putExtra("y", monster.position.y);
}
public static void addMonsterIdentifiers(Bundle bundle, Monster monster) {
if (monster == null) return;
bundle.putInt("x", monster.position.x);
bundle.putInt("y", monster.position.y);
}
public static Monster getMonsterFromIntent(Intent intent, final WorldContext world) {
return getMonsterFromBundle(intent.getExtras(), world);
}
public static Monster getMonsterFromBundle(Bundle params, final WorldContext world) {
if (params == null) return null;
if (!params.containsKey("x")) return null;
int x = params.getInt("x");
int y = params.getInt("y");
return world.model.currentMaps.map.getMonsterAt(x, y);
}
public static void showMonsterEncounter(final MainActivity currentActivity, final ControllerContext context, final Monster monster) {
context.gameRoundController.pause();
Intent intent = new Intent(currentActivity, MonsterEncounterActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterencounter"));
addMonsterIdentifiers(intent, monster);
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_MONSTERENCOUNTER);
}
public static void showMonsterInfo(final Context context, final Monster monster) {
Intent intent = new Intent(context, MonsterInfoActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterinfo"));
addMonsterIdentifiers(intent, monster);
context.startActivity(intent);
}
public static String getGroundLootFoundMessage(final Context ctx, final Loot loot) {
StringBuilder sb = new StringBuilder(60);
if (!loot.items.isEmpty()) {
sb.append(ctx.getString(R.string.dialog_groundloot_message));
}
appendGoldPickedUpMessage(ctx, loot, sb);
return sb.toString();
}
public static String getGroundLootPickedUpMessage(final Context ctx, final Loot loot) {
StringBuilder sb = new StringBuilder(60);
appendLootPickedUpMessage(ctx, loot, sb);
return sb.toString();
}
public static String getMonsterLootFoundMessage(final Context ctx, final Loot combinedLoot, final int exp) {
StringBuilder sb = new StringBuilder(60);
appendMonsterEncounterSurvivedMessage(ctx, sb, exp);
appendGoldPickedUpMessage(ctx, combinedLoot, sb);
return sb.toString();
}
public static String getMonsterLootPickedUpMessage(final Context ctx, final Loot combinedLoot, final int exp) {
StringBuilder sb = new StringBuilder(60);
appendMonsterEncounterSurvivedMessage(ctx, sb, exp);
appendLootPickedUpMessage(ctx, combinedLoot, sb);
return sb.toString();
}
private static void appendMonsterEncounterSurvivedMessage(final Context ctx, final StringBuilder sb, final int exp) {
sb.append(ctx.getString(R.string.dialog_monsterloot_message));
if (exp > 0) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_monsterloot_gainedexp, exp));
}
}
private static void appendGoldPickedUpMessage(final Context ctx, final Loot loot, final StringBuilder sb) {
if (loot.gold > 0) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_foundgold, loot.gold));
}
}
private static void appendLootPickedUpMessage(final Context ctx, final Loot loot, final StringBuilder sb) {
appendGoldPickedUpMessage(ctx, loot, sb);
int numItems = loot.items.countItems();
if (numItems == 1) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_pickedupitem));
} else if (numItems > 1){
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_pickedupitems, numItems));
}
}
public static void showMonsterLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Collection<Loot> lootBags, final Loot combinedLoot, final String msg) {
// CombatController will do killedMonsterBags.clear() after this method has been called,
// so we need to keep the list of objects. Therefore, we create a shallow copy of the list of bags.
ArrayList<Loot> bags = new ArrayList<Loot>(lootBags);
showLoot(mainActivity, controllers, world, combinedLoot, bags, R.string.dialog_monsterloot_title, msg);
}
public static void showGroundLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Loot loot, final String msg) {
showLoot(mainActivity, controllers, world, loot, Collections.singletonList(loot), R.string.dialog_groundloot_title, msg);
}
private static void showLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Loot combinedLoot, final Iterable<Loot> lootBags, final int title, final String msg) {
final ListView itemList = new ListView(mainActivity);
itemList.setBackgroundResource(android.R.color.transparent);
itemList.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, ListView.LayoutParams.WRAP_CONTENT));
// itemList.setPadding(20, 0, 20, 20);
itemList.setAdapter(new ItemContainerAdapter(mainActivity, world.tileManager, combinedLoot.items, world.model.player));
final Dialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(title),
mainActivity.getResources().getDrawable(R.drawable.ui_icon_equipment),
msg,
combinedLoot.items.isEmpty() ? null : itemList,
true);
itemList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
final String itemTypeID = ((ItemContainerAdapter) parent.getAdapter()).getItem(position).itemType.id;
boolean removeFromCombinedLoot = true;
for (Loot l : lootBags) {
if (l == combinedLoot) removeFromCombinedLoot = false;
if (l.items.removeItem(itemTypeID)) {
controllers.itemController.removeLootBagIfEmpty(l);
break;
}
}
if (removeFromCombinedLoot) {
combinedLoot.items.removeItem(itemTypeID);
}
if (((ItemContainerAdapter) parent.getAdapter()).isEmpty()) {
ViewGroup vg = (ViewGroup) d.findViewById(R.id.dialog_content_container);
vg.setVisibility(View.GONE);
}
ItemType type = world.itemTypes.getItemType(itemTypeID);
world.model.player.inventory.addItem(type);
((ItemContainerAdapter) itemList.getAdapter()).notifyDataSetChanged();
}
});
if (!itemList.getAdapter().isEmpty()) {
CustomDialogFactory.addButton(d, R.string.dialog_loot_pickall, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllers.itemController.pickupAll(lootBags);
}
});
}
CustomDialogFactory.addDismissButton(d, R.string.dialog_close);
showDialogAndPause(d, controllers, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
controllers.itemController.removeLootBagIfEmpty(lootBags);
}
});
}
public static void showHeroDied(final MainActivity mainActivity, final ControllerContext controllers) {
final Dialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(R.string.dialog_game_over_title),
mainActivity.getResources().getDrawable(R.drawable.ui_icon_combat),
mainActivity.getResources().getString(R.string.dialog_game_over_text),
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
showDialogAndPause(d, controllers, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
mainActivity.finish();
}
});
}
public static Intent getIntentForItemInfo(final Context ctx, String itemTypeID, ItemInfoActivity.ItemInfoAction actionType, String buttonText, boolean buttonEnabled, Inventory.WearSlot inventorySlot) {
Intent intent = new Intent(ctx, ItemInfoActivity.class);
intent.putExtra("buttonText", buttonText);
intent.putExtra("buttonEnabled", buttonEnabled);
intent.putExtra("moreActions", (actionType == ItemInfoActivity.ItemInfoAction.equip || actionType == ItemInfoActivity.ItemInfoAction.use || actionType == ItemInfoActivity.ItemInfoAction.none));
intent.putExtra("itemTypeID", itemTypeID);
intent.putExtra("actionType", actionType.name());
if (inventorySlot != null) intent.putExtra("inventorySlot", inventorySlot.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/iteminfo/" + itemTypeID));
return intent;
}
public static Intent getIntentForLevelUp(final Context ctx) {
Intent intent = new Intent(ctx, LevelUpActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/levelup"));
return intent;
}
public static void showConfirmRest(final Activity currentActivity, final ControllerContext controllerContext, final MapObject area) {
final Dialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_rest_title),
null,
currentActivity.getResources().getString(R.string.dialog_rest_confirm_message),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllerContext.mapController.rest(area);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.no);
showDialogAndPause(d, controllerContext);
}
public static void showRested(final Activity currentActivity, final ControllerContext controllerContext) {
// Dialog d = new AlertDialog.Builder(new ContextThemeWrapper(currentActivity, R.style.AndorsTrailStyle))
// .setTitle(R.string.dialog_rest_title)
// .setMessage(R.string.dialog_rest_message)
// .setNeutralButton(android.R.string.ok, null)
// .create();
final Dialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_rest_title),
null,
currentActivity.getResources().getString(R.string.dialog_rest_message),
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
showDialogAndPause(d, controllerContext);
}
public static void showNewVersion(final Activity currentActivity, final OnDismissListener onDismiss) {
// new AlertDialog.Builder(new ContextThemeWrapper(currentActivity, R.style.AndorsTrailStyle))
// .setTitle(R.string.dialog_newversion_title)
// .setMessage(R.string.dialog_newversion_message)
// .setNeutralButton(android.R.string.ok, null)
// .show();
String text = currentActivity.getResources().getString(R.string.dialog_newversion_message);
if (!hasPermissions(currentActivity)) {
text += currentActivity.getResources().getString(R.string.dialog_newversion_permission_information);
}
final Dialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_newversion_title),
null,
text,
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
if (onDismiss != null) onDismiss.onDismiss(arg0);
}
});
CustomDialogFactory.show(d);
}
@TargetApi(23)
private static boolean hasPermissions(final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (activity.getApplicationContext().checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| activity.getApplicationContext().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
public static boolean showSave(final Activity mainActivity, final ControllerContext controllerContext, final WorldContext world) {
if (world.model.uiSelections.isInCombat) {
Toast.makeText(mainActivity, R.string.menu_save_saving_not_allowed_in_combat, Toast.LENGTH_SHORT).show();
return false;
}
if (!world.model.statistics.hasUnlimitedSaves()) {
final Dialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(R.string.menu_save_switch_character_title),
null,
mainActivity.getResources().getString(R.string.menu_save_switch_character),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllerContext.gameRoundController.pause();
Intent intent = new Intent(mainActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/save"));
mainActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_SAVEGAME);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
return false;
} else {
controllerContext.gameRoundController.pause();
Intent intent = new Intent(mainActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/save"));
mainActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_SAVEGAME);
return true;
}
}
public static void showLoad(final Activity currentActivity) {
Intent intent = new Intent(currentActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/load"));
currentActivity.startActivityForResult(intent, StartScreenActivity_MainMenu.INTENTREQUEST_LOADGAME);
}
public static void showLoad(final Fragment currentFragment) {
Intent intent = new Intent(currentFragment.getActivity(), LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/load"));
currentFragment.startActivityForResult(intent, StartScreenActivity_MainMenu.INTENTREQUEST_LOADGAME);
}
public static void showActorConditionInfo(final Context context, ActorConditionType conditionType) {
Intent intent = new Intent(context, ActorConditionInfoActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/actorconditioninfo/" + conditionType.conditionTypeID));
context.startActivity(intent);
}
public static Intent getIntentForBulkBuyingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.buy);
}
public static Intent getIntentForBulkSellingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.sell);
}
public static Intent getIntentForBulkDroppingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.drop);
}
private static Intent getIntentForBulkSelectionInterface(final Context ctx, String itemTypeID, int totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType interfaceType) {
Intent intent = new Intent(ctx, BulkSelectionInterface.class);
intent.putExtra("itemTypeID", itemTypeID);
intent.putExtra("totalAvailableAmount", totalAvailableAmount);
intent.putExtra("interfaceType", interfaceType.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/bulkselection/" + itemTypeID));
return intent;
}
public static Intent getIntentForSkillInfo(final Context ctx, SkillCollection.SkillID skillID) {
Intent intent = new Intent(ctx, SkillInfoActivity.class);
intent.putExtra("skillID", skillID.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/showskillinfo/" + skillID));
return intent;
}
public static void showCombatLog(final Context context, final ControllerContext controllerContext, final WorldContext world) {
String[] combatLogMessages = world.model.combatLog.getAllMessages();
View view = null;
ListView itemList = null;
itemList = new ListView(context);
itemList.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, ListView.LayoutParams.WRAP_CONTENT));
itemList.setStackFromBottom(true);
itemList.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
itemList.setChoiceMode(ListView.CHOICE_MODE_NONE);
itemList.setBackgroundColor(ThemeHelper.getThemeColor(context, R.attr.ui_theme_stdframe_bg_color));
if (combatLogMessages.length <= 0) {
combatLogMessages = new String[] {context.getResources().getString(R.string.combat_log_noentries)};
}
itemList.setAdapter(new ArrayAdapter<String>(context, R.layout.combatlog_row, android.R.id.text1, combatLogMessages));
view = itemList;
final Dialog d = CustomDialogFactory.createDialog(context,
context.getResources().getString(R.string.combat_log_title),
context.getResources().getDrawable(R.drawable.ui_icon_combat),
null,
view,
true);
CustomDialogFactory.addDismissButton(d, R.string.dialog_close);
showDialogAndPause(d, controllerContext);
}
}
package com.gpl.rpg.AndorsTrail;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.activity.ActorConditionInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.BulkSelectionInterface;
import com.gpl.rpg.AndorsTrail.activity.ConversationActivity;
import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.LevelUpActivity;
import com.gpl.rpg.AndorsTrail.activity.LoadSaveActivity;
import com.gpl.rpg.AndorsTrail.activity.MainActivity;
import com.gpl.rpg.AndorsTrail.activity.MonsterEncounterActivity;
import com.gpl.rpg.AndorsTrail.activity.MonsterInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.SkillInfoActivity;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
public final class Dialogs {
private static void showDialogAndPause(CustomDialog d, final ControllerContext context) {
showDialogAndPause(d, context, null);
}
private static void showDialogAndPause(CustomDialog d, final ControllerContext context, final OnDismissListener onDismiss) {
context.gameRoundController.pause();
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
if (onDismiss != null) onDismiss.onDismiss(arg0);
context.gameRoundController.resume();
}
});
CustomDialogFactory.show(d);
}
public static void showKeyArea(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null);
}
public static void showMapSign(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null);
}
public static void showMapScriptMessage(final MainActivity currentActivity, final ControllerContext context, String phraseID) {
showConversation(currentActivity, context, phraseID, null, false);
}
public static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc) {
showConversation(currentActivity, context, phraseID, npc, true);
}
private static void showConversation(final MainActivity currentActivity, final ControllerContext context, final String phraseID, final Monster npc, boolean applyScriptEffectsForFirstPhrase) {
context.gameRoundController.pause();
Intent intent = new Intent(currentActivity, ConversationActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/conversation/" + phraseID));
intent.putExtra("applyScriptEffectsForFirstPhrase", applyScriptEffectsForFirstPhrase);
addMonsterIdentifiers(intent, npc);
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_CONVERSATION);
}
public static void addMonsterIdentifiers(Intent intent, Monster monster) {
if (monster == null) return;
intent.putExtra("x", monster.position.x);
intent.putExtra("y", monster.position.y);
}
public static void addMonsterIdentifiers(Bundle bundle, Monster monster) {
if (monster == null) return;
bundle.putInt("x", monster.position.x);
bundle.putInt("y", monster.position.y);
}
public static Monster getMonsterFromIntent(Intent intent, final WorldContext world) {
return getMonsterFromBundle(intent.getExtras(), world);
}
public static Monster getMonsterFromBundle(Bundle params, final WorldContext world) {
if (params == null) return null;
if (!params.containsKey("x")) return null;
int x = params.getInt("x");
int y = params.getInt("y");
return world.model.currentMaps.map.getMonsterAt(x, y);
}
public static void showMonsterEncounter(final MainActivity currentActivity, final ControllerContext context, final Monster monster) {
context.gameRoundController.pause();
Intent intent = new Intent(currentActivity, MonsterEncounterActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterencounter"));
addMonsterIdentifiers(intent, monster);
currentActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_MONSTERENCOUNTER);
}
public static void showMonsterInfo(final Context context, final Monster monster) {
Intent intent = new Intent(context, MonsterInfoActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/monsterinfo"));
addMonsterIdentifiers(intent, monster);
context.startActivity(intent);
}
public static String getGroundLootFoundMessage(final Context ctx, final Loot loot) {
StringBuilder sb = new StringBuilder(60);
if (!loot.items.isEmpty()) {
sb.append(ctx.getString(R.string.dialog_groundloot_message));
}
appendGoldPickedUpMessage(ctx, loot, sb);
return sb.toString();
}
public static String getGroundLootPickedUpMessage(final Context ctx, final Loot loot) {
StringBuilder sb = new StringBuilder(60);
appendLootPickedUpMessage(ctx, loot, sb);
return sb.toString();
}
public static String getMonsterLootFoundMessage(final Context ctx, final Loot combinedLoot, final int exp) {
StringBuilder sb = new StringBuilder(60);
appendMonsterEncounterSurvivedMessage(ctx, sb, exp);
appendGoldPickedUpMessage(ctx, combinedLoot, sb);
return sb.toString();
}
public static String getMonsterLootPickedUpMessage(final Context ctx, final Loot combinedLoot, final int exp) {
StringBuilder sb = new StringBuilder(60);
appendMonsterEncounterSurvivedMessage(ctx, sb, exp);
appendLootPickedUpMessage(ctx, combinedLoot, sb);
return sb.toString();
}
private static void appendMonsterEncounterSurvivedMessage(final Context ctx, final StringBuilder sb, final int exp) {
sb.append(ctx.getString(R.string.dialog_monsterloot_message));
if (exp > 0) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_monsterloot_gainedexp, exp));
}
}
private static void appendGoldPickedUpMessage(final Context ctx, final Loot loot, final StringBuilder sb) {
if (loot.gold > 0) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_foundgold, loot.gold));
}
}
private static void appendLootPickedUpMessage(final Context ctx, final Loot loot, final StringBuilder sb) {
appendGoldPickedUpMessage(ctx, loot, sb);
int numItems = loot.items.countItems();
if (numItems == 1) {
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_pickedupitem));
} else if (numItems > 1){
sb.append(' ');
sb.append(ctx.getString(R.string.dialog_loot_pickedupitems, numItems));
}
}
public static void showMonsterLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Collection<Loot> lootBags, final Loot combinedLoot, final String msg) {
// CombatController will do killedMonsterBags.clear() after this method has been called,
// so we need to keep the list of objects. Therefore, we create a shallow copy of the list of bags.
ArrayList<Loot> bags = new ArrayList<Loot>(lootBags);
showLoot(mainActivity, controllers, world, combinedLoot, bags, R.string.dialog_monsterloot_title, msg);
}
public static void showGroundLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Loot loot, final String msg) {
showLoot(mainActivity, controllers, world, loot, Collections.singletonList(loot), R.string.dialog_groundloot_title, msg);
}
private static void showLoot(final MainActivity mainActivity, final ControllerContext controllers, final WorldContext world, final Loot combinedLoot, final Iterable<Loot> lootBags, final int title, final String msg) {
final ListView itemList = new ListView(mainActivity);
itemList.setBackgroundResource(android.R.color.transparent);
itemList.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, ListView.LayoutParams.WRAP_CONTENT));
// itemList.setPadding(20, 0, 20, 20);
itemList.setAdapter(new ItemContainerAdapter(mainActivity, world.tileManager, combinedLoot.items, world.model.player));
final CustomDialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(title),
mainActivity.getResources().getDrawable(R.drawable.ui_icon_equipment),
msg,
combinedLoot.items.isEmpty() ? null : itemList,
true,
false);
itemList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
final String itemTypeID = ((ItemContainerAdapter) parent.getAdapter()).getItem(position).itemType.id;
boolean removeFromCombinedLoot = true;
for (Loot l : lootBags) {
if (l == combinedLoot) removeFromCombinedLoot = false;
if (l.items.removeItem(itemTypeID)) {
controllers.itemController.removeLootBagIfEmpty(l);
break;
}
}
if (removeFromCombinedLoot) {
combinedLoot.items.removeItem(itemTypeID);
}
if (((ItemContainerAdapter) parent.getAdapter()).isEmpty()) {
ViewGroup vg = (ViewGroup) d.findViewById(R.id.dialog_content_container);
vg.setVisibility(View.GONE);
}
ItemType type = world.itemTypes.getItemType(itemTypeID);
world.model.player.inventory.addItem(type);
((ItemContainerAdapter) itemList.getAdapter()).notifyDataSetChanged();
}
});
if (!itemList.getAdapter().isEmpty()) {
CustomDialogFactory.addButton(d, R.string.dialog_loot_pickall, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllers.itemController.pickupAll(lootBags);
}
});
}
CustomDialogFactory.addDismissButton(d, R.string.dialog_close);
showDialogAndPause(d, controllers, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
controllers.itemController.removeLootBagIfEmpty(lootBags);
}
});
}
public static void showHeroDied(final MainActivity mainActivity, final ControllerContext controllers) {
final CustomDialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(R.string.dialog_game_over_title),
mainActivity.getResources().getDrawable(R.drawable.ui_icon_combat),
mainActivity.getResources().getString(R.string.dialog_game_over_text),
null,
true,
false);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
showDialogAndPause(d, controllers, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
mainActivity.finish();
}
});
}
public static Intent getIntentForItemInfo(final Context ctx, String itemTypeID, ItemInfoActivity.ItemInfoAction actionType, String buttonText, boolean buttonEnabled, Inventory.WearSlot inventorySlot) {
Intent intent = new Intent(ctx, ItemInfoActivity.class);
intent.putExtra("buttonText", buttonText);
intent.putExtra("buttonEnabled", buttonEnabled);
intent.putExtra("moreActions", (actionType == ItemInfoActivity.ItemInfoAction.equip || actionType == ItemInfoActivity.ItemInfoAction.use || actionType == ItemInfoActivity.ItemInfoAction.none));
intent.putExtra("itemTypeID", itemTypeID);
intent.putExtra("actionType", actionType.name());
if (inventorySlot != null) intent.putExtra("inventorySlot", inventorySlot.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/iteminfo/" + itemTypeID));
return intent;
}
public static Intent getIntentForLevelUp(final Context ctx) {
Intent intent = new Intent(ctx, LevelUpActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/levelup"));
return intent;
}
public static void showConfirmRest(final Activity currentActivity, final ControllerContext controllerContext, final MapObject area) {
final CustomDialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_rest_title),
null,
currentActivity.getResources().getString(R.string.dialog_rest_confirm_message),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllerContext.mapController.rest(area);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.no);
showDialogAndPause(d, controllerContext);
}
public static void showRested(final Activity currentActivity, final ControllerContext controllerContext) {
// Dialog d = new AlertDialog.Builder(new ContextThemeWrapper(currentActivity, R.style.AndorsTrailStyle))
// .setTitle(R.string.dialog_rest_title)
// .setMessage(R.string.dialog_rest_message)
// .setNeutralButton(android.R.string.ok, null)
// .create();
final CustomDialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_rest_title),
null,
currentActivity.getResources().getString(R.string.dialog_rest_message),
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
showDialogAndPause(d, controllerContext);
}
public static void showNewVersion(final Activity currentActivity, final OnDismissListener onDismiss) {
// new AlertDialog.Builder(new ContextThemeWrapper(currentActivity, R.style.AndorsTrailStyle))
// .setTitle(R.string.dialog_newversion_title)
// .setMessage(R.string.dialog_newversion_message)
// .setNeutralButton(android.R.string.ok, null)
// .show();
String text = currentActivity.getResources().getString(R.string.dialog_newversion_message);
if (!hasPermissions(currentActivity) && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
text += currentActivity.getResources().getString(R.string.dialog_newversion_permission_information);
}
final CustomDialog d = CustomDialogFactory.createDialog(currentActivity,
currentActivity.getResources().getString(R.string.dialog_newversion_title),
null,
text,
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
if (onDismiss != null) onDismiss.onDismiss(arg0);
}
});
CustomDialogFactory.show(d);
}
@TargetApi(23)
private static boolean hasPermissions(final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (activity.getApplicationContext().checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
|| activity.getApplicationContext().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
public static boolean showSave(final Activity mainActivity, final ControllerContext controllerContext, final WorldContext world) {
if (world.model.uiSelections.isInCombat) {
Toast.makeText(mainActivity, R.string.menu_save_saving_not_allowed_in_combat, Toast.LENGTH_SHORT).show();
return false;
}
if (!world.model.statistics.hasUnlimitedSaves()) {
final CustomDialog d = CustomDialogFactory.createDialog(mainActivity,
mainActivity.getResources().getString(R.string.menu_save_switch_character_title),
null,
mainActivity.getResources().getString(R.string.menu_save_switch_character),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
controllerContext.gameRoundController.pause();
Intent intent = new Intent(mainActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/save"));
mainActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_SAVEGAME);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
return false;
} else {
controllerContext.gameRoundController.pause();
Intent intent = new Intent(mainActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/save"));
mainActivity.startActivityForResult(intent, MainActivity.INTENTREQUEST_SAVEGAME);
return true;
}
}
public static void showLoad(final Activity currentActivity) {
Intent intent = new Intent(currentActivity, LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/load"));
currentActivity.startActivityForResult(intent, StartScreenActivity_MainMenu.INTENTREQUEST_LOADGAME);
}
public static void showLoad(final Fragment currentFragment) {
Intent intent = new Intent(currentFragment.getActivity(), LoadSaveActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/load"));
currentFragment.startActivityForResult(intent, StartScreenActivity_MainMenu.INTENTREQUEST_LOADGAME);
}
public static void showActorConditionInfo(final Context context, ActorConditionType conditionType) {
Intent intent = new Intent(context, ActorConditionInfoActivity.class);
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/actorconditioninfo/" + conditionType.conditionTypeID));
context.startActivity(intent);
}
public static Intent getIntentForBulkBuyingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.buy);
}
public static Intent getIntentForBulkSellingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.sell);
}
public static Intent getIntentForBulkDroppingInterface(final Context ctx, String itemTypeID, int totalAvailableAmount) {
return getIntentForBulkSelectionInterface(ctx, itemTypeID, totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType.drop);
}
private static Intent getIntentForBulkSelectionInterface(final Context ctx, String itemTypeID, int totalAvailableAmount, BulkSelectionInterface.BulkInterfaceType interfaceType) {
Intent intent = new Intent(ctx, BulkSelectionInterface.class);
intent.putExtra("itemTypeID", itemTypeID);
intent.putExtra("totalAvailableAmount", totalAvailableAmount);
intent.putExtra("interfaceType", interfaceType.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/bulkselection/" + itemTypeID));
return intent;
}
public static Intent getIntentForSkillInfo(final Context ctx, SkillCollection.SkillID skillID) {
Intent intent = new Intent(ctx, SkillInfoActivity.class);
intent.putExtra("skillID", skillID.name());
intent.setData(Uri.parse("content://com.gpl.rpg.AndorsTrail/showskillinfo/" + skillID));
return intent;
}
public static void showCombatLog(final Context context, final ControllerContext controllerContext, final WorldContext world) {
String[] combatLogMessages = world.model.combatLog.getAllMessages();
View view = null;
ListView itemList = null;
itemList = new ListView(context);
itemList.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, ListView.LayoutParams.WRAP_CONTENT));
itemList.setStackFromBottom(true);
itemList.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
itemList.setChoiceMode(ListView.CHOICE_MODE_NONE);
itemList.setBackgroundColor(ThemeHelper.getThemeColor(context, R.attr.ui_theme_stdframe_bg_color));
if (combatLogMessages.length <= 0) {
combatLogMessages = new String[] {context.getResources().getString(R.string.combat_log_noentries)};
}
itemList.setAdapter(new ArrayAdapter<String>(context, R.layout.combatlog_row, android.R.id.text1, combatLogMessages));
view = itemList;
final CustomDialog d = CustomDialogFactory.createDialog(context,
context.getResources().getString(R.string.combat_log_title),
context.getResources().getDrawable(R.drawable.ui_icon_combat),
null,
view,
true);
CustomDialogFactory.addDismissButton(d, R.string.dialog_close);
showDialogAndPause(d, controllerContext);
}
}

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;

View File

@@ -1,12 +1,9 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
public abstract class AndorsTrailBaseFragmentActivity extends FragmentActivity {
@Override

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.content.res.Resources;
@@ -24,6 +23,7 @@ import com.gpl.rpg.AndorsTrail.controller.ItemController;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
/**
* @author ejwessel
@@ -207,7 +207,7 @@ public final class BulkSelectionInterface extends AndorsTrailBaseActivity implem
// })
// .setNegativeButton(android.R.string.no, null)
// .show();
final Dialog d = CustomDialogFactory.createDialog(v.getContext(),
final CustomDialog d = CustomDialogFactory.createDialog(v.getContext(),
v.getContext().getResources().getString(R.string.bulkselection_sell_confirmation_title),
v.getContext().getResources().getDrawable(android.R.drawable.ic_dialog_info),
message,

View File

@@ -2,7 +2,6 @@ package com.gpl.rpg.AndorsTrail.activity;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;

View File

@@ -0,0 +1,341 @@
package com.gpl.rpg.AndorsTrail.activity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.view.MainView;
import android.content.Context;
import android.content.res.Resources;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
public final class DebugInterface {
private final ControllerContext controllerContext;
private final MainActivity mainActivity;
private final Resources res;
private final WorldContext world;
private DebugButton[] buttons;
private List<DebugButton> tpButtons = new ArrayList<DebugButton>();
private List<DebugButton> tpButtons2 = new ArrayList<DebugButton>();
public DebugInterface(ControllerContext controllers, WorldContext world, MainActivity mainActivity) {
this.controllerContext = controllers;
this.world = world;
this.res = mainActivity.getResources();
this.mainActivity = mainActivity;
}
public void addDebugButtons() {
if (!AndorsTrailApplication.DEVELOPMENT_DEBUGBUTTONS) return;
List<DebugButton> buttonList = new ArrayList<DebugButton>();
buttonList.addAll(Arrays.asList(new DebugButton[] {
new DebugButton("dbg", new OnClickListener() {
boolean hidden = false;
@Override
public void onClick(View arg0) {
hidden = !hidden;
for (int i = 1; i < buttons.length; i++) {
buttons[i].b.setVisibility(hidden ? View.GONE : View.VISIBLE);
}
for (DebugButton b : tpButtons) {
b.b.setVisibility(View.GONE);
}
for (DebugButton b : tpButtons2) {
b.b.setVisibility(View.GONE);
}
}
})
,new DebugButton("teleport", new OnClickListener() {
public void onClick(View arg0) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].b.setVisibility(View.GONE);
}
for (DebugButton tpButton : tpButtons) {
tpButton.b.setVisibility(View.VISIBLE);
}
}
})
,new DebugButton("dmg", new OnClickListener() {
@Override
public void onClick(View arg0) {
world.model.player.damagePotential.set(500, 500);
world.model.player.attackChance = 500;
world.model.player.attackCost = 1;
showToast(mainActivity, "DEBUG: damagePotential=500, chance=500%, cost=1", Toast.LENGTH_SHORT);
}
})
/*,new DebugButton("dmg=1", new OnClickListener() {
@Override
public void onClick(View arg0) {
world.model.player.damagePotential.set(1, 1);
showToast(mainActivity, "DEBUG: damagePotential=1", Toast.LENGTH_SHORT);
}
})*/
,new DebugButton("itm", new OnClickListener() {
@Override
public void onClick(View arg0) {
for (ItemType item : world.itemTypes.UNITTEST_getAllItemTypes().values()) {
world.model.player.inventory.addItem(item, 10);
}
world.model.player.inventory.gold += 50000;
showToast(mainActivity, "DEBUG: added items", Toast.LENGTH_SHORT);
}
})
,new DebugButton("xp", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.actorStatsController.addExperience(10000);
showToast(mainActivity, "DEBUG: given 10000 exp", Toast.LENGTH_SHORT);
}
})
,new DebugButton("rst", new OnClickListener() {
@Override
public void onClick(View arg0) {
for(PredefinedMap map : world.maps.getAllMaps()) {
map.resetTemporaryData();
}
showToast(mainActivity, "DEBUG: maps respawned", Toast.LENGTH_SHORT);
}
})
,new DebugButton("hp", new OnClickListener() {
@Override
public void onClick(View arg0) {
world.model.player.baseTraits.maxHP = 500;
world.model.player.health.max = world.model.player.baseTraits.maxHP;
controllerContext.actorStatsController.setActorMaxHealth(world.model.player);
world.model.player.conditions.clear();
showToast(mainActivity, "DEBUG: hp set to max", Toast.LENGTH_SHORT);
}
})
,new DebugButton("skl", new OnClickListener() {
@Override
public void onClick(View arg0) {
world.model.player.availableSkillIncreases += 10;
showToast(mainActivity, "DEBUG: 10 skill points", Toast.LENGTH_SHORT);
}
})
,new DebugButton("spd", new OnClickListener() {
boolean fast = Constants.MINIMUM_INPUT_INTERVAL == Constants.MINIMUM_INPUT_INTERVAL_FAST;
@Override
public void onClick(View arg0) {
fast = !fast;
if (fast) {
Constants.MINIMUM_INPUT_INTERVAL = Constants.MINIMUM_INPUT_INTERVAL_FAST;
} else {
Constants.MINIMUM_INPUT_INTERVAL = Constants.MINIMUM_INPUT_INTERVAL_STD;
}
MainView.SCROLL_DURATION = Constants.MINIMUM_INPUT_INTERVAL;
AndorsTrailApplication.getApplicationFromActivity(mainActivity).getControllerContext().movementController.resetMovementHandler();
}
})
,new DebugButton("map", new OnClickListener() {
@Override
public void onClick(View arg0) {
showToast(mainActivity, "DEBUG: map=" + world.model.currentMaps.map.name , Toast.LENGTH_SHORT);
}
})
}));
tpButtons.addAll(Arrays.asList(new DebugButton[] {
new DebugButton("teleport", new OnClickListener() {
@Override
public void onClick(View arg0) {
for (DebugButton tpButton : tpButtons2) {
tpButton.b.setVisibility(View.VISIBLE);
}
for (DebugButton tpButton : tpButtons) {
tpButton.b.setVisibility(View.GONE);
}
}
})
,new DebugButton("cg", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "crossglen", "hall", 0, 0);
}
})
,new DebugButton("vg", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "vilegard_s", "tavern", 0, 0);
}
})
,new DebugButton("cr", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "houseatcrossroads4", "down", 0, 0);
}
})
,new DebugButton("lf", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "loneford9", "south", 0, 0);
}
})
,new DebugButton("fh", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "fallhaven_ne", "clothes", 0, 0);
}
})
,new DebugButton("prm", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "blackwater_mountain29", "south", 0, 0);
}
})
,new DebugButton("bwm", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "blackwater_mountain43", "south", 0, 0);
}
})
,new DebugButton("rmg", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "remgard0", "east", 0, 0);
}
})
,new DebugButton("chr", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "waytolostmine2", "minerhouse4", 0, 0);
}
})
,new DebugButton("ldr", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "lodarhouse0", "lodarhouse", 0, 0);
}
})
,new DebugButton("sf", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "wild20", "south2", 0, 0);
}
})
,new DebugButton("gm", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "guynmart_wood_1", "farmhouse", 0, 0);
}
})
}));
buttonList.addAll(tpButtons);
tpButtons2.addAll(Arrays.asList(new DebugButton[] {
new DebugButton("teleport", new OnClickListener() {
@Override
public void onClick(View arg0) {
for (int i = 0; i < buttons.length; i++) {
buttons[i].b.setVisibility(View.VISIBLE);
}
for (DebugButton tpButton : tpButtons) {
tpButton.b.setVisibility(View.GONE);
}
for (DebugButton tpButton : tpButtons2) {
tpButton.b.setVisibility(View.GONE);
}
}
})
,new DebugButton("brv", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "brimhaven4", "south2", 0, 0);
}
})
,new DebugButton("aru", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "mountainlake5", "north", 0, 0);
}
})
,new DebugButton("ws", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "woodsettlement0", "east", 0, 0);
}
})
,new DebugButton("sul", new OnClickListener() {
@Override
public void onClick(View arg0) {
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "sullengard2", "south", 0, 0);
}
})
}));
buttonList.addAll(tpButtons2);
buttons = buttonList.toArray(new DebugButton[buttonList.size()]);
addDebugButtons(buttons);
for (DebugButton b : tpButtons) {
b.b.setVisibility(View.GONE);
}
for (DebugButton b : tpButtons2) {
b.b.setVisibility(View.GONE);
}
}
private void showToast(Context context, String msg, int duration) {
Toast.makeText(context, msg, duration).show();
}
private static class DebugButton {
public final String text;
public final OnClickListener listener;
public Button b = null;
public DebugButton(String text, OnClickListener listener) {
this.text = text;
this.listener = listener;
}
public void makeButton(Context c, int id) {
b = new Button(c);
b.setText(text);
b.setTextSize(10);//res.getDimension(R.dimen.actionbar_text));
b.setId(id);
b.setOnClickListener(listener);
}
}
private void addDebugButton(DebugButton button, int id, RelativeLayout layout) {
if (!AndorsTrailApplication.DEVELOPMENT_DEBUGBUTTONS) return;
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, res.getDimensionPixelSize(R.dimen.smalltext_buttonheight));
if (id == 1)
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
else
lp.addRule(RelativeLayout.RIGHT_OF, id - 1);
lp.addRule(RelativeLayout.ABOVE, R.id.main_statusview);
button.makeButton(mainActivity, id);
button.b.setLayoutParams(lp);
layout.addView(button.b);
}
private void addDebugButtons(DebugButton[] buttons) {
if (!AndorsTrailApplication.DEVELOPMENT_DEBUGBUTTONS) return;
if (buttons == null || buttons.length <= 0) return;
RelativeLayout layout = (RelativeLayout) mainActivity.findViewById(R.id.main_container);
int id = 1;
for (DebugButton b : buttons) {
addDebugButton(b, id, layout);
++id;
}
}
}

View File

@@ -1,168 +1,168 @@
package com.gpl.rpg.AndorsTrail.activity;
import java.io.File;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.WorldMapController;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.WorldMapSegmentMap;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
public final class DisplayWorldMapActivity extends AndorsTrailBaseActivity {
private WorldContext world;
private WebView displayworldmap_webview;
private String worldMapSegmentName;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (!app.isInitialized()) { finish(); return; }
this.world = app.getWorld();
app.setWindowParameters(this);
setContentView(R.layout.displayworldmap);
displayworldmap_webview = (WebView) findViewById(R.id.displayworldmap_webview);
displayworldmap_webview.setBackgroundColor(ThemeHelper.getThemeColor(this, R.attr.ui_theme_displayworldmap_bg_color));
displayworldmap_webview.getSettings().setBuiltInZoomControls(true);
displayworldmap_webview.getSettings().setUseWideViewPort(true);
displayworldmap_webview.setVerticalScrollBarEnabled(true);
displayworldmap_webview.setHorizontalScrollBarEnabled(true);
enableJavascript();
Button b = (Button) findViewById(R.id.displayworldmap_close);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DisplayWorldMapActivity.this.finish();
}
});
b = (Button) findViewById(R.id.displayworldmap_recenter);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
recenter();
}
});
worldMapSegmentName = getIntent().getStringExtra("worldMapSegmentName");
}
@SuppressLint("SetJavaScriptEnabled")
public void enableJavascript() {
displayworldmap_webview.getSettings().setJavaScriptEnabled(true);
}
@Override
public void onResume() {
super.onResume();
update();
}
WorldMapSegmentMap map;
Coord offsetWorldmapTo;
@SuppressLint("NewApi")
private void update() {
File worldmap = WorldMapController.getCombinedWorldMapFile(worldMapSegmentName);
if (!worldmap.exists()) {
Toast.makeText(this, getResources().getString(R.string.menu_button_worldmap_failed), Toast.LENGTH_LONG).show();
this.finish();
}
WorldMapSegment segment = world.maps.worldMapSegments.get(worldMapSegmentName);
map = segment.maps.get(world.model.currentMaps.map.name);
if (map == null) {
this.finish();
return;
}
offsetWorldmapTo = new Coord(999999, 999999);
for (WorldMapSegmentMap map : segment.maps.values()) {
PredefinedMap predefinedMap = world.maps.findPredefinedMap(map.mapName);
if (predefinedMap == null) continue;
if (!predefinedMap.visited) continue;
if (!WorldMapController.fileForMapExists(predefinedMap)) continue;
offsetWorldmapTo.x = Math.min(offsetWorldmapTo.x, map.worldPosition.x);
offsetWorldmapTo.y = Math.min(offsetWorldmapTo.y, map.worldPosition.y);
}
String url = "file://" + worldmap.getAbsolutePath() + '?'
+ (world.model.player.position.x + map.worldPosition.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
+ ','
+ (world.model.player.position.y + map.worldPosition.y-1) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
L.log("Showing " + url);
displayworldmap_webview.loadUrl(url);
displayworldmap_webview.setBackgroundColor(ThemeHelper.getThemeColor(this, R.attr.ui_theme_displayworldmap_bg_color));
displayworldmap_webview.setWebViewClient(new WebViewClient() {
@SuppressLint("NewApi")
@Override
public void onPageFinished(WebView view, String url)
{
recenter();
}
});
}
private void recenter() {
displayworldmap_webview.postDelayed(new Runnable() {
@Override
public void run() {
if (map != null) {
//Local map to global worldmap
int x = world.model.player.position.x + map.worldPosition.x - offsetWorldmapTo.x;
//Tile coord to pixel coord
x *= WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
x += WorldMapController.WORLDMAP_DISPLAY_TILESIZE/2;
//Zoom level
x = (int)(x * displayworldmap_webview.getScale());
//Center
x -= displayworldmap_webview.getWidth() / 2;
//Local map to global worldmap
int y = world.model.player.position.y + map.worldPosition.y - offsetWorldmapTo.y;
//Tile coord to pixel coord
y *= WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
y += WorldMapController.WORLDMAP_DISPLAY_TILESIZE/2;
//Zoom level
y = (int)(y * displayworldmap_webview.getScale());
//Center
y -= displayworldmap_webview.getHeight() / 2;
displayworldmap_webview.scrollTo(x, y);
}
}
}, 100);
}
@Override
public void finish() {
ViewGroup view = (ViewGroup) getWindow().getDecorView();
view.removeAllViews();
super.finish();
}
}
package com.gpl.rpg.AndorsTrail.activity;
import java.io.File;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.WorldMapController;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.WorldMapSegmentMap;
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
public final class DisplayWorldMapActivity extends AndorsTrailBaseActivity {
private WorldContext world;
private WebView displayworldmap_webview;
private String worldMapSegmentName;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (!app.isInitialized()) { finish(); return; }
this.world = app.getWorld();
app.setWindowParameters(this);
setContentView(R.layout.displayworldmap);
displayworldmap_webview = (WebView) findViewById(R.id.displayworldmap_webview);
displayworldmap_webview.setBackgroundColor(ThemeHelper.getThemeColor(this, R.attr.ui_theme_displayworldmap_bg_color));
displayworldmap_webview.getSettings().setBuiltInZoomControls(true);
displayworldmap_webview.getSettings().setUseWideViewPort(true);
displayworldmap_webview.setVerticalScrollBarEnabled(true);
displayworldmap_webview.setHorizontalScrollBarEnabled(true);
displayworldmap_webview.getSettings().setAllowFileAccess(true);
enableJavascript();
Button b = (Button) findViewById(R.id.displayworldmap_close);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DisplayWorldMapActivity.this.finish();
}
});
b = (Button) findViewById(R.id.displayworldmap_recenter);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
recenter();
}
});
worldMapSegmentName = getIntent().getStringExtra("worldMapSegmentName");
}
@SuppressLint("SetJavaScriptEnabled")
public void enableJavascript() {
displayworldmap_webview.getSettings().setJavaScriptEnabled(true);
}
@Override
public void onResume() {
super.onResume();
update();
}
WorldMapSegmentMap map;
Coord offsetWorldmapTo;
@SuppressLint("NewApi")
private void update() {
File worldmap = WorldMapController.getCombinedWorldMapFile(this, worldMapSegmentName);
if (!worldmap.exists()) {
Toast.makeText(this, getResources().getString(R.string.menu_button_worldmap_failed), Toast.LENGTH_LONG).show();
this.finish();
}
WorldMapSegment segment = world.maps.worldMapSegments.get(worldMapSegmentName);
map = segment.maps.get(world.model.currentMaps.map.name);
if (map == null) {
this.finish();
return;
}
offsetWorldmapTo = new Coord(999999, 999999);
for (WorldMapSegmentMap map : segment.maps.values()) {
PredefinedMap predefinedMap = world.maps.findPredefinedMap(map.mapName);
if (predefinedMap == null) continue;
if (!predefinedMap.visited) continue;
if (!WorldMapController.fileForMapExists(this, predefinedMap)) continue;
offsetWorldmapTo.x = Math.min(offsetWorldmapTo.x, map.worldPosition.x);
offsetWorldmapTo.y = Math.min(offsetWorldmapTo.y, map.worldPosition.y);
}
String url = AndroidStorage.getUrlForFile(this, worldmap) + '?'
+ (world.model.player.position.x + map.worldPosition.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
+ ','
+ (world.model.player.position.y + map.worldPosition.y-1) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
L.log("Showing " + url);
displayworldmap_webview.loadUrl(url);
displayworldmap_webview.setBackgroundColor(ThemeHelper.getThemeColor(this, R.attr.ui_theme_displayworldmap_bg_color));
displayworldmap_webview.setWebViewClient(new WebViewClient() {
@SuppressLint("NewApi")
@Override
public void onPageFinished(WebView view, String url)
{
recenter();
}
});
}
private void recenter() {
displayworldmap_webview.postDelayed(new Runnable() {
@Override
public void run() {
if (map != null) {
//Local map to global worldmap
int x = world.model.player.position.x + map.worldPosition.x - offsetWorldmapTo.x;
//Tile coord to pixel coord
x *= WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
x += WorldMapController.WORLDMAP_DISPLAY_TILESIZE/2;
//Zoom level
x = (int)(x * displayworldmap_webview.getScale());
//Center
x -= displayworldmap_webview.getWidth() / 2;
//Local map to global worldmap
int y = world.model.player.position.y + map.worldPosition.y - offsetWorldmapTo.y;
//Tile coord to pixel coord
y *= WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
y += WorldMapController.WORLDMAP_DISPLAY_TILESIZE/2;
//Zoom level
y = (int)(y * displayworldmap_webview.getScale());
//Center
y -= displayworldmap_webview.getHeight() / 2;
displayworldmap_webview.scrollTo(x, y);
}
}
}, 100);
}
@Override
public void finish() {
ViewGroup view = (ViewGroup) getWindow().getDecorView();
view.removeAllViews();
super.finish();
}
}

View File

@@ -1,9 +1,7 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.ViewGroup;

View File

@@ -1,139 +1,139 @@
package com.gpl.rpg.AndorsTrail.activity;
import java.util.Collections;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.ItemEffectsView;
public final class ItemInfoActivity extends AndorsTrailBaseActivity {
public static enum ItemInfoAction {
none, use, equip, unequip, buy, sell
}
public static final int RESULT_MORE_ACTIONS = Activity.RESULT_FIRST_USER;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getDialogTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (!app.isInitialized()) { finish(); return; }
final WorldContext world = app.getWorld();
app.setWindowParameters(this);
final Intent intent = getIntent();
Bundle params = intent.getExtras();
String itemTypeID = params.getString("itemTypeID");
final ItemType itemType = world.itemTypes.getItemType(itemTypeID);
final String buttonText = params.getString("buttonText");
boolean buttonEnabled = params.getBoolean("buttonEnabled");
boolean moreButtonEnabled = params.getBoolean("moreActions");
setContentView(R.layout.iteminfo);
TextView tv = (TextView) findViewById(R.id.iteminfo_title);
tv.setText(itemType.getName(world.model.player));
world.tileManager.setImageViewTileForSingleItemType(getResources(), tv, itemType);
tv = (TextView) findViewById(R.id.iteminfo_description);
String description = itemType.getDescription();
if (description != null) {
tv.setText(description);
tv.setVisibility(View.VISIBLE);
} else {
tv.setVisibility(View.GONE);
}
tv = (TextView) findViewById(R.id.iteminfo_category);
tv.setText(itemType.category.displayName);
((ItemEffectsView) findViewById(R.id.iteminfo_effects)).update(
itemType.effects_equip,
itemType.effects_use == null ? null : Collections.singletonList(itemType.effects_use),
itemType.effects_hit == null ? null : Collections.singletonList(itemType.effects_hit),
itemType.effects_kill == null ? null : Collections.singletonList(itemType.effects_kill),
itemType.effects_hitReceived == null ? null : Collections.singletonList(itemType.effects_hitReceived),
null,
itemType.isWeapon()
);
Button b = (Button) findViewById(R.id.iteminfo_close);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
setResult(RESULT_CANCELED);
ItemInfoActivity.this.finish();
}
});
b = (Button) findViewById(R.id.iteminfo_more);
if (!moreButtonEnabled) {
b.setVisibility(View.GONE);
} else {
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent result = new Intent();
result.putExtras(intent);
setResult(RESULT_MORE_ACTIONS, intent);
ItemInfoActivity.this.finish();
}
});
}
b = (Button) findViewById(R.id.iteminfo_action);
if (buttonText != null && buttonText.length() > 0) {
b.setVisibility(View.VISIBLE);
b.setEnabled(buttonEnabled);
b.setText(buttonText);
} else {
b.setVisibility(View.GONE);
}
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent result = new Intent();
result.putExtras(intent);
setResult(RESULT_OK, result);
ItemInfoActivity.this.finish();
}
});
tv = (TextView) findViewById(R.id.iteminfo_displaytype);
if (itemType.isOrdinaryItem()) {
tv.setVisibility(View.GONE);
} else {
tv.setVisibility(View.VISIBLE);
final String diplayType = getDisplayTypeString(getResources(), itemType);
tv.setText(diplayType);
}
}
public static String getDisplayTypeString(Resources res, ItemType itemType) {
switch (itemType.displayType) {
case rare: return res.getString(R.string.iteminfo_displaytypes_rare);
case extraordinary: return res.getString(R.string.iteminfo_displaytypes_extraordinary);
case legendary: return res.getString(R.string.iteminfo_displaytypes_legendary);
case ordinary: return res.getString(R.string.iteminfo_displaytypes_ordinary);
case quest: return res.getString(R.string.iteminfo_displaytypes_quest);
default: return "";
}
}
}
package com.gpl.rpg.AndorsTrail.activity;
import java.util.Collections;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.ItemEffectsView;
public final class ItemInfoActivity extends AndorsTrailBaseActivity {
public static enum ItemInfoAction {
none, use, equip, unequip, buy, sell
}
public static final int RESULT_MORE_ACTIONS = Activity.RESULT_FIRST_USER;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getDialogTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (!app.isInitialized()) { finish(); return; }
final WorldContext world = app.getWorld();
app.setWindowParameters(this);
final Intent intent = getIntent();
Bundle params = intent.getExtras();
String itemTypeID = params.getString("itemTypeID");
final ItemType itemType = world.itemTypes.getItemType(itemTypeID);
final String buttonText = params.getString("buttonText");
boolean buttonEnabled = params.getBoolean("buttonEnabled");
boolean moreButtonEnabled = params.getBoolean("moreActions");
setContentView(R.layout.iteminfo);
TextView tv = (TextView) findViewById(R.id.iteminfo_title);
tv.setText(itemType.getName(world.model.player));
world.tileManager.setImageViewTileForSingleItemType(getResources(), tv, itemType);
tv = (TextView) findViewById(R.id.iteminfo_description);
String description = itemType.getDescription();
if (description != null) {
tv.setText(description);
tv.setVisibility(View.VISIBLE);
} else {
tv.setVisibility(View.GONE);
}
tv = (TextView) findViewById(R.id.iteminfo_category);
tv.setText(itemType.category.displayName);
((ItemEffectsView) findViewById(R.id.iteminfo_effects)).update(
itemType.effects_equip,
itemType.effects_use == null ? null : Collections.singletonList(itemType.effects_use),
itemType.effects_hit == null ? null : Collections.singletonList(itemType.effects_hit),
itemType.effects_kill == null ? null : Collections.singletonList(itemType.effects_kill),
itemType.effects_hitReceived == null ? null : Collections.singletonList(itemType.effects_hitReceived),
null,
itemType.isWeapon()
);
Button b = (Button) findViewById(R.id.iteminfo_close);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
setResult(RESULT_CANCELED);
ItemInfoActivity.this.finish();
}
});
b = (Button) findViewById(R.id.iteminfo_more);
if (!moreButtonEnabled) {
b.setVisibility(View.GONE);
} else {
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent result = new Intent();
result.putExtras(intent);
setResult(RESULT_MORE_ACTIONS, intent);
ItemInfoActivity.this.finish();
}
});
}
b = (Button) findViewById(R.id.iteminfo_action);
if (buttonText != null && buttonText.length() > 0) {
b.setVisibility(View.VISIBLE);
b.setEnabled(buttonEnabled);
b.setText(buttonText);
} else {
b.setVisibility(View.GONE);
}
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent result = new Intent();
result.putExtras(intent);
setResult(RESULT_OK, result);
ItemInfoActivity.this.finish();
}
});
tv = (TextView) findViewById(R.id.iteminfo_displaytype);
if (itemType.isOrdinaryItem()) {
tv.setVisibility(View.GONE);
} else {
tv.setVisibility(View.VISIBLE);
final String diplayType = getDisplayTypeString(getResources(), itemType);
tv.setText(diplayType);
}
}
public static String getDisplayTypeString(Resources res, ItemType itemType) {
switch (itemType.displayType) {
case rare: return res.getString(R.string.iteminfo_displaytypes_rare);
case extraordinary: return res.getString(R.string.iteminfo_displaytypes_extraordinary);
case legendary: return res.getString(R.string.iteminfo_displaytypes_legendary);
case ordinary: return res.getString(R.string.iteminfo_displaytypes_ordinary);
case quest: return res.getString(R.string.iteminfo_displaytypes_quest);
default: return "";
}
}
}

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.View;

View File

@@ -0,0 +1,876 @@
package com.gpl.rpg.AndorsTrail.activity;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import android.Manifest;
import android.app.Activity;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v4.provider.DocumentFile;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
import com.gpl.rpg.AndorsTrail.savegames.Savegames;
import com.gpl.rpg.AndorsTrail.savegames.Savegames.FileHeader;
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
public final class LoadSaveActivity extends AndorsTrailBaseActivity implements OnClickListener {
private boolean isLoading = true;
//region special slot numbers
private static final int SLOT_NUMBER_CREATE_NEW_SLOT = -1;
public static final int SLOT_NUMBER_EXPORT_SAVEGAMES = -2;
public static final int SLOT_NUMBER_IMPORT_SAVEGAMES = -3;
public static final int SLOT_NUMBER_IMPORT_WORLDMAP = -4;
private static final int SLOT_NUMBER_FIRST_SLOT = 1;
//endregion
private ModelContainer model;
private TileManager tileManager;
private AndorsTrailPreferences preferences;
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getDialogTheme());
super.onCreate(savedInstanceState);
final AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
app.setWindowParameters(this);
this.model = app.getWorld().model;
this.preferences = app.getPreferences();
this.tileManager = app.getWorld().tileManager;
String loadsave = getIntent().getData().getLastPathSegment();
isLoading = (loadsave.equalsIgnoreCase("load"));
setContentView(R.layout.loadsave);
TextView tv = (TextView) findViewById(R.id.loadsave_title);
if (isLoading) {
tv.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_menu_search, 0, 0, 0);
tv.setText(R.string.loadsave_title_load);
} else {
tv.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.ic_menu_save, 0, 0, 0);
tv.setText(R.string.loadsave_title_save);
}
ViewGroup slotList = (ViewGroup) findViewById(R.id.loadsave_slot_list);
Button slotTemplateButton = (Button) findViewById(R.id.loadsave_slot_n);
LayoutParams params = slotTemplateButton.getLayoutParams();
slotList.removeView(slotTemplateButton);
ViewGroup newSlotContainer = (ViewGroup) findViewById(R.id.loadsave_save_to_new_slot_container);
Button createNewSlot = (Button) findViewById(R.id.loadsave_save_to_new_slot);
Button exportSaves = (Button) findViewById(R.id.loadsave_export_save);
Button importSaves = (Button) findViewById(R.id.loadsave_import_save);
Button importWorldmap = (Button) findViewById(R.id.loadsave_import_worldmap);
exportSaves.setTag(SLOT_NUMBER_EXPORT_SAVEGAMES);
importSaves.setTag(SLOT_NUMBER_IMPORT_SAVEGAMES);
importWorldmap.setTag(SLOT_NUMBER_IMPORT_WORLDMAP);
ViewGroup exportImportContainer = (ViewGroup) findViewById(R.id.loadsave_export_import_save_container);
addSavegameSlotButtons(slotList, params, Savegames.getUsedSavegameSlots(this));
checkAndRequestPermissions();
if (!isLoading) {
createNewSlot.setTag(SLOT_NUMBER_CREATE_NEW_SLOT);
createNewSlot.setOnClickListener(this);
newSlotContainer.setVisibility(View.VISIBLE);
exportImportContainer.setVisibility(View.GONE);
} else {
newSlotContainer.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
exportSaves.setOnClickListener(this);
importSaves.setOnClickListener(this);
importWorldmap.setOnClickListener(this);
exportImportContainer.setVisibility(View.VISIBLE);
boolean hasSavegames = !Savegames.getUsedSavegameSlots(this).isEmpty();
exportSaves.setEnabled(hasSavegames);
} else {
exportImportContainer.setVisibility(View.GONE);
}
}
}
private static final int READ_EXTERNAL_STORAGE_REQUEST = 1;
private static final int WRITE_EXTERNAL_STORAGE_REQUEST = 2;
private void checkAndRequestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
if (getApplicationContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
this.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
READ_EXTERNAL_STORAGE_REQUEST);
}
if (getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
WRITE_EXTERNAL_STORAGE_REQUEST);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, R.string.storage_permissions_mandatory, Toast.LENGTH_LONG).show();
((AndorsTrailApplication) getApplication()).discardWorld();
finish();
}
}
private void addSavegameSlotButtons(ViewGroup parent,
LayoutParams params,
List<Integer> usedSavegameSlots) {
int unused = 1;
for (int slot : usedSavegameSlots) {
final FileHeader header = Savegames.quickload(this, slot);
if (header == null) {
continue;
}
while (unused < slot) {
Button b = new Button(this);
b.setLayoutParams(params);
b.setTag(unused);
b.setOnClickListener(this);
b.setText(getString(R.string.loadsave_empty_slot, unused));
tileManager.setImageViewTileForPlayer(getResources(), b, header.iconID);
parent.addView(b, params);
unused++;
}
unused++;
Button b = new Button(this);
b.setLayoutParams(params);
b.setTag(slot);
b.setOnClickListener(this);
b.setText(slot + ". " + header.describe());
tileManager.setImageViewTileForPlayer(getResources(), b, header.iconID);
parent.addView(b, params);
}
}
private void cancelLoadSaveActivity(int slot) {
completeLoadSaveActivity(slot, false);
}
private void completeLoadSaveActivity(int slot) {
completeLoadSaveActivity(slot, true);
}
private void completeLoadSaveActivity(int slot, boolean success) {
Intent i = new Intent();
if (slot == SLOT_NUMBER_CREATE_NEW_SLOT) {
slot = getFirstFreeSlot();
} else if (slot == SLOT_NUMBER_EXPORT_SAVEGAMES
|| slot == SLOT_NUMBER_IMPORT_SAVEGAMES
|| slot == SLOT_NUMBER_IMPORT_WORLDMAP) {
i.putExtra("import_export", true);
if (slot == SLOT_NUMBER_IMPORT_WORLDMAP) {
i.putExtra("import_worldmap", true);
}
if (slot == SLOT_NUMBER_IMPORT_SAVEGAMES) {
i.putExtra("import_savegames", true);
}
if (slot == SLOT_NUMBER_EXPORT_SAVEGAMES) {
i.putExtra("export", true);
}
} else if (slot < SLOT_NUMBER_FIRST_SLOT) {
slot = SLOT_NUMBER_FIRST_SLOT;
}
i.putExtra("slot", slot);
if (success) {
setResult(Activity.RESULT_OK, i);
} else {
setResult(Activity.RESULT_CANCELED, i);
}
LoadSaveActivity.this.finish();
}
private int getFirstFreeSlot() {
int slot;
List<Integer> usedSlots = Savegames.getUsedSavegameSlots(this);
if (usedSlots.isEmpty()) {
slot = SLOT_NUMBER_FIRST_SLOT;
} else {
slot = Collections.max(usedSlots) + 1;
}
return slot;
}
private String getConfirmOverwriteQuestion(int slot) {
if (isLoading) {
return null;
}
return getConfirmOverwriteQuestionIgnoringLoading(slot);
}
private String getConfirmOverwriteQuestionIgnoringLoading(int slot) {
if (slot == SLOT_NUMBER_CREATE_NEW_SLOT) {
return null;//creating a new savegame
}
if (!Savegames.getSlotFile(slot, this).exists()) {
return null;//nothing in slot to overwrite
}
if (preferences.displayOverwriteSavegame
== AndorsTrailPreferences.CONFIRM_OVERWRITE_SAVEGAME_ALWAYS) {
return getString(R.string.loadsave_save_overwrite_confirmation_all);
}
if (preferences.displayOverwriteSavegame == AndorsTrailPreferences.CONFIRM_OVERWRITE_SAVEGAME_NEVER) {
return null;
}
final String currentPlayerName = model.player.getName();
final FileHeader header = Savegames.quickload(this, slot);
if (header == null) {
return null;
}
final String savedPlayerName = header.playerName;
if (currentPlayerName.equals(savedPlayerName)) {
return null; //if the names match
}
return getString(R.string.loadsave_save_overwrite_confirmation, savedPlayerName, currentPlayerName);
}
@Override
public void onClick(View view) {
final int slot = (Integer) view.getTag();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
switch (slot) {
case SLOT_NUMBER_IMPORT_WORLDMAP:
clickImportWorldmap();
return;
case SLOT_NUMBER_IMPORT_SAVEGAMES:
clickImportSaveGames();
return;
case SLOT_NUMBER_EXPORT_SAVEGAMES:
clickExportSaveGames();
return;
}
}
if (!isLoading
&& slot != SLOT_NUMBER_CREATE_NEW_SLOT
&& AndorsTrailApplication.CURRENT_VERSION
== AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION) {
if (!isOverwriteTargetInIncompatibleVersion(slot)) {
saveOrOverwriteSavegame(slot);
}
} else if (isLoading) {
loadSaveGame(slot);
} else {
saveOrOverwriteSavegame(slot);
}
}
private void saveOrOverwriteSavegame(int slot) {
final String message = getConfirmOverwriteQuestion(slot);
if (message != null) {
showConfirmOverwriteQuestion(slot, message);
} else {
completeLoadSaveActivity(slot);
}
}
private boolean isOverwriteTargetInIncompatibleVersion(int slot) {
final FileHeader header = Savegames.quickload(this, slot);
if (header != null
&& header.fileversion != AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION) {
final CustomDialog d = CustomDialogFactory.createErrorDialog(this,
"Overwriting not allowed",
"You are currently using a development version of Andor's trail. Overwriting a regular savegame is not allowed in development mode.");
CustomDialogFactory.show(d);
return true;
}
return false;
}
//region Imports/Exports
//region Export
@RequiresApi(api = Build.VERSION_CODES.P)
private void exportSaveGames(Intent data) {
Uri uri = data.getData();
Context context = getApplicationContext();
ContentResolver resolver = AndorsTrailApplication.getApplicationFromActivity(this)
.getContentResolver();
File storageDir = AndroidStorage.getStorageDirectory(context,
Constants.FILENAME_SAVEGAME_DIRECTORY);
DocumentFile target = DocumentFile.fromTreeUri(context, uri);
if (target == null) {
return;
}
File[] files = storageDir.listFiles();
if (files == null) {
showErrorExportingSaveGamesUnknown();
return;
}
boolean hasExistingFiles = false;
for (File file : files) {
String fileName = file.getName();
DocumentFile existingFile = target.findFile(fileName);
if (existingFile != null) {
hasExistingFiles = true;
break;
}
}
if (hasExistingFiles) {
showConfirmOverwriteByExportQuestion(resolver, target, files);
} else {
exportSaveGamesFolderContentToFolder(target, files);
}
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void exportSaveGamesFolderContentToFolder(DocumentFile target, File[] files) {
DocumentFile[] sourceFiles = new DocumentFile[files.length];
File[] worldmapFiles = null;
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isFile()) {
sourceFiles[i] = DocumentFile.fromFile(file);
} else if (file.isDirectory() && Objects.equals(file.getName(),
Constants.FILENAME_WORLDMAP_DIRECTORY)) {
worldmapFiles = file.listFiles();
}
}
Context context = this;
File[] finalWorldmapFiles = worldmapFiles;
CopyFilesToExternalFolder(target, sourceFiles, context, finalWorldmapFiles);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void CopyFilesToExternalFolder(DocumentFile target,
DocumentFile[] sourceFiles,
Context context,
File[] finalWorldmapFiles) {
AndroidStorage.copyDocumentFilesToDirAsync(sourceFiles,
context,
target,
getString(R.string.loadsave_exporting_savegames),
(success) -> {
if (success) {
CopyWorldmapFilesAsZip(target,
context,
finalWorldmapFiles);
} else {
completeLoadSaveActivity(
SLOT_NUMBER_EXPORT_SAVEGAMES,
false);
}
});
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void CopyWorldmapFilesAsZip(DocumentFile target,
Context context,
File[] finalWorldmapFiles) {
AndroidStorage.createZipDocumentFileFromFilesAsync(finalWorldmapFiles,
context,
target,
Constants.FILENAME_WORLDMAP_DIRECTORY,
getString(R.string.loadsave_exporting_worldmap),
(successWorldmap) -> completeLoadSaveActivity(
SLOT_NUMBER_EXPORT_SAVEGAMES,
successWorldmap));
}
//endregion
@RequiresApi(api = Build.VERSION_CODES.P)
private void importSaveGames(Intent data) {
Uri uri = data.getData();
ClipData uris = data.getClipData();
if (uri == null && uris == null) {
//no file was selected
return;
}
Context context = getApplicationContext();
ContentResolver resolver = AndorsTrailApplication.getApplicationFromActivity(this)
.getContentResolver();
File storageDir = AndroidStorage.getStorageDirectory(context, Constants.FILENAME_SAVEGAME_DIRECTORY);
DocumentFile appSavegameFolder = DocumentFile.fromFile(storageDir);
List<Uri> uriList = new ArrayList<>();
if (uri != null) {
uriList.add(uri);
} else {
for (int i = 0; i < uris.getItemCount(); i++) {
uriList.add(uris.getItemAt(i).getUri());
}
}
importSaveGamesFromUris(context, resolver, appSavegameFolder, uriList);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void importSaveGamesFromUris(Context context,
ContentResolver resolver,
DocumentFile appSavegameFolder,
List<Uri> uriList) {
int count = uriList.size();
ArrayList<DocumentFile> alreadyExistingFiles = new ArrayList<>();
ArrayList<DocumentFile> newFiles = new ArrayList<>();
for (int i = 0; i < count; i++) {
Uri item = uriList.get(i);
DocumentFile itemFile = DocumentFile.fromSingleUri(context, item);
boolean fileAlreadyExists = getExistsSavegameInOwnFiles(itemFile, appSavegameFolder);
if (fileAlreadyExists) {
alreadyExistingFiles.add(itemFile);
} else {
newFiles.add(itemFile);
}
}
if (alreadyExistingFiles.size() > 0) {
showConfirmOverwriteByImportQuestion(resolver, appSavegameFolder, alreadyExistingFiles, newFiles);
} else {
importSaveGames(resolver, appSavegameFolder, newFiles);
}
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void importSaveGames(ContentResolver resolver,
DocumentFile appSavegameFolder,
List<DocumentFile> saveFiles) {
int size = saveFiles.size();
DocumentFile[] sources = new DocumentFile[size];
DocumentFile[] targets = new DocumentFile[size];
boolean saveAsNew = false;
for (int i = 0; i < size; i++) {
DocumentFile file = saveFiles.get(i);
if (file == null) {//null is value a marker that the next should be saved as new
saveAsNew = true;
continue;
}
int slot = getSlotFromSavegameFileName(file.getName());
if (slot == -1) {
//invalid file name
continue;
}
if (saveAsNew) {
slot = getFirstFreeSlot();
saveAsNew = false;
}
String targetName = Savegames.getSlotFileName(slot);
sources[i] = file;
targets[i] = getOrCreateDocumentFile(appSavegameFolder, targetName);
}
AndroidStorage.copyDocumentFilesFromToAsync(sources,
this,
targets,
getString(R.string.loadsave_importing_savegames),
(sucess) -> completeLoadSaveActivity(
SLOT_NUMBER_IMPORT_SAVEGAMES,
sucess));
}
private boolean getExistsSavegameInOwnFiles(DocumentFile savegameFile, DocumentFile appSavegameFolder) {
if (savegameFile == null) {
return false;
}
DocumentFile foundFile = appSavegameFolder.findFile(Objects.requireNonNull(savegameFile.getName()));
return foundFile != null && foundFile.exists();
}
private int getSlotFromSavegameFileName(String fileName) {
if (fileName == null || !fileName.startsWith(Constants.FILENAME_SAVEGAME_FILENAME_PREFIX)) {
return -1;
}
String slotStr = fileName.substring(Constants.FILENAME_SAVEGAME_FILENAME_PREFIX.length());
int slot;
try {
slot = Integer.parseInt(slotStr);
return slot;
} catch (NumberFormatException e) {
return -1;
}
}
private DocumentFile getOrCreateDocumentFile(DocumentFile folder, String targetName) {
DocumentFile targetFile = folder.findFile(targetName);//try finding the file
if (targetFile == null)//no file found, creating new one
{
targetFile = folder.createFile(Constants.NO_FILE_EXTENSION_MIME_TYPE, targetName);
}
return targetFile;
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void importWorldmap(Intent data) {
Uri uri = data.getData();
Context context = AndorsTrailApplication.getApplicationFromActivity(this).getApplicationContext();
DocumentFile chosenZip = DocumentFile.fromSingleUri(context, uri);
if (chosenZip == null || !chosenZip.isFile()) {
showErrorImportingWorldmapWrongDirectory();
return;
}
String chosenZipName = chosenZip.getName();
if (!chosenZipName.startsWith(Constants.FILENAME_WORLDMAP_DIRECTORY)) {
showErrorImportingWorldmapWrongDirectory();
return;
}
File ownWorldmapFolder = getOwnWorldmapFolder(context);
AndroidStorage.unzipDocumentFileToDirectoryAsync(chosenZip,
this,
ownWorldmapFolder,
false,
getString(R.string.loadsave_importing_worldmap),
(success) -> completeLoadSaveActivity(
SLOT_NUMBER_IMPORT_WORLDMAP,
success));
}
private File getOwnWorldmapFolder(Context context) {
File storageDir = AndroidStorage.getStorageDirectory(context, Constants.FILENAME_SAVEGAME_DIRECTORY);
File ownWorldmapFolder = null;
for (File f : storageDir.listFiles()) {
if (f.getName().equals(Constants.FILENAME_WORLDMAP_DIRECTORY)) {
ownWorldmapFolder = f;
break;
}
}
if (ownWorldmapFolder == null) {
ownWorldmapFolder = new File(storageDir, Constants.FILENAME_WORLDMAP_DIRECTORY);
ownWorldmapFolder.mkdir();
}
return ownWorldmapFolder;
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void clickExportSaveGames() {
showStartExportInfo(view -> startActivityForResult(AndroidStorage.getNewOpenDirectoryIntent(),
-SLOT_NUMBER_EXPORT_SAVEGAMES));
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void clickImportSaveGames() {
showStartImportSavesInfo(view -> startActivityForResult(AndroidStorage.getNewSelectMultipleSavegameFilesIntent(),
-SLOT_NUMBER_IMPORT_SAVEGAMES));
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void clickImportWorldmap() {
showStartImportWorldmapInfo(view -> startActivityForResult(AndroidStorage.getNewSelectZipIntent(),
-SLOT_NUMBER_IMPORT_WORLDMAP));
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void showConfirmOverwriteByExportQuestion(ContentResolver resolver,
DocumentFile targetFolder,
File[] files) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getString(R.string.loadsave_export_overwrite_confirmation_title),
getResources().getDrawable(android.R.drawable.ic_dialog_alert),
getString(R.string.loadsave_export_overwrite_confirmation),
null,
true);
CustomDialogFactory.addButton(d,
android.R.string.yes,
v -> exportSaveGamesFolderContentToFolder(targetFolder, files));
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void showConfirmOverwriteByImportQuestion(ContentResolver resolver,
DocumentFile appSavegameFolder,
List<DocumentFile> alreadyExistingFiles,
List<DocumentFile> newFiles) {
final String title = getString(R.string.loadsave_import_overwrite_confirmation_title);
String message = getString(R.string.loadsave_import_file_exists_question);
StringBuilder sb = new StringBuilder();
sb.append('\n');
int amount = alreadyExistingFiles.size();
Context context = AndorsTrailApplication.getApplicationFromActivity(this).getApplicationContext();
ArrayList<CustomDialog> dialogs = new ArrayList<>(amount);
for (int i = 0; i < amount; i++) {
DocumentFile alreadyExistingFile = alreadyExistingFiles.get(i);
int slot = getSlotFromSavegameFileName(alreadyExistingFile.getName());
FileHeader existingFileHeader = Savegames.quickload(context, slot);
FileHeader importedFileHeader = null;
try (InputStream stream = resolver.openInputStream(alreadyExistingFile.getUri());
DataInputStream dataStream = new DataInputStream(stream)) {
importedFileHeader = new FileHeader(dataStream, true);
} catch (FileNotFoundException e) {
e.printStackTrace();
continue;
} catch (IOException e) {
e.printStackTrace();
continue;
}
StringBuilder messageSb = new StringBuilder();
String existingFileDescription = getString(R.string.loadsave_import_existing_description,
Integer.toString(slot),
existingFileHeader.describe());
String importedFileDescription = getString(R.string.loadsave_import_imported_description,
Integer.toString(slot),
importedFileHeader.describe());
messageSb.append(getString(R.string.loadsave_import_file_exists_question,
existingFileDescription,
importedFileDescription));
String m = messageSb.toString();
CustomDialog dialog = CustomDialogFactory.createDialog(this,
title,
getResources().getDrawable(android.R.drawable.ic_dialog_alert),
m,
null,
true,
false,
true);
CustomDialogFactory.addButton(dialog, R.string.loadsave_import_option_keep_existing, v -> {
//do nothing
GoToNextConflictOrFinish(resolver, appSavegameFolder, newFiles, dialogs);
});
CustomDialogFactory.addButton(dialog, R.string.loadsave_import_option_keep_imported, v -> {
newFiles.add(alreadyExistingFile);
GoToNextConflictOrFinish(resolver, appSavegameFolder, newFiles, dialogs);
});
CustomDialogFactory.addButton(dialog, R.string.loadsave_import_option_add_as_new, v -> {
newFiles.add(null);//add a null element as marker to know later if the next file
// should be imported as new or overwrite the existing one
newFiles.add(alreadyExistingFile);
GoToNextConflictOrFinish(resolver, appSavegameFolder, newFiles, dialogs);
});
CustomDialogFactory.addCancelButton(dialog, android.R.string.cancel);
CustomDialogFactory.setCancelListener(dialog, v -> {
completeLoadSaveActivity(SLOT_NUMBER_IMPORT_SAVEGAMES, false);
});
dialogs.add(dialog);
}
GoToNextConflictOrFinish(resolver, appSavegameFolder, newFiles, dialogs);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void GoToNextConflictOrFinish(ContentResolver resolver,
DocumentFile appSavegameFolder,
List<DocumentFile> newFiles,
ArrayList<CustomDialog> dialogs) {
if (dialogs.stream().count() > 0) {
CustomDialog d = dialogs.remove(0);
CustomDialogFactory.show(d);
} else {
importSaveGames(resolver, appSavegameFolder, newFiles);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
switch (-requestCode) {
case SLOT_NUMBER_EXPORT_SAVEGAMES:
exportSaveGames(data);
return;
case SLOT_NUMBER_IMPORT_SAVEGAMES:
importSaveGames(data);
return;
case SLOT_NUMBER_IMPORT_WORLDMAP:
importWorldmap(data);
return;
}
}
}
//endregion
private void loadSaveGame(int slot) {
if (!Savegames.getSlotFile(slot, this).exists()) {
showErrorLoadingEmptySlot();
} else {
final FileHeader header = Savegames.quickload(this, slot);
if (header != null && !header.hasUnlimitedSaves) {
showSlotGetsDeletedOnLoadWarning(slot);
} else {
completeLoadSaveActivity(slot);
}
}
}
//region show Dialogs
//region Import/Export
@RequiresApi(api = Build.VERSION_CODES.P)
private void showStartExportInfo(OnClickListener onOk) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getString(R.string.loadsave_export),
getResources().getDrawable(android.R.drawable.ic_dialog_info),
getString(R.string.loadsave_export_info),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, onOk);
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void showStartImportSavesInfo(OnClickListener onOk) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getString(R.string.loadsave_import_save),
getResources().getDrawable(android.R.drawable.ic_dialog_info),
getString(R.string.loadsave_import_save_info),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, onOk);
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
@RequiresApi(api = Build.VERSION_CODES.P)
private void showStartImportWorldmapInfo(OnClickListener onOk) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getString(R.string.loadsave_import_worldmap),
getResources().getDrawable(android.R.drawable.ic_dialog_info),
getString(R.string.loadsave_import_worldmap_info),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, onOk);
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
private void showErrorImportingWorldmapWrongDirectory() {
final CustomDialog d = CustomDialogFactory.createErrorDialog(this,
getString(R.string.loadsave_import_worldmap_unsuccessfull),
getString(R.string.loadsave_import_worldmap_wrong_file));
CustomDialogFactory.show(d);
}
private void showErrorExportingSaveGamesUnknown() {
final CustomDialog d = CustomDialogFactory.createErrorDialog(this,
getString(R.string.loadsave_export_unsuccessfull),
getString(R.string.loadsave_export_error_unknown));
CustomDialogFactory.show(d);
}
//endregion
private void showErrorLoadingEmptySlot() {
final CustomDialog d = CustomDialogFactory.createErrorDialog(this,
getString(R.string.startscreen_error_loading_game),
getString(R.string.startscreen_error_loading_empty_slot));
CustomDialogFactory.show(d);
}
private void showSlotGetsDeletedOnLoadWarning(final int slot) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getString(R.string.startscreen_attention_slot_gets_delete_on_load),
getResources().getDrawable(android.R.drawable.ic_dialog_alert),
getString(R.string.startscreen_attention_message_slot_gets_delete_on_load),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, v -> completeLoadSaveActivity(slot));
CustomDialogFactory.show(d);
}
private void showConfirmOverwriteQuestion(final int slot, String message) {
final String title = getString(R.string.loadsave_save_overwrite_confirmation_title) + ' '
+ getString(R.string.loadsave_save_overwrite_confirmation_slot, slot);
final CustomDialog d = CustomDialogFactory.createDialog(this,
title,
getResources().getDrawable(android.R.drawable.ic_dialog_alert),
message,
null,
true);
CustomDialogFactory.addButton(d, android.R.string.yes, v -> completeLoadSaveActivity(slot));
CustomDialogFactory.addDismissButton(d, android.R.string.no);
CustomDialogFactory.show(d);
}
//endregion
}

View File

@@ -1,180 +1,180 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.WorldSetup;
import com.gpl.rpg.AndorsTrail.WorldSetup.OnResourcesLoadedListener;
import com.gpl.rpg.AndorsTrail.WorldSetup.OnSceneLoadedListener;
import com.gpl.rpg.AndorsTrail.savegames.Savegames;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CloudsAnimatorView;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
public final class LoadingActivity extends AndorsTrailBaseActivity implements OnResourcesLoadedListener, OnSceneLoadedListener {
private WorldSetup setup;
private Dialog progressDialog;
private CloudsAnimatorView clouds_back, clouds_mid, clouds_front;
boolean loaded = false;
private Object semaphore = new Object();
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
app.setWindowParameters(this);
setContentView(R.layout.startscreen);
TextView tv = (TextView) findViewById(R.id.startscreen_version);
tv.setVisibility(View.GONE);
clouds_back = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_back);
if (clouds_back != null) clouds_back.setCloudsCountAndLayer(40, CloudsAnimatorView.Layer.below);
clouds_mid = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_mid);
if (clouds_mid != null) clouds_mid.setCloudsCountAndLayer(15, CloudsAnimatorView.Layer.center);
clouds_front = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_front);
if (clouds_front != null) clouds_front.setCloudsCountAndLayer(8, CloudsAnimatorView.Layer.above);
this.setup = app.getWorldSetup();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
((AnimationDrawable)((ImageView)findViewById(R.id.title_logo)).getDrawable()).start();
ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
int ivWidth = iv.getWidth();
int drawableWidth = iv.getDrawable().getIntrinsicWidth();
float ratio = ((float)ivWidth) / ((float)drawableWidth);
if (clouds_back != null) {
clouds_back.setScalingRatio(ratio);
}
if (clouds_mid != null) {
clouds_mid.setScalingRatio(ratio);
}
if (clouds_front != null) {
clouds_front.setScalingRatio(ratio);
}
if (progressDialog == null) {
progressDialog = CustomDialogFactory.createDialog(this, getResources().getString(R.string.dialog_loading_message),
getResources().getDrawable(R.drawable.loading_anim), null, null, false, false);
synchronized (semaphore) {
if (!loaded) {
progressDialog.setOwnerActivity(this);
CustomDialogFactory.show(progressDialog);
}
}
}
}
}
@Override
public void onResume() {
super.onResume();
setup.setOnResourcesLoadedListener(this);
final ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
iv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
float[] point = new float[]{0f,0.25f * iv.getDrawable().getIntrinsicHeight()};
iv.getImageMatrix().mapPoints(point);
int imgY = (int) (iv.getTop() + point[1]);
if (clouds_back != null) {
clouds_back.setYMax(imgY);
}
if (clouds_mid != null) {
clouds_mid.setYMax(imgY);
}
if (clouds_front != null) {
clouds_front.setYMax(imgY);
}
iv.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
if (clouds_back != null)clouds_back.resumeAnimation();
if (clouds_mid != null)clouds_mid.resumeAnimation();
if (clouds_front != null)clouds_front.resumeAnimation();
}
@Override
public void onPause() {
super.onPause();
setup.setOnResourcesLoadedListener(null);
setup.removeOnSceneLoadedListener(this);
if (clouds_back != null)clouds_back.pauseAnimation();
if (clouds_mid != null)clouds_mid.pauseAnimation();
if (clouds_front != null)clouds_front.pauseAnimation();
}
@Override
public void onResourcesLoaded() {
loaded = false;
setup.startCharacterSetup(this);
}
@Override
public void onSceneLoaded() {
synchronized (semaphore) {
if (progressDialog != null) progressDialog.dismiss();
loaded =true;
}
startActivity(new Intent(this, MainActivity.class));
this.finish();
}
@Override
public void onSceneLoadFailed(Savegames.LoadSavegameResult loadResult) {
synchronized (semaphore) {
if (progressDialog != null) progressDialog.dismiss();
loaded =true;
}
if (loadResult == Savegames.LoadSavegameResult.savegameIsFromAFutureVersion) {
showLoadingFailedDialog(R.string.dialog_loading_failed_incorrectversion);
} else if (loadResult == Savegames.LoadSavegameResult.cheatingDetected) {
showLoadingFailedDialog(R.string.dialog_loading_failed_cheat);
} else {
showLoadingFailedDialog(R.string.dialog_loading_failed_message);
}
}
private void showLoadingFailedDialog(int messageResourceID) {
final Dialog d = CustomDialogFactory.createDialog(this, getResources().getString(R.string.dialog_loading_failed_title), null, getResources().getString(messageResourceID), null, true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
LoadingActivity.this.finish();
}
});
CustomDialogFactory.show(d);
}
}
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.WorldSetup;
import com.gpl.rpg.AndorsTrail.WorldSetup.OnResourcesLoadedListener;
import com.gpl.rpg.AndorsTrail.WorldSetup.OnSceneLoadedListener;
import com.gpl.rpg.AndorsTrail.savegames.Savegames;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CloudsAnimatorView;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
public final class LoadingActivity extends AndorsTrailBaseActivity implements OnResourcesLoadedListener, OnSceneLoadedListener {
private WorldSetup setup;
private CustomDialog progressDialog;
private CloudsAnimatorView clouds_back, clouds_mid, clouds_front;
boolean loaded = false;
private Object semaphore = new Object();
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
app.setWindowParameters(this);
setContentView(R.layout.startscreen);
TextView tv = (TextView) findViewById(R.id.startscreen_version);
tv.setVisibility(View.GONE);
clouds_back = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_back);
if (clouds_back != null) clouds_back.setCloudsCountAndLayer(40, CloudsAnimatorView.Layer.below);
clouds_mid = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_mid);
if (clouds_mid != null) clouds_mid.setCloudsCountAndLayer(15, CloudsAnimatorView.Layer.center);
clouds_front = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_front);
if (clouds_front != null) clouds_front.setCloudsCountAndLayer(8, CloudsAnimatorView.Layer.above);
this.setup = app.getWorldSetup();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
((AnimationDrawable)((ImageView)findViewById(R.id.title_logo)).getDrawable()).start();
ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
int ivWidth = iv.getWidth();
int drawableWidth = iv.getDrawable().getIntrinsicWidth();
float ratio = ((float)ivWidth) / ((float)drawableWidth);
if (clouds_back != null) {
clouds_back.setScalingRatio(ratio);
}
if (clouds_mid != null) {
clouds_mid.setScalingRatio(ratio);
}
if (clouds_front != null) {
clouds_front.setScalingRatio(ratio);
}
if (progressDialog == null) {
progressDialog = CustomDialogFactory.createDialog(this, getResources().getString(R.string.dialog_loading_message),
getResources().getDrawable(R.drawable.loading_anim), null, null, false, false);
synchronized (semaphore) {
if (!loaded) {
progressDialog.setOwnerActivity(this);
CustomDialogFactory.show(progressDialog);
}
}
}
}
}
@Override
public void onResume() {
super.onResume();
setup.setOnResourcesLoadedListener(this);
final ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
iv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
float[] point = new float[]{0f,0.25f * iv.getDrawable().getIntrinsicHeight()};
iv.getImageMatrix().mapPoints(point);
int imgY = (int) (iv.getTop() + point[1]);
if (clouds_back != null) {
clouds_back.setYMax(imgY);
}
if (clouds_mid != null) {
clouds_mid.setYMax(imgY);
}
if (clouds_front != null) {
clouds_front.setYMax(imgY);
}
iv.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
if (clouds_back != null)clouds_back.resumeAnimation();
if (clouds_mid != null)clouds_mid.resumeAnimation();
if (clouds_front != null)clouds_front.resumeAnimation();
}
@Override
public void onPause() {
super.onPause();
setup.setOnResourcesLoadedListener(null);
setup.removeOnSceneLoadedListener(this);
if (clouds_back != null)clouds_back.pauseAnimation();
if (clouds_mid != null)clouds_mid.pauseAnimation();
if (clouds_front != null)clouds_front.pauseAnimation();
}
@Override
public void onResourcesLoaded() {
loaded = false;
setup.startCharacterSetup(this);
}
@Override
public void onSceneLoaded() {
synchronized (semaphore) {
if (progressDialog != null) progressDialog.dismiss();
loaded =true;
}
startActivity(new Intent(this, MainActivity.class));
this.finish();
}
@Override
public void onSceneLoadFailed(Savegames.LoadSavegameResult loadResult) {
synchronized (semaphore) {
if (progressDialog != null) progressDialog.dismiss();
loaded =true;
}
if (loadResult == Savegames.LoadSavegameResult.savegameIsFromAFutureVersion) {
showLoadingFailedDialog(R.string.dialog_loading_failed_incorrectversion);
} else if (loadResult == Savegames.LoadSavegameResult.cheatingDetected) {
showLoadingFailedDialog(R.string.dialog_loading_failed_cheat);
} else {
showLoadingFailedDialog(R.string.dialog_loading_failed_message);
}
}
private void showLoadingFailedDialog(int messageResourceID) {
final CustomDialog d = CustomDialogFactory.createDialog(this, getResources().getString(R.string.dialog_loading_failed_title), null, getResources().getString(messageResourceID), null, true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
LoadingActivity.this.finish();
}
});
CustomDialogFactory.show(d);
}
}

View File

@@ -34,7 +34,6 @@ import com.gpl.rpg.AndorsTrail.controller.listeners.WorldEventListener;
import com.gpl.rpg.AndorsTrail.model.ability.ActorCondition;
import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionEffect;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import com.gpl.rpg.AndorsTrail.model.map.MapObject;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
@@ -44,6 +43,7 @@ import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CombatView;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
import com.gpl.rpg.AndorsTrail.view.DisplayActiveActorConditionIcons;
import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
import com.gpl.rpg.AndorsTrail.view.MainView;
@@ -248,7 +248,7 @@ public final class MainActivity
final ItemContainerAdapter inventoryListAdapter = new QuickslotsItemContainerAdapter(lv.getContext(), world.tileManager, world.model.player.inventory.usableItems(), world.model.player, wornTiles);
lv.setAdapter(inventoryListAdapter);
final Dialog d = CustomDialogFactory.createDialog(v.getContext(),
final CustomDialog d = CustomDialogFactory.createDialog(v.getContext(),
v.getResources().getString(R.string.inventory_assign),
v.getResources().getDrawable(R.drawable.ui_icon_equipment),
v.getResources().getString(R.string.inventory_selectitem), view, false);
@@ -305,7 +305,8 @@ public final class MainActivity
t = Toast.makeText(this, msg, duration);
lastToast = new WeakReference<Toast>(t);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && t.getView().isShown()) {
if (Build.VERSION.SDK_INT >= 30 ||
Build.VERSION.SDK_INT >= 26 && t.getView().isShown()) {
t.cancel();
}
t.setText(msg);

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
@@ -31,6 +30,7 @@ public final class MonsterInfoActivity extends AndorsTrailBaseActivity {
private RangeBar hp;
private ViewGroup monsterinfo_container;
private TextView monsterinfo_max_ap;
private TextView monsterinfo_killcount;
@Override
@@ -48,6 +48,7 @@ public final class MonsterInfoActivity extends AndorsTrailBaseActivity {
monsterinfo_title = (TextView) findViewById(R.id.monsterinfo_title);
monsterinfo_difficulty = (TextView) findViewById(R.id.monsterinfo_difficulty);
monsterinfo_max_ap = (TextView) findViewById(R.id.monsterinfo_max_ap);
monsterinfo_killcount = (TextView) findViewById(R.id.monsterinfo_killcount);
Button b = (Button) findViewById(R.id.monsterinfo_close);
b.setOnClickListener(new OnClickListener() {
@@ -95,6 +96,7 @@ public final class MonsterInfoActivity extends AndorsTrailBaseActivity {
false);
hp.update(monster.getMaxHP(), monster.getCurrentHP());
monsterinfo_max_ap.setText(Integer.toString(monster.getMaxAP()));
monsterinfo_killcount.setText(Integer.toString(world.model.statistics.getNumberOfKillsForMonsterName(monster.getName()) ));
}
public static int getMonsterDifficultyResource(ControllerContext controllerContext, Monster monster) {

View File

@@ -1,36 +1,36 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.view.Window;
import android.view.WindowManager;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
public final class Preferences extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (app.getPreferences().fullscreen) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
app.setLocale(this);
addPreferencesFromResource(R.xml.preferences);
}
@Override
protected void onResume() {
super.onResume();
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
app.setLocale(this);
}
}
package com.gpl.rpg.AndorsTrail.activity;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.view.Window;
import android.view.WindowManager;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
public final class Preferences extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(ThemeHelper.getBaseTheme());
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
if (app.getPreferences().fullscreen) {
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} else {
getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
app.setLocale(this);
addPreferencesFromResource(R.xml.preferences);
}
@Override
protected void onResume() {
super.onResume();
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
app.setLocale(this);
}
}

View File

@@ -2,10 +2,8 @@ package com.gpl.rpg.AndorsTrail.activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

View File

@@ -1,6 +1,5 @@
package com.gpl.rpg.AndorsTrail.activity;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
@@ -153,6 +152,7 @@ public final class SkillInfoActivity extends AndorsTrailBaseActivity {
case specialization2hand: return R.string.skill_title_specialization_2hand;
case specializationWeaponShield: return R.string.skill_title_specialization_weapon_shield;
case weaponProficiencyPole: return R.string.skill_title_weapon_prof_pole;
case sporeImmunity: return R.string.skill_title_spore_immunity;
default:
return -1;
}
@@ -181,6 +181,7 @@ public final class SkillInfoActivity extends AndorsTrailBaseActivity {
case resistancePhysical: return res.getString(R.string.skill_longdescription_resistance_physical_capacity, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_CHANCE_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_CHANCE_PERCENT * SkillCollection.MAX_LEVEL_RESISTANCE);
case resistanceBlood: return res.getString(R.string.skill_longdescription_resistance_blood_disorder, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_CHANCE_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_CHANCE_PERCENT * SkillCollection.MAX_LEVEL_RESISTANCE);
case shadowBless: return res.getString(R.string.skill_longdescription_shadow_bless, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_SHADOW_BLESS);
case sporeImmunity: return res.getString(R.string.skill_longdescription_spore_immunity);
case crit1: return res.getString(R.string.skill_longdescription_crit1, SkillCollection.PER_SKILLPOINT_INCREASE_CRIT1_CHANCE);
case crit2: return res.getString(R.string.skill_longdescription_crit2, SkillCollection.PER_SKILLPOINT_INCREASE_CRIT2_CHANCE);
case rejuvenation: return res.getString(R.string.skill_longdescription_rejuvenation, SkillCollection.PER_SKILLPOINT_INCREASE_REJUVENATION_CHANCE);

View File

@@ -1,292 +1,288 @@
package com.gpl.rpg.AndorsTrail.activity;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu.OnNewGameRequestedListener;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_NewGame;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_NewGame.GameCreationOverListener;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CloudsAnimatorView;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager.OnBackStackChangedListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public final class StartScreenActivity extends AndorsTrailBaseFragmentActivity implements OnNewGameRequestedListener, GameCreationOverListener, OnBackStackChangedListener {
private TextView tv;
private TextView development_version;
private CloudsAnimatorView clouds_back, clouds_mid, clouds_front;
private Fragment currentFragment;
//Means false by default, as a toggle is initiated in onCreate.
boolean ui_visible = true;
@Override
public void onCreate(Bundle savedInstanceState) {
initPreferences();
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
final AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
final Resources res = getResources();
TileManager tileManager = app.getWorld().tileManager;
tileManager.setDensity(res);
app.setWindowParameters(this);
setContentView(R.layout.startscreen);
if (findViewById(R.id.startscreen_fragment_container) != null) {
StartScreenActivity_MainMenu mainMenu = new StartScreenActivity_MainMenu();
getSupportFragmentManager().beginTransaction()
.replace(R.id.startscreen_fragment_container, mainMenu)
.commit();
currentFragment = mainMenu;
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
tv = (TextView) findViewById(R.id.startscreen_version);
tv.setText('v' + AndorsTrailApplication.CURRENT_VERSION_DISPLAY);
development_version = (TextView) findViewById(R.id.startscreen_dev_version);
if (AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAMES) {
development_version.setText(R.string.startscreen_incompatible_savegames);
development_version.setVisibility(View.VISIBLE);
} else if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
development_version.setText(R.string.startscreen_non_release_version);
development_version.setVisibility(View.VISIBLE);
}
clouds_back = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_back);
if (clouds_back != null) clouds_back.setCloudsCountAndLayer(40, CloudsAnimatorView.Layer.below);
clouds_mid = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_mid);
if (clouds_mid != null) clouds_mid.setCloudsCountAndLayer(15, CloudsAnimatorView.Layer.center);
clouds_front = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_front);
if (clouds_front != null) clouds_front.setCloudsCountAndLayer(8, CloudsAnimatorView.Layer.above);
View background = findViewById(R.id.title_bg);
if (background != null) {
background.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleUiVisibility();
}
});
}
if (development_version.getVisibility() == View.VISIBLE) {
development_version.setText(development_version.getText()
// +
// "\nMax Heap: " + Runtime.getRuntime().maxMemory() / (1024 * 1024) + "MB"+
// "\nUsed Heap: " + Runtime.getRuntime().totalMemory() / (1024 * 1024) + "MB"+
// "\nTile size: " + (int) (32 * res.getDisplayMetrics().density)
);
}
toggleUiVisibility();
app.getWorldSetup().startResourceLoader(res);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
final Dialog d = CustomDialogFactory.createDialog(this,
getResources().getString(R.string.dialog_permission_information_title),
getResources().getDrawable(android.R.drawable.ic_dialog_info),
getResources().getString(R.string.dialog_permission_information),
null,
true);
final Activity activity = this;
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
StartScreenActivity_MainMenu.checkAndRequestPermissions(activity);
}
});
CustomDialogFactory.show(d);
}
}
private void toggleUiVisibility() {
ui_visible = !ui_visible;
int visibility = ui_visible ? View.VISIBLE : View.GONE;
if (tv != null) tv.setVisibility(visibility);
if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
if (development_version != null) development_version.setVisibility(visibility);
}
if (currentFragment != null) {
if (ui_visible) {
if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
development_version.setText(
development_version.getText()
// +
// "\nMax Heap: " + Runtime.getRuntime().maxMemory() / (1024 * 1024) + "MB"+
// "\nUsed Heap: " + Runtime.getRuntime().totalMemory() / (1024 * 1024) + "MB"+
// "\nTile size: " + (int) (32 * getResources().getDisplayMetrics().density)
);
}
getSupportFragmentManager().beginTransaction()
.show(currentFragment)
.commit();
} else {
getSupportFragmentManager().beginTransaction()
.hide(currentFragment)
.commit();
}
}
}
private void initPreferences() {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
AndorsTrailPreferences preferences = app.getPreferences();
preferences.read(this);
ThemeHelper.changeTheme(preferences.selectedTheme);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
((AnimationDrawable)((ImageView)findViewById(R.id.title_logo)).getDrawable()).start();
ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
int ivWidth = iv.getWidth();
int drawableWidth = iv.getDrawable().getIntrinsicWidth();
float ratio = ((float)ivWidth) / ((float)drawableWidth);
if (clouds_back != null) {
clouds_back.setScalingRatio(ratio);
}
if (clouds_mid != null) {
clouds_mid.setScalingRatio(ratio);
}
if (clouds_front != null) {
clouds_front.setScalingRatio(ratio);
}
}
}
@Override
protected void onResume() {
super.onResume();
final ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
iv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
float[] point = new float[]{0f,0.25f * iv.getDrawable().getIntrinsicHeight()};
iv.getImageMatrix().mapPoints(point);
int imgY = (int) (iv.getTop() + point[1]);
int screenHeight = getResources().getDisplayMetrics().heightPixels;
if (clouds_back != null) {
clouds_back.setYMax(imgY);
}
if (clouds_mid != null) {
clouds_mid.setYMax(imgY);
}
if (clouds_front != null) {
clouds_front.setYMax(imgY);
}
iv.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
if (clouds_back != null)clouds_back.resumeAnimation();
if (clouds_mid != null)clouds_mid.resumeAnimation();
if (clouds_front != null)clouds_front.resumeAnimation();
}
@Override
protected void onPause() {
super.onPause();
if (clouds_back != null)clouds_back.pauseAnimation();
if (clouds_mid != null)clouds_mid.pauseAnimation();
if (clouds_front != null)clouds_front.pauseAnimation();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
backPressed();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
private void backPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
currentFragment = getSupportFragmentManager().findFragmentById(R.id.startscreen_fragment_container);
}
}
public void onNewGameRequested() {
if (findViewById(R.id.startscreen_fragment_container) != null) {
StartScreenActivity_NewGame newGameFragment = new StartScreenActivity_NewGame();
getSupportFragmentManager().beginTransaction()
.replace(R.id.startscreen_fragment_container, newGameFragment)
.addToBackStack(null)
.commit();
currentFragment = newGameFragment;
}
}
@Override
public void onGameCreationCancelled() {
backPressed();
}
@Override
public void onBackStackChanged() {
currentFragment = getSupportFragmentManager().findFragmentById(R.id.startscreen_fragment_container);
}
}
package com.gpl.rpg.AndorsTrail.activity;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_MainMenu.OnNewGameRequestedListener;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_NewGame;
import com.gpl.rpg.AndorsTrail.activity.fragment.StartScreenActivity_NewGame.GameCreationOverListener;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CloudsAnimatorView;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager.OnBackStackChangedListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
public final class StartScreenActivity extends AndorsTrailBaseFragmentActivity implements OnNewGameRequestedListener, GameCreationOverListener, OnBackStackChangedListener {
private TextView tv;
private TextView development_version;
private CloudsAnimatorView clouds_back, clouds_mid, clouds_front;
private Fragment currentFragment;
//Means false by default, as a toggle is initiated in onCreate.
boolean ui_visible = true;
@Override
public void onCreate(Bundle savedInstanceState) {
initPreferences();
setTheme(ThemeHelper.getBaseTheme());
super.onCreate(savedInstanceState);
final AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
final Resources res = getResources();
TileManager tileManager = app.getWorld().tileManager;
tileManager.setDensity(res);
app.setWindowParameters(this);
setContentView(R.layout.startscreen);
if (findViewById(R.id.startscreen_fragment_container) != null) {
StartScreenActivity_MainMenu mainMenu = new StartScreenActivity_MainMenu();
getSupportFragmentManager().beginTransaction()
.replace(R.id.startscreen_fragment_container, mainMenu)
.commit();
currentFragment = mainMenu;
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
tv = (TextView) findViewById(R.id.startscreen_version);
tv.setText('v' + AndorsTrailApplication.CURRENT_VERSION_DISPLAY);
development_version = (TextView) findViewById(R.id.startscreen_dev_version);
if (AndorsTrailApplication.DEVELOPMENT_INCOMPATIBLE_SAVEGAMES) {
development_version.setText(R.string.startscreen_incompatible_savegames);
development_version.setVisibility(View.VISIBLE);
} else if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
development_version.setText(R.string.startscreen_non_release_version);
development_version.setVisibility(View.VISIBLE);
}
clouds_back = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_back);
if (clouds_back != null) clouds_back.setCloudsCountAndLayer(40, CloudsAnimatorView.Layer.below);
clouds_mid = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_mid);
if (clouds_mid != null) clouds_mid.setCloudsCountAndLayer(15, CloudsAnimatorView.Layer.center);
clouds_front = (CloudsAnimatorView) findViewById(R.id.ts_clouds_animator_front);
if (clouds_front != null) clouds_front.setCloudsCountAndLayer(8, CloudsAnimatorView.Layer.above);
View background = findViewById(R.id.title_bg);
if (background != null) {
background.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleUiVisibility();
}
});
}
if (development_version.getVisibility() == View.VISIBLE) {
development_version.setText(development_version.getText()
// +
// "\nMax Heap: " + Runtime.getRuntime().maxMemory() / (1024 * 1024) + "MB"+
// "\nUsed Heap: " + Runtime.getRuntime().totalMemory() / (1024 * 1024) + "MB"+
// "\nTile size: " + (int) (32 * res.getDisplayMetrics().density)
);
}
toggleUiVisibility();
app.getWorldSetup().startResourceLoader(res);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
final CustomDialog d = CustomDialogFactory.createDialog(this,
getResources().getString(R.string.dialog_permission_information_title),
getResources().getDrawable(android.R.drawable.ic_dialog_info),
getResources().getString(R.string.dialog_permission_information),
null,
true);
final Activity activity = this;
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.setDismissListener(d, new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
StartScreenActivity_MainMenu.checkAndRequestPermissions(activity);
}
});
CustomDialogFactory.show(d);
}
}
private void toggleUiVisibility() {
ui_visible = !ui_visible;
int visibility = ui_visible ? View.VISIBLE : View.GONE;
if (tv != null) tv.setVisibility(visibility);
if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
if (development_version != null) development_version.setVisibility(visibility);
}
if (currentFragment != null) {
if (ui_visible) {
if (!AndorsTrailApplication.IS_RELEASE_VERSION) {
development_version.setText(
development_version.getText()
// +
// "\nMax Heap: " + Runtime.getRuntime().maxMemory() / (1024 * 1024) + "MB"+
// "\nUsed Heap: " + Runtime.getRuntime().totalMemory() / (1024 * 1024) + "MB"+
// "\nTile size: " + (int) (32 * getResources().getDisplayMetrics().density)
);
}
getSupportFragmentManager().beginTransaction()
.show(currentFragment)
.commit();
} else {
getSupportFragmentManager().beginTransaction()
.hide(currentFragment)
.commit();
}
}
}
private void initPreferences() {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
AndorsTrailPreferences preferences = app.getPreferences();
preferences.read(this);
ThemeHelper.changeTheme(preferences.selectedTheme);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
((AnimationDrawable)((ImageView)findViewById(R.id.title_logo)).getDrawable()).start();
ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
int ivWidth = iv.getWidth();
int drawableWidth = iv.getDrawable().getIntrinsicWidth();
float ratio = ((float)ivWidth) / ((float)drawableWidth);
if (clouds_back != null) {
clouds_back.setScalingRatio(ratio);
}
if (clouds_mid != null) {
clouds_mid.setScalingRatio(ratio);
}
if (clouds_front != null) {
clouds_front.setScalingRatio(ratio);
}
}
}
@Override
protected void onResume() {
super.onResume();
final ImageView iv = (ImageView) findViewById(R.id.ts_foreground);
iv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
float[] point = new float[]{0f,0.25f * iv.getDrawable().getIntrinsicHeight()};
iv.getImageMatrix().mapPoints(point);
int imgY = (int) (iv.getTop() + point[1]);
int screenHeight = getResources().getDisplayMetrics().heightPixels;
if (clouds_back != null) {
clouds_back.setYMax(imgY);
}
if (clouds_mid != null) {
clouds_mid.setYMax(imgY);
}
if (clouds_front != null) {
clouds_front.setYMax(imgY);
}
iv.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
if (clouds_back != null)clouds_back.resumeAnimation();
if (clouds_mid != null)clouds_mid.resumeAnimation();
if (clouds_front != null)clouds_front.resumeAnimation();
}
@Override
protected void onPause() {
super.onPause();
if (clouds_back != null)clouds_back.pauseAnimation();
if (clouds_mid != null)clouds_mid.pauseAnimation();
if (clouds_front != null)clouds_front.pauseAnimation();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
backPressed();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
private void backPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
currentFragment = getSupportFragmentManager().findFragmentById(R.id.startscreen_fragment_container);
}
}
public void onNewGameRequested() {
if (findViewById(R.id.startscreen_fragment_container) != null) {
StartScreenActivity_NewGame newGameFragment = new StartScreenActivity_NewGame();
getSupportFragmentManager().beginTransaction()
.replace(R.id.startscreen_fragment_container, newGameFragment)
.addToBackStack(null)
.commit();
currentFragment = newGameFragment;
}
}
@Override
public void onGameCreationCancelled() {
backPressed();
}
@Override
public void onBackStackChanged() {
currentFragment = getSupportFragmentManager().findFragmentById(R.id.startscreen_fragment_container);
}
}

View File

@@ -1,476 +1,490 @@
package com.gpl.rpg.AndorsTrail.activity.fragment;
import java.util.Arrays;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.ItemController;
import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.view.CustomMenuInflater;
import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
public final class HeroinfoActivity_Inventory extends Fragment implements CustomMenuInflater.MenuItemSelectedListener {
private static final int INTENTREQUEST_ITEMINFO = 3;
private static final int INTENTREQUEST_BULKSELECT_DROP = 11;
private WorldContext world;
private ControllerContext controllers;
private TileCollection wornTiles;
private Player player;
private ListView inventoryList;
private ItemContainerAdapter inventoryListAdapter;
private ItemContainerAdapter inventoryWeaponsListAdapter;
private ItemContainerAdapter inventoryArmorListAdapter;
private ItemContainerAdapter inventoryUsableListAdapter;
private ItemContainerAdapter inventoryQuestListAdapter;
private ItemContainerAdapter inventoryOtherListAdapter;
private TextView heroinfo_stats_gold;
private TextView heroinfo_stats_attack;
private TextView heroinfo_stats_defense;
private ItemType lastSelectedItem; // Workaround android bug #7139
private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length];
private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
if (!app.isInitialized()) return;
this.world = app.getWorld();
this.controllers = app.getControllerContext();
this.player = world.model.player;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
if (!app.isInitialized()) return v;
inventoryList = (ListView) v.findViewById(R.id.inventorylist_root);
ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon);
heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold);
heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack);
heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense);
registerForContextMenu(inventoryList);
inventoryList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// Move this code to separate function? -- Done
ItemType itemType = getSelectedItemType(position);
showInventoryItemInfo(itemType.id);
}
});
inventoryList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showContextMenuForItem(getSelectedItemType(position));
return true;
}
});
new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedInventoryCategory = value;
}
@Override
public void selectionChanged(int value) {
reloadShownCategory(value);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedInventoryCategory;
}
};
new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedInventorySort = value;
}
@Override
public void selectionChanged(int value) {
reloadShownSort(player.inventory);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedInventorySort;
}
};
ItemContainer inv = player.inventory;
wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources());
inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles);
inventoryList.setAdapter(inventoryListAdapter);
heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID));
setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon);
setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield);
setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head);
setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body);
setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet);
setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck);
setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand);
setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring);
setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring);
return v;
}
@Override
public void onStart() {
super.onStart();
update();
}
private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) {
final ImageView imageView = (ImageView) v.findViewById(viewId);
wornItemImage[inventorySlot.ordinal()] = imageView;
defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId;
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.inventory.isEmptySlot(inventorySlot)) return;
imageView.setClickable(false); // Will be enabled again on update()
showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case INTENTREQUEST_ITEMINFO:
if (resultCode == ItemInfoActivity.RESULT_MORE_ACTIONS) {
showContextMenuForItem( world.itemTypes.getItemType(data.getExtras().getString("itemTypeID")));
break;
}
if (resultCode != Activity.RESULT_OK) break;
ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID"));
ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType"));
if (actionType == ItemInfoActivity.ItemInfoAction.unequip) {
Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot"));
controllers.itemController.unequipSlot(itemType, slot);
} else if (actionType == ItemInfoActivity.ItemInfoAction.equip) {
Inventory.WearSlot slot = suggestInventorySlot(itemType);
controllers.itemController.equipItem(itemType, slot);
} else if (actionType == ItemInfoActivity.ItemInfoAction.use) {
controllers.itemController.useItem(itemType);
}
break;
case INTENTREQUEST_BULKSELECT_DROP:
if (resultCode != Activity.RESULT_OK) break;
int quantity = data.getExtras().getInt("selectedAmount");
String itemTypeID = data.getExtras().getString("itemTypeID");
dropItem(itemTypeID, quantity);
break;
}
update();
}
private Inventory.WearSlot suggestInventorySlot(ItemType itemType) {
Inventory.WearSlot slot = itemType.category.inventorySlot;
if (player.inventory.isEmptySlot(slot)) return slot;
if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring;
if (itemType.isOffhandCapableWeapon()) {
ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot;
else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield;
}
return slot;
}
private void dropItem(String itemTypeID, int quantity) {
ItemType itemType = world.itemTypes.getItemType(itemTypeID);
controllers.itemController.dropItem(itemType, quantity);
}
private void update() {
updateTraits();
updateWorn();
updateItemList();
}
private void updateTraits() {
heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold));
StringBuilder sb = new StringBuilder(10);
ItemController.describeAttackEffect(
player.getAttackChance(),
player.getDamagePotential().current,
player.getDamagePotential().max,
player.getCriticalSkill(),
player.getCriticalMultiplier(),
sb);
heroinfo_stats_attack.setText(sb.toString());
sb = new StringBuilder(10);
ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb);
heroinfo_stats_defense.setText(sb.toString());
}
private void updateWorn() {
for(Inventory.WearSlot slot : Inventory.WearSlot.values()) {
updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot));
}
}
private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) {
if (type != null) {
world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles);
} else {
imageView.setImageResource(resourceIDEmptyImage);
}
imageView.setClickable(true);
}
private void updateItemList() {
int currentScreen = world.model.uiSelections.selectedInventoryCategory;
if (currentScreen == 0)
inventoryListAdapter.notifyDataSetChanged();
else
reloadShownCategory(world.model.uiSelections.selectedInventoryCategory);
}
// @Override
// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {}
// ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo);
public void showContextMenuForItem(ItemType type) {
MenuInflater inflater = getActivity().getMenuInflater();
Menu menu = CustomMenuInflater.newMenuInstance(getActivity());
inflater.inflate(R.menu.inventoryitem, menu);
if (type.isUsable()){
menu.findItem(R.id.inv_menu_use).setVisible(true);
menu.findItem(R.id.inv_menu_assign).setVisible(true);
}
if (type.isEquippable()) {
menu.findItem(R.id.inv_menu_equip).setVisible(true);
if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
}
lastSelectedItem = null;
CustomMenuInflater.showMenuInDialog(getActivity(), menu, world.tileManager.getDrawableForItem(getResources(), type.iconID, world.tileManager.loadTilesFor(Arrays.asList(new Integer[] { type.iconID}), getResources())), type.getName(player), type, this);
}
private ItemType getSelectedItemType(int position) {
int v = world.model.uiSelections.selectedInventoryCategory;
if (v == 0) { //All items
return inventoryListAdapter.getItem(position).itemType;
}else if (v == 1) { //Weapon items
return inventoryWeaponsListAdapter.getItem(position).itemType;
} else if (v == 2) { //Armor items
return inventoryArmorListAdapter.getItem(position).itemType;
} else if (v == 3) { //Usable items
return inventoryUsableListAdapter.getItem(position).itemType;
} else if (v == 4) { //Quest items
return inventoryQuestListAdapter.getItem(position).itemType;
} else if (v == 5) { //Other items
return inventoryOtherListAdapter.getItem(position).itemType;
}
// Better than crashing...
return inventoryListAdapter.getItem(position).itemType;
}
private ItemType getSelectedItemType(AdapterContextMenuInfo info) {
return getSelectedItemType(info.position);
}
@Override
public void onMenuItemSelected(MenuItem item, Object data) {
ItemType itemType = (ItemType) data;
switch (item.getItemId()) {
case R.id.inv_menu_info:
showInventoryItemInfo(itemType);
//context.mapController.itemInfo(this, getSelectedItemType(info));
break;
case R.id.inv_menu_drop:
String itemTypeID = itemType.id;
int quantity = player.inventory.getItemQuantity(itemTypeID);
if (quantity > 1) {
Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity);
startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP);
} else {
dropItem(itemTypeID, quantity);
}
break;
case R.id.inv_menu_equip:
controllers.itemController.equipItem(itemType, itemType.category.inventorySlot);
break;
case R.id.inv_menu_equip_offhand:
if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) {
controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield);
} else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) {
controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring);
}
break;
/*case R.id.inv_menu_unequip:
context.mapController.unequipItem(this, getSelectedItemType(info));
break;*/
case R.id.inv_menu_use:
controllers.itemController.useItem(itemType);
break;
case R.id.inv_menu_assign:
//lastSelectedItem = itemType;
break;
case R.id.inv_assign_slot1:
controllers.itemController.setQuickItem(itemType, 0);
break;
case R.id.inv_assign_slot2:
controllers.itemController.setQuickItem(itemType, 1);
break;
case R.id.inv_assign_slot3:
controllers.itemController.setQuickItem(itemType, 2);
break;
case R.id.inv_menu_movetop:
player.inventory.sortToTop(itemType.id);
break;
case R.id.inv_menu_movebottom:
player.inventory.sortToBottom(itemType.id);
break;
}
update();
}
private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) {
String text;
boolean enabled = true;
if (world.model.uiSelections.isInCombat) {
int ap = world.model.player.getReequipCost();
text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap);
if (ap > 0) {
enabled = world.model.player.hasAPs(ap);
}
} else {
text = getResources().getString(R.string.iteminfo_action_unequip);
}
Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot);
startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
}
private void showInventoryItemInfo(String itemTypeID) {
showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID));
}
private void showInventoryItemInfo(ItemType itemType) {
String text = "";
int ap = 0;
boolean enabled = true;
ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none;
final boolean isInCombat = world.model.uiSelections.isInCombat;
if (itemType.isEquippable()) {
if (isInCombat) {
ap = world.model.player.getReequipCost();
text = getResources().getString(R.string.iteminfo_action_equip_ap, ap);
} else {
text = getResources().getString(R.string.iteminfo_action_equip);
}
action = ItemInfoActivity.ItemInfoAction.equip;
} else if (itemType.isUsable()) {
if (isInCombat) {
ap = world.model.player.getUseItemCost();
text = getResources().getString(R.string.iteminfo_action_use_ap, ap);
} else {
text = getResources().getString(R.string.iteminfo_action_use);
}
action = ItemInfoActivity.ItemInfoAction.use;
}
if (isInCombat && ap > 0) {
enabled = world.model.player.hasAPs(ap);
}
Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null);
startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
}
private void reloadShownCategory(int v) { // Apologies about the code duplication,
// just didn't seem to make sense as an array, although I did create a nice array for skill category adapters.
// Decide which category to show
if (v == 0) { //All items
inventoryList.setAdapter(inventoryListAdapter);
inventoryListAdapter.notifyDataSetChanged();
} else if (v == 1) { //Weapon items
inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles);
inventoryList.setAdapter(inventoryWeaponsListAdapter);
inventoryWeaponsListAdapter.notifyDataSetChanged();
} else if (v == 2) { //Armor items
inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles);
inventoryList.setAdapter(inventoryArmorListAdapter);
inventoryArmorListAdapter.notifyDataSetChanged();
} else if (v == 3) { //Usable items
inventoryUsableListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildUsableItems(), player, wornTiles);
inventoryList.setAdapter(inventoryUsableListAdapter);
inventoryUsableListAdapter.notifyDataSetChanged();
} else if (v == 4) { //Quest items
inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles);
inventoryList.setAdapter(inventoryQuestListAdapter);
inventoryQuestListAdapter.notifyDataSetChanged();
} else if (v == 5) { //Other items
inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles);
inventoryList.setAdapter(inventoryOtherListAdapter);
inventoryOtherListAdapter.notifyDataSetChanged();
}
//updateItemList();
}
private void reloadShownSort(Inventory inv) {
int selected = world.model.uiSelections.selectedInventorySort;
inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player);
// Currently not functional, perhaps because selection only updates when changed.
if (world.model.uiSelections.oldSortSelection == selected)
world.model.uiSelections.oldSortSelection = 0;
else world.model.uiSelections.oldSortSelection = selected;
updateItemList();
}
}
package com.gpl.rpg.AndorsTrail.activity.fragment;
import java.util.Arrays;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.ItemController;
import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.view.CustomMenuInflater;
import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter;
import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
public final class HeroinfoActivity_Inventory extends Fragment implements CustomMenuInflater.MenuItemSelectedListener {
private static final int INTENTREQUEST_ITEMINFO = 3;
private static final int INTENTREQUEST_BULKSELECT_DROP = 11;
private WorldContext world;
private ControllerContext controllers;
private TileCollection wornTiles;
private Player player;
private ListView inventoryList;
private ItemContainerAdapter inventoryListAdapter;
private ItemContainerAdapter inventoryWeaponsListAdapter;
private ItemContainerAdapter inventoryArmorListAdapter;
private ItemContainerAdapter inventoryJewelryListAdapter;
private ItemContainerAdapter inventoryPotionListAdapter;
private ItemContainerAdapter inventoryFoodListAdapter;
private ItemContainerAdapter inventoryQuestListAdapter;
private ItemContainerAdapter inventoryOtherListAdapter;
private TextView heroinfo_stats_gold;
private TextView heroinfo_stats_attack;
private TextView heroinfo_stats_defense;
private ItemType lastSelectedItem; // Workaround android bug #7139
private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length];
private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
if (!app.isInitialized()) return;
this.world = app.getWorld();
this.controllers = app.getControllerContext();
this.player = world.model.player;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false);
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity());
if (!app.isInitialized()) return v;
inventoryList = (ListView) v.findViewById(R.id.inventorylist_root);
ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon);
heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold);
heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack);
heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense);
registerForContextMenu(inventoryList);
inventoryList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
// Move this code to separate function? -- Done
ItemType itemType = getSelectedItemType(position);
showInventoryItemInfo(itemType.id);
}
});
inventoryList.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
showContextMenuForItem(getSelectedItemType(position));
return true;
}
});
new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedInventoryCategory = value;
}
@Override
public void selectionChanged(int value) {
reloadShownCategory(value);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedInventoryCategory;
}
};
new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedInventorySort = value;
}
@Override
public void selectionChanged(int value) {
reloadShownSort(player.inventory);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedInventorySort;
}
};
ItemContainer inv = player.inventory;
wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources());
inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles);
inventoryList.setAdapter(inventoryListAdapter);
heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID));
setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon);
setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield);
setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head);
setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body);
setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet);
setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck);
setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand);
setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring);
setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring);
return v;
}
@Override
public void onStart() {
super.onStart();
update();
}
private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) {
final ImageView imageView = (ImageView) v.findViewById(viewId);
wornItemImage[inventorySlot.ordinal()] = imageView;
defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId;
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (player.inventory.isEmptySlot(inventorySlot)) return;
imageView.setClickable(false); // Will be enabled again on update()
showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot);
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case INTENTREQUEST_ITEMINFO:
if (resultCode == ItemInfoActivity.RESULT_MORE_ACTIONS) {
showContextMenuForItem( world.itemTypes.getItemType(data.getExtras().getString("itemTypeID")));
break;
}
if (resultCode != Activity.RESULT_OK) break;
ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID"));
ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType"));
if (actionType == ItemInfoActivity.ItemInfoAction.unequip) {
Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot"));
controllers.itemController.unequipSlot(itemType, slot);
} else if (actionType == ItemInfoActivity.ItemInfoAction.equip) {
Inventory.WearSlot slot = suggestInventorySlot(itemType);
controllers.itemController.equipItem(itemType, slot);
} else if (actionType == ItemInfoActivity.ItemInfoAction.use) {
controllers.itemController.useItem(itemType);
}
break;
case INTENTREQUEST_BULKSELECT_DROP:
if (resultCode != Activity.RESULT_OK) break;
int quantity = data.getExtras().getInt("selectedAmount");
String itemTypeID = data.getExtras().getString("itemTypeID");
dropItem(itemTypeID, quantity);
break;
}
update();
}
private Inventory.WearSlot suggestInventorySlot(ItemType itemType) {
Inventory.WearSlot slot = itemType.category.inventorySlot;
if (player.inventory.isEmptySlot(slot)) return slot;
if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring;
if (itemType.isOffhandCapableWeapon()) {
ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot;
else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield;
}
return slot;
}
private void dropItem(String itemTypeID, int quantity) {
ItemType itemType = world.itemTypes.getItemType(itemTypeID);
controllers.itemController.dropItem(itemType, quantity);
}
private void update() {
updateTraits();
updateWorn();
updateItemList();
}
private void updateTraits() {
heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold));
StringBuilder sb = new StringBuilder(10);
ItemController.describeAttackEffect(
player.getAttackChance(),
player.getDamagePotential().current,
player.getDamagePotential().max,
player.getCriticalSkill(),
player.getCriticalMultiplier(),
sb);
heroinfo_stats_attack.setText(sb.toString());
sb = new StringBuilder(10);
ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb);
heroinfo_stats_defense.setText(sb.toString());
}
private void updateWorn() {
for(Inventory.WearSlot slot : Inventory.WearSlot.values()) {
updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot));
}
}
private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) {
if (type != null) {
world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles);
} else {
imageView.setImageResource(resourceIDEmptyImage);
}
imageView.setClickable(true);
}
private void updateItemList() {
int currentScreen = world.model.uiSelections.selectedInventoryCategory;
if (currentScreen == 0)
inventoryListAdapter.notifyDataSetChanged();
else
reloadShownCategory(world.model.uiSelections.selectedInventoryCategory);
}
// @Override
// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {}
// ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo);
public void showContextMenuForItem(ItemType type) {
MenuInflater inflater = getActivity().getMenuInflater();
Menu menu = CustomMenuInflater.newMenuInstance(getActivity());
inflater.inflate(R.menu.inventoryitem, menu);
if (type.isUsable()){
menu.findItem(R.id.inv_menu_use).setVisible(true);
menu.findItem(R.id.inv_menu_assign).setVisible(true);
}
if (type.isEquippable()) {
menu.findItem(R.id.inv_menu_equip).setVisible(true);
if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true);
}
lastSelectedItem = null;
CustomMenuInflater.showMenuInDialog(getActivity(), menu, world.tileManager.getDrawableForItem(getResources(), type.iconID, world.tileManager.loadTilesFor(Arrays.asList(new Integer[] { type.iconID}), getResources())), type.getName(player), type, this);
}
private ItemType getSelectedItemType(int position) {
int v = world.model.uiSelections.selectedInventoryCategory;
if (v == 0) { //All items
return inventoryListAdapter.getItem(position).itemType;
}else if (v == 1) { //Weapon items
return inventoryWeaponsListAdapter.getItem(position).itemType;
} else if (v == 2) { //Armor items
return inventoryArmorListAdapter.getItem(position).itemType;
} else if (v == 3) { //Jewelry items
return inventoryJewelryListAdapter.getItem(position).itemType;
} else if (v == 4) { //Potion items
return inventoryPotionListAdapter.getItem(position).itemType;
} else if (v == 5) { //Food items
return inventoryFoodListAdapter.getItem(position).itemType;
} else if (v == 6) { //Quest items
return inventoryQuestListAdapter.getItem(position).itemType;
} else if (v == 7) { //Other items
return inventoryOtherListAdapter.getItem(position).itemType;
}
// Better than crashing...
return inventoryListAdapter.getItem(position).itemType;
}
private ItemType getSelectedItemType(AdapterContextMenuInfo info) {
return getSelectedItemType(info.position);
}
@Override
public void onMenuItemSelected(MenuItem item, Object data) {
ItemType itemType = (ItemType) data;
switch (item.getItemId()) {
case R.id.inv_menu_info:
showInventoryItemInfo(itemType);
//context.mapController.itemInfo(this, getSelectedItemType(info));
break;
case R.id.inv_menu_drop:
String itemTypeID = itemType.id;
int quantity = player.inventory.getItemQuantity(itemTypeID);
if (quantity > 1) {
Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity);
startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP);
} else {
dropItem(itemTypeID, quantity);
}
break;
case R.id.inv_menu_equip:
controllers.itemController.equipItem(itemType, itemType.category.inventorySlot);
break;
case R.id.inv_menu_equip_offhand:
if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) {
controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield);
} else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) {
controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring);
}
break;
/*case R.id.inv_menu_unequip:
context.mapController.unequipItem(this, getSelectedItemType(info));
break;*/
case R.id.inv_menu_use:
controllers.itemController.useItem(itemType);
break;
case R.id.inv_menu_assign:
//lastSelectedItem = itemType;
break;
case R.id.inv_assign_slot1:
controllers.itemController.setQuickItem(itemType, 0);
break;
case R.id.inv_assign_slot2:
controllers.itemController.setQuickItem(itemType, 1);
break;
case R.id.inv_assign_slot3:
controllers.itemController.setQuickItem(itemType, 2);
break;
case R.id.inv_menu_movetop:
player.inventory.sortToTop(itemType.id);
break;
case R.id.inv_menu_movebottom:
player.inventory.sortToBottom(itemType.id);
break;
}
update();
}
private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) {
String text;
boolean enabled = true;
if (world.model.uiSelections.isInCombat) {
int ap = world.model.player.getReequipCost();
text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap);
if (ap > 0) {
enabled = world.model.player.hasAPs(ap);
}
} else {
text = getResources().getString(R.string.iteminfo_action_unequip);
}
Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot);
startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
}
private void showInventoryItemInfo(String itemTypeID) {
showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID));
}
private void showInventoryItemInfo(ItemType itemType) {
String text = "";
int ap = 0;
boolean enabled = true;
ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none;
final boolean isInCombat = world.model.uiSelections.isInCombat;
if (itemType.isEquippable()) {
if (isInCombat) {
ap = world.model.player.getReequipCost();
text = getResources().getString(R.string.iteminfo_action_equip_ap, ap);
} else {
text = getResources().getString(R.string.iteminfo_action_equip);
}
action = ItemInfoActivity.ItemInfoAction.equip;
} else if (itemType.isUsable()) {
if (isInCombat) {
ap = world.model.player.getUseItemCost();
text = getResources().getString(R.string.iteminfo_action_use_ap, ap);
} else {
text = getResources().getString(R.string.iteminfo_action_use);
}
action = ItemInfoActivity.ItemInfoAction.use;
}
if (isInCombat && ap > 0) {
enabled = world.model.player.hasAPs(ap);
}
Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null);
startActivityForResult(intent, INTENTREQUEST_ITEMINFO);
}
private void reloadShownCategory(int v) { // Apologies about the code duplication,
// just didn't seem to make sense as an array, although I did create a nice array for skill category adapters.
// Decide which category to show
if (v == 0) { //All items
inventoryList.setAdapter(inventoryListAdapter);
inventoryListAdapter.notifyDataSetChanged();
} else if (v == 1) { //Weapon items
inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles);
inventoryList.setAdapter(inventoryWeaponsListAdapter);
inventoryWeaponsListAdapter.notifyDataSetChanged();
} else if (v == 2) { //Armor items
inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles);
inventoryList.setAdapter(inventoryArmorListAdapter);
inventoryArmorListAdapter.notifyDataSetChanged();
} else if (v == 3) { //Jewelry items
inventoryJewelryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildJewelryItems(), player, wornTiles);
inventoryList.setAdapter(inventoryJewelryListAdapter);
inventoryJewelryListAdapter.notifyDataSetChanged();
} else if (v == 4) { //Potion items
inventoryPotionListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildPotionItems(), player, wornTiles);
inventoryList.setAdapter(inventoryPotionListAdapter);
inventoryPotionListAdapter.notifyDataSetChanged();
} else if (v == 5) { //Food items
inventoryFoodListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildFoodItems(), player, wornTiles);
inventoryList.setAdapter(inventoryFoodListAdapter);
inventoryFoodListAdapter.notifyDataSetChanged();
} else if (v == 6) { //Quest items
inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles);
inventoryList.setAdapter(inventoryQuestListAdapter);
inventoryQuestListAdapter.notifyDataSetChanged();
} else if (v == 7) { //Other items
inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles);
inventoryList.setAdapter(inventoryOtherListAdapter);
inventoryOtherListAdapter.notifyDataSetChanged();
}
//updateItemList();
}
private void reloadShownSort(Inventory inv) {
int selected = world.model.uiSelections.selectedInventorySort;
inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player);
// Currently not functional, perhaps because selection only updates when changed.
if (world.model.uiSelections.oldSortSelection == selected)
world.model.uiSelections.oldSortSelection = 0;
else world.model.uiSelections.oldSortSelection = selected;
updateItemList();
}
}

View File

@@ -144,12 +144,16 @@ public final class HeroinfoActivity_Quests extends Fragment {
groupList.add(item);
List<Map<String, ?>> logItemList = new ArrayList<Map<String, ?>>();
for (QuestLogEntry e : q.stages) {
if (e.logtext.length() <= 0) continue; // Do not show if displaytext is empty.
if (player.hasExactQuestProgress(q.questID, e.progress)) {
item = new HashMap<String, Object>();
item.put(mn_logText, e.logtext);
logItemList.add(item);
for(Integer progress : player.getQuestProgress(q.questID)) {
for(QuestLogEntry e : q.stages) {
if (e.progress == progress.intValue()) {
if (e.logtext.length() > 0) {
item = new HashMap<String, Object>();
item.put(mn_logText, e.logtext);
logItemList.add(item);
}
continue;
}
}
}
childList.add(logItemList);

View File

@@ -6,10 +6,6 @@ import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;

View File

@@ -1,131 +1,128 @@
package com.gpl.rpg.AndorsTrail.activity.fragment;
import java.util.HashSet;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter;
import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter.OnContainerItemClickedListener;
public abstract class ShopActivityFragment extends Fragment implements OnContainerItemClickedListener {
protected static final int INTENTREQUEST_ITEMINFO = 3;
protected static final int INTENTREQUEST_BULKSELECT = 9;
protected WorldContext world;
protected Player player;
protected ItemContainer shopInventory;
private TextView shop_gc;
private ShopItemContainerAdapter listAdapter;
private Button shoplist_sort;
protected abstract boolean isSellingInterface();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
if (!app.isInitialized()) return;
this.world = app.getWorld();
this.player = world.model.player;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shoplist, container, false);
final Monster npc = Dialogs.getMonsterFromIntent(getActivity().getIntent(), world);
final Resources res = getResources();
shop_gc = (TextView) v.findViewById(R.id.shop_gc);
ListView shoplist = (ListView) v.findViewById(R.id.shop_list);
shopInventory = npc.getShopItems(player);
HashSet<Integer> iconIDs = world.tileManager.getTileIDsFor(shopInventory);
iconIDs.addAll(world.tileManager.getTileIDsFor(player.inventory));
TileCollection tiles = world.tileManager.loadTilesFor(iconIDs, res);
final boolean isSelling = isSellingInterface();
listAdapter = new ShopItemContainerAdapter(getActivity(), tiles, world.tileManager, player, isSelling ? player.inventory : shopInventory, this, isSelling);
shoplist.setAdapter(listAdapter);
//Initiating drop-down list for category filters
shoplist_sort = (Button) v.findViewById(R.id.shoplist_sort_filters);
new SpinnerEmulator(v, R.id.shoplist_sort_filters, R.array.shoplist_sort_filters, R.string.shop_item_sort) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedShopSort = value;
}
@Override
public void selectionChanged(int value) {
reloadShownSort(isSelling ? player.inventory : shopInventory);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedShopSort;
}
};
return v;
}
private void reloadShownSort(ItemContainer itemContainer) {
listAdapter.reloadShownSort(world.model.uiSelections.selectedShopSort, itemContainer, player);
listAdapter.notifyDataSetChanged();
}
@Override
public void onStart() {
super.onStart();
update();
}
private Toast lastToast = null;
protected void displayStoreAction(final String msg) {
if (lastToast != null) {
lastToast.setText(msg);
} else {
lastToast = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT);
}
lastToast.show();
update();
}
@Override
public void onPause() {
super.onPause();
lastToast = null;
}
protected void update() {
listAdapter.notifyDataSetChanged();
String gc = getResources().getString(R.string.shop_yourgold, player.getGold());
shop_gc.setText(gc);
}
}
package com.gpl.rpg.AndorsTrail.activity.fragment;
import java.util.HashSet;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter;
import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator;
import com.gpl.rpg.AndorsTrail.view.ShopItemContainerAdapter.OnContainerItemClickedListener;
public abstract class ShopActivityFragment extends Fragment implements OnContainerItemClickedListener {
protected static final int INTENTREQUEST_ITEMINFO = 3;
protected static final int INTENTREQUEST_BULKSELECT = 9;
protected WorldContext world;
protected Player player;
protected ItemContainer shopInventory;
private TextView shop_gc;
private ShopItemContainerAdapter listAdapter;
private Button shoplist_sort;
protected abstract boolean isSellingInterface();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
if (!app.isInitialized()) return;
this.world = app.getWorld();
this.player = world.model.player;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.shoplist, container, false);
final Monster npc = Dialogs.getMonsterFromIntent(getActivity().getIntent(), world);
final Resources res = getResources();
shop_gc = (TextView) v.findViewById(R.id.shop_gc);
ListView shoplist = (ListView) v.findViewById(R.id.shop_list);
shopInventory = npc.getShopItems(player);
HashSet<Integer> iconIDs = world.tileManager.getTileIDsFor(shopInventory);
iconIDs.addAll(world.tileManager.getTileIDsFor(player.inventory));
TileCollection tiles = world.tileManager.loadTilesFor(iconIDs, res);
final boolean isSelling = isSellingInterface();
listAdapter = new ShopItemContainerAdapter(getActivity(), tiles, world.tileManager, player, isSelling ? player.inventory : shopInventory, this, isSelling);
shoplist.setAdapter(listAdapter);
//Initiating drop-down list for category filters
shoplist_sort = (Button) v.findViewById(R.id.shoplist_sort_filters);
new SpinnerEmulator(v, R.id.shoplist_sort_filters, R.array.shoplist_sort_filters, R.string.shop_item_sort) {
@Override
public void setValue(int value) {
world.model.uiSelections.selectedShopSort = value;
}
@Override
public void selectionChanged(int value) {
reloadShownSort(isSelling ? player.inventory : shopInventory);
}
@Override
public int getValue() {
return world.model.uiSelections.selectedShopSort;
}
};
return v;
}
private void reloadShownSort(ItemContainer itemContainer) {
listAdapter.reloadShownSort(world.model.uiSelections.selectedShopSort, itemContainer, player);
listAdapter.notifyDataSetChanged();
}
@Override
public void onStart() {
super.onStart();
update();
}
private Toast lastToast = null;
protected void displayStoreAction(final String msg) {
if (lastToast != null) {
lastToast.setText(msg);
} else {
lastToast = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT);
}
lastToast.show();
update();
}
@Override
public void onPause() {
super.onPause();
lastToast = null;
}
protected void update() {
listAdapter.notifyDataSetChanged();
String gc = getResources().getString(R.string.shop_yourgold, player.getGold());
shop_gc.setText(gc);
}
}

View File

@@ -1,355 +1,416 @@
package com.gpl.rpg.AndorsTrail.activity.fragment;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.WorldSetup;
import com.gpl.rpg.AndorsTrail.activity.AboutActivity;
import com.gpl.rpg.AndorsTrail.activity.LoadingActivity;
import com.gpl.rpg.AndorsTrail.activity.Preferences;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
import com.gpl.rpg.AndorsTrail.savegames.Savegames;
import com.gpl.rpg.AndorsTrail.savegames.Savegames.FileHeader;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
public class StartScreenActivity_MainMenu extends Fragment {
private static final int INTENTREQUEST_PREFERENCES = 7;
public static final int INTENTREQUEST_LOADGAME = 9;
private boolean hasExistingGame = false;
private Button startscreen_continue;
private Button startscreen_newgame;
private Button startscreen_load;
private ViewGroup save_preview_holder;
private ImageView save_preview_hero_icon;
private TextView save_preview_hero_desc;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
updatePreferences(false);
super.onCreateView(inflater, container, savedInstanceState);
if (container != null) {
container.removeAllViews();
}
View root = inflater.inflate(R.layout.startscreen_mainmenu, container, false);
save_preview_holder = (ViewGroup) root.findViewById(R.id.save_preview_holder);
save_preview_hero_icon = (ImageView) root.findViewById(R.id.save_preview_hero_icon);
save_preview_hero_desc = (TextView) root.findViewById(R.id.save_preview_hero_desc);
startscreen_continue = (Button) root.findViewById(R.id.startscreen_continue);
startscreen_continue.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
continueGame(false, Savegames.SLOT_QUICKSAVE, null);
}
});
startscreen_newgame = (Button) root.findViewById(R.id.startscreen_newgame);
startscreen_newgame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (hasExistingGame) {
comfirmNewGame();
} else {
createNewGame();
}
}
});
Button b = (Button) root.findViewById(R.id.startscreen_about);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startActivity(new Intent(getActivity(), AboutActivity.class));
}
});
b = (Button) root.findViewById(R.id.startscreen_preferences);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(getActivity(), Preferences.class);
StartScreenActivity_MainMenu.this.startActivityForResult(intent, INTENTREQUEST_PREFERENCES);
}
});
startscreen_load = (Button) root.findViewById(R.id.startscreen_load);
startscreen_load.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
if (hasExistingGame && app != null && app.getWorld() != null && app.getWorld().model != null
&& app.getWorld().model.statistics != null && !app.getWorld().model.statistics.hasUnlimitedSaves()) {
final Dialog d = CustomDialogFactory.createDialog(getActivity(),
getString(R.string.startscreen_load_game),
getResources().getDrawable(android.R.drawable.ic_delete),
getString(R.string.startscreen_load_game_confirm),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialogs.showLoad(StartScreenActivity_MainMenu.this);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
} else {
Dialogs.showLoad(StartScreenActivity_MainMenu.this);
}
}
});
if (AndorsTrailApplication.DEVELOPMENT_FORCE_STARTNEWGAME) {
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
continueGame(true, 0, "Debug player");
} else {
continueGame(true, 0, "Player");
}
} else if (AndorsTrailApplication.DEVELOPMENT_FORCE_CONTINUEGAME) {
continueGame(false, Savegames.SLOT_QUICKSAVE, null);
}
// if it is a new version we first fire a welcome screen in onResume
// and afterwards check the permissions
if (!isNewVersion()) {
checkAndRequestPermissions(getActivity());
}
return root;
}
@Override
public void onResume() {
super.onResume();
String playerName;
String displayInfo = null;
int iconID = TileManager.CHAR_HERO;
boolean isDead = false;
FileHeader header = Savegames.quickload(getActivity(), Savegames.SLOT_QUICKSAVE);
if (header != null && header.playerName != null) {
playerName = header.playerName;
displayInfo = header.displayInfo;
iconID = header.iconID;
isDead = header.isDead;
} else {
// Before fileversion 14 (v0.6.7), quicksave was stored in Shared preferences
SharedPreferences p = getActivity().getSharedPreferences("quicksave", Activity.MODE_PRIVATE);
playerName = p.getString("playername", null);
if (playerName != null) {
displayInfo = "level " + p.getInt("level", -1);
}
}
hasExistingGame = (playerName != null);
setButtonState(playerName, displayInfo, iconID, isDead);
if (isNewVersion()) {
Dialogs.showNewVersion(getActivity(), new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
setCurrentVersionForVersionCheck();
checkAndRequestPermissions(getActivity());
}
});
}
boolean hasSavegames = !Savegames.getUsedSavegameSlots().isEmpty();
startscreen_load.setEnabled(hasSavegames);
}
private static final int READ_EXTERNAL_STORAGE_REQUEST=1;
private static final int WRITE_EXTERNAL_STORAGE_REQUEST=2;
@TargetApi(23)
public static void checkAndRequestPermissions(final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (activity.getApplicationContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_REQUEST);
}
if (activity.getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_REQUEST);
}
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (OnNewGameRequestedListener) activity;
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
private void setButtonState(final String playerName, final String displayInfo, int iconID, boolean isDead) {
startscreen_continue.setEnabled(hasExistingGame && !isDead);
startscreen_newgame.setEnabled(true);
if (hasExistingGame) {
TileManager tm = AndorsTrailApplication.getApplicationFromActivity(getActivity()).getWorld().tileManager;
tm.setImageViewTileForPlayer(getResources(), save_preview_hero_icon, iconID);
save_preview_hero_desc.setText((isDead ? getString(R.string.rip_startscreen) : "") + playerName + ", " + displayInfo);
save_preview_holder.setVisibility(View.VISIBLE);
} else {
save_preview_holder.setVisibility(View.GONE);
}
}
private void continueGame(boolean createNewCharacter, int loadFromSlot, String name) {
final WorldSetup setup = AndorsTrailApplication.getApplicationFromActivity(getActivity()).getWorldSetup();
setup.createNewCharacter = createNewCharacter;
setup.loadFromSlot = loadFromSlot;
setup.newHeroName = name;
startActivity(new Intent(getActivity(), LoadingActivity.class));
}
private void comfirmNewGame() {
// new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AndorsTrailStyle_Dialog))
// .setTitle(R.string.startscreen_newgame)
// .setMessage(R.string.startscreen_newgame_confirm)
// .setIcon(android.R.drawable.ic_delete)
// .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// //continueGame(true);
//// hasExistingGame = false;
//// setButtonState(null, null, 0);
// createNewGame();
// }
// })
// .setNegativeButton(android.R.string.cancel, null)
// .create().show();
//
//
final Dialog d = CustomDialogFactory.createDialog(getActivity(),
getString(R.string.startscreen_newgame),
getResources().getDrawable(android.R.drawable.ic_delete),
getResources().getString(R.string.startscreen_newgame_confirm),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
createNewGame();
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
}
private static final String versionCheck = "lastversion";
private boolean isNewVersion() {
SharedPreferences s = getActivity().getSharedPreferences(Constants.PREFERENCE_MODEL_LASTRUNVERSION, Activity.MODE_PRIVATE);
int lastversion = s.getInt(versionCheck, 0);
if (lastversion >= AndorsTrailApplication.CURRENT_VERSION) return false;
return true;
}
private void setCurrentVersionForVersionCheck() {
SharedPreferences s = getActivity().getSharedPreferences(Constants.PREFERENCE_MODEL_LASTRUNVERSION, Activity.MODE_PRIVATE);
Editor e = s.edit();
e.putInt(versionCheck, AndorsTrailApplication.CURRENT_VERSION);
e.commit();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case INTENTREQUEST_LOADGAME:
if (resultCode != Activity.RESULT_OK) break;
final int slot = data.getIntExtra("slot", 1);
continueGame(false, slot, null);
break;
case INTENTREQUEST_PREFERENCES:
updatePreferences(true);
break;
}
}
private void updatePreferences(boolean alreadyStartedLoadingResources) {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
AndorsTrailPreferences preferences = app.getPreferences();
preferences.read(getActivity());
if (app.setLocale(getActivity())) {
if (alreadyStartedLoadingResources) {
// Changing the locale after having loaded the game requires resources to
// be re-loaded. Therefore, we just exit here.
Toast.makeText(getActivity(), R.string.change_locale_requires_restart, Toast.LENGTH_LONG).show();
doFinish();
return;
}
}
if (ThemeHelper.changeTheme(preferences.selectedTheme)) {
// Changing the theme requires a restart to re-create all activities.
Toast.makeText(getActivity(), R.string.change_theme_requires_restart, Toast.LENGTH_LONG).show();
doFinish();
return;
}
app.getWorld().tileManager.updatePreferences(preferences);
}
@SuppressLint("NewApi")
private void doFinish() {
//For Lollipop and above
((AndorsTrailApplication)getActivity().getApplication()).discardWorld();
getActivity().finish();
}
public interface OnNewGameRequestedListener {
public void onNewGameRequested();
}
private OnNewGameRequestedListener listener = null;
private void createNewGame() {
if (listener != null) {
listener.onNewGameRequested();
}
}
}
package com.gpl.rpg.AndorsTrail.activity.fragment;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.Dialogs;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.WorldSetup;
import com.gpl.rpg.AndorsTrail.activity.AboutActivity;
import com.gpl.rpg.AndorsTrail.activity.LoadingActivity;
import com.gpl.rpg.AndorsTrail.activity.Preferences;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
import com.gpl.rpg.AndorsTrail.savegames.Savegames;
import com.gpl.rpg.AndorsTrail.savegames.Savegames.FileHeader;
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.ThemeHelper;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory;
import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog;
public class StartScreenActivity_MainMenu extends Fragment {
private static final int INTENTREQUEST_PREFERENCES = 7;
public static final int INTENTREQUEST_LOADGAME = 9;
private boolean hasExistingGame = false;
private Button startscreen_continue;
private Button startscreen_newgame;
private Button startscreen_load;
private ViewGroup save_preview_holder;
private ImageView save_preview_hero_icon;
private TextView save_preview_hero_desc;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
updatePreferences(false);
super.onCreateView(inflater, container, savedInstanceState);
if (container != null) {
container.removeAllViews();
}
View root = inflater.inflate(R.layout.startscreen_mainmenu, container, false);
save_preview_holder = (ViewGroup) root.findViewById(R.id.save_preview_holder);
save_preview_hero_icon = (ImageView) root.findViewById(R.id.save_preview_hero_icon);
save_preview_hero_desc = (TextView) root.findViewById(R.id.save_preview_hero_desc);
startscreen_continue = (Button) root.findViewById(R.id.startscreen_continue);
startscreen_continue.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
continueGame(false, Savegames.SLOT_QUICKSAVE, null);
}
});
startscreen_newgame = (Button) root.findViewById(R.id.startscreen_newgame);
startscreen_newgame.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (hasExistingGame) {
comfirmNewGame();
} else {
createNewGame();
}
}
});
Button b = (Button) root.findViewById(R.id.startscreen_about);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
startActivity(new Intent(getActivity(), AboutActivity.class));
}
});
b = (Button) root.findViewById(R.id.startscreen_preferences);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(getActivity(), Preferences.class);
StartScreenActivity_MainMenu.this.startActivityForResult(intent, INTENTREQUEST_PREFERENCES);
}
});
startscreen_load = (Button) root.findViewById(R.id.startscreen_load);
startscreen_load.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
if (hasExistingGame && app != null && app.getWorld() != null && app.getWorld().model != null
&& app.getWorld().model.statistics != null && !app.getWorld().model.statistics.hasUnlimitedSaves()) {
final CustomDialog d = CustomDialogFactory.createDialog(getActivity(),
getString(R.string.startscreen_load_game),
getResources().getDrawable(android.R.drawable.ic_delete),
getString(R.string.startscreen_load_game_confirm),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialogs.showLoad(StartScreenActivity_MainMenu.this);
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
} else {
Dialogs.showLoad(StartScreenActivity_MainMenu.this);
}
}
});
if (AndorsTrailApplication.DEVELOPMENT_FORCE_STARTNEWGAME) {
if (AndorsTrailApplication.DEVELOPMENT_DEBUGRESOURCES) {
continueGame(true, 0, "Debug player");
} else {
continueGame(true, 0, "Player");
}
} else if (AndorsTrailApplication.DEVELOPMENT_FORCE_CONTINUEGAME) {
continueGame(false, Savegames.SLOT_QUICKSAVE, null);
}
// if it is a new version we first fire a welcome screen in onResume
// and afterwards check the permissions
if (!isNewVersion()) {
checkAndRequestPermissions(getActivity());
migrateDataOnDemand(getActivity());
}
return root;
}
@Override
public void onResume() {
super.onResume();
String playerName;
String displayInfo = null;
int iconID = TileManager.CHAR_HERO;
boolean isDead = false;
FileHeader header = Savegames.quickload(getActivity(), Savegames.SLOT_QUICKSAVE);
if (header != null && header.playerName != null) {
playerName = header.playerName;
displayInfo = header.displayInfo;
iconID = header.iconID;
isDead = header.isDead;
} else {
// Before fileversion 14 (v0.6.7), quicksave was stored in Shared preferences
SharedPreferences p = getActivity().getSharedPreferences("quicksave", Activity.MODE_PRIVATE);
playerName = p.getString("playername", null);
if (playerName != null) {
displayInfo = "level " + p.getInt("level", -1);
}
}
hasExistingGame = (playerName != null);
setButtonState(playerName, displayInfo, iconID, isDead);
if (isNewVersion()) {
Dialogs.showNewVersion(getActivity(), new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
setCurrentVersionForVersionCheck();
checkAndRequestPermissions(getActivity());
migrateDataOnDemand(getActivity());
}
});
}
}
@TargetApi(29)
public void migrateDataOnDemand(final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (activity.getApplicationContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
if (AndroidStorage.shouldMigrateToInternalStorage(activity.getApplicationContext())) {
final CustomDialog d = CustomDialogFactory.createDialog(activity,
getString(R.string.startscreen_migration_title),
activity.getResources().getDrawable(android.R.drawable.ic_dialog_alert),
getString(R.string.startscreen_migration_text),
null,
true);
CustomDialogFactory.addDismissButton(d, android.R.string.ok);
CustomDialogFactory.show(d);
if (!AndroidStorage.migrateToInternalStorage(activity.getApplicationContext())) {
final CustomDialog errorDlg = CustomDialogFactory.createDialog(activity,
getString(R.string.startscreen_migration_title),
activity.getResources().getDrawable(android.R.drawable.ic_dialog_alert),
getString(R.string.startscreen_migration_failure),
null,
true);
CustomDialogFactory.addDismissButton(errorDlg, android.R.string.ok);
d.cancel();
CustomDialogFactory.show(errorDlg);
}
} else {
L.log("INFO: No external files or destination folder ist not empty. No data migration.");
}
} else {
L.log("INFO: No read permission on external folder. No data migration.");
}
}
}
private static final int READ_EXTERNAL_STORAGE_REQUEST=1;
private static final int WRITE_EXTERNAL_STORAGE_REQUEST=2;
@TargetApi(23)
public static void checkAndRequestPermissions(final Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
if (activity.getApplicationContext().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE_REQUEST);
}
if (activity.getApplicationContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
activity.requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE_REQUEST);
}
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
listener = (OnNewGameRequestedListener) activity;
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
}
private void setButtonState(final String playerName, final String displayInfo, int iconID, boolean isDead) {
startscreen_continue.setEnabled(hasExistingGame && !isDead);
startscreen_newgame.setEnabled(true);
if (hasExistingGame) {
TileManager tm = AndorsTrailApplication.getApplicationFromActivity(getActivity()).getWorld().tileManager;
tm.setImageViewTileForPlayer(getResources(), save_preview_hero_icon, iconID);
save_preview_hero_desc.setText((isDead ? getString(R.string.rip_startscreen) : "") + playerName + ", " + displayInfo);
save_preview_holder.setVisibility(View.VISIBLE);
} else {
save_preview_holder.setVisibility(View.GONE);
}
}
private void continueGame(boolean createNewCharacter, int loadFromSlot, String name) {
final WorldSetup setup = AndorsTrailApplication.getApplicationFromActivity(getActivity()).getWorldSetup();
setup.createNewCharacter = createNewCharacter;
setup.loadFromSlot = loadFromSlot;
setup.newHeroName = name;
startActivity(new Intent(getActivity(), LoadingActivity.class));
}
private void comfirmNewGame() {
// new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.AndorsTrailStyle_Dialog))
// .setTitle(R.string.startscreen_newgame)
// .setMessage(R.string.startscreen_newgame_confirm)
// .setIcon(android.R.drawable.ic_delete)
// .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// //continueGame(true);
//// hasExistingGame = false;
//// setButtonState(null, null, 0);
// createNewGame();
// }
// })
// .setNegativeButton(android.R.string.cancel, null)
// .create().show();
//
//
final CustomDialog d = CustomDialogFactory.createDialog(getActivity(),
getString(R.string.startscreen_newgame),
getResources().getDrawable(android.R.drawable.ic_delete),
getResources().getString(R.string.startscreen_newgame_confirm),
null,
true);
CustomDialogFactory.addButton(d, android.R.string.ok, new View.OnClickListener() {
@Override
public void onClick(View v) {
createNewGame();
}
});
CustomDialogFactory.addDismissButton(d, android.R.string.cancel);
CustomDialogFactory.show(d);
}
private static final String versionCheck = "lastversion";
private boolean isNewVersion() {
SharedPreferences s = getActivity().getSharedPreferences(Constants.PREFERENCE_MODEL_LASTRUNVERSION, Activity.MODE_PRIVATE);
int lastversion = s.getInt(versionCheck, 0);
if (lastversion >= AndorsTrailApplication.CURRENT_VERSION) return false;
return true;
}
private void setCurrentVersionForVersionCheck() {
SharedPreferences s = getActivity().getSharedPreferences(Constants.PREFERENCE_MODEL_LASTRUNVERSION, Activity.MODE_PRIVATE);
Editor e = s.edit();
e.putInt(versionCheck, AndorsTrailApplication.CURRENT_VERSION);
e.commit();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case INTENTREQUEST_LOADGAME:
boolean unsuccessful = resultCode != Activity.RESULT_OK;
if(data == null) break;
final boolean wasImportOrExport = data.getBooleanExtra("import_export", false);
if (wasImportOrExport) {
String message = getImportExportMessage(!unsuccessful, data);
Toast.makeText(getActivity(), message, Toast.LENGTH_LONG).show();
break;
}
if (unsuccessful) break;
final int slot = data.getIntExtra("slot", 1);
continueGame(false, slot, null);
break;
case INTENTREQUEST_PREFERENCES:
updatePreferences(true);
break;
}
}
private String getImportExportMessage(boolean successful, Intent data) {
String message = "";
boolean isImportWorldmap = data.getBooleanExtra("import_worldmap", false);
boolean isImportSaves = data.getBooleanExtra("import_savegames", false);
boolean isExport = data.getBooleanExtra("export", false);
if(isImportWorldmap) {
message = getString(successful ? R.string.loadsave_import_worldmap_successfull : R.string.loadsave_import_worldmap_unsuccessfull);
} else if(isImportSaves) {
message = getString(successful ? R.string.loadsave_import_save_successfull : R.string.loadsave_import_save_unsuccessfull);
} else if(isExport) {
message = getString(successful ? R.string.loadsave_export_successfull : R.string.loadsave_export_unsuccessfull);
}
return message;
}
private void updatePreferences(boolean alreadyStartedLoadingResources) {
AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(getActivity());
AndorsTrailPreferences preferences = app.getPreferences();
preferences.read(getActivity());
if (app.setLocale(getActivity())) {
if (alreadyStartedLoadingResources) {
// Changing the locale after having loaded the game requires resources to
// be re-loaded. Therefore, we just exit here.
Toast.makeText(getActivity(), R.string.change_locale_requires_restart, Toast.LENGTH_LONG).show();
doFinish();
return;
}
}
if (ThemeHelper.changeTheme(preferences.selectedTheme)) {
// Changing the theme requires a restart to re-create all activities.
Toast.makeText(getActivity(), R.string.change_theme_requires_restart, Toast.LENGTH_LONG).show();
doFinish();
return;
}
app.getWorld().tileManager.updatePreferences(preferences);
}
@SuppressLint("NewApi")
private void doFinish() {
//For Lollipop and above
((AndorsTrailApplication) getActivity().getApplication()).discardWorld();
getActivity().finish();
}
public interface OnNewGameRequestedListener {
public void onNewGameRequested();
}
private OnNewGameRequestedListener listener = null;
private void createNewGame() {
if (listener != null) {
listener.onNewGameRequested();
}
}
}

View File

@@ -2,6 +2,7 @@ package com.gpl.rpg.AndorsTrail.context;
import java.lang.ref.WeakReference;
import android.content.Context;
import android.content.res.Resources;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
@@ -58,4 +59,5 @@ public final class ControllerContext {
public Resources getResources() {
return app.get().getResources();
}
public Context getContext() {return app.get().getApplicationContext(); }
}

View File

@@ -18,6 +18,7 @@ import com.gpl.rpg.AndorsTrail.model.actor.Actor;
import com.gpl.rpg.AndorsTrail.model.actor.Monster;
import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
@@ -58,6 +59,9 @@ public final class CombatController implements VisualEffectCompletedCallback {
public void exitCombat(boolean pickupLootBags) {
setCombatSelection(null, null);
world.model.uiSelections.isInCombat = false;
if (pickupLootBags) {
recordLootInCombatLog();
}
combatTurnListeners.onCombatEnded();
controllers.actorStatsController.setActorMaxAP(world.model.player);
world.model.uiSelections.selectedPosition = null;
@@ -75,6 +79,31 @@ public final class CombatController implements VisualEffectCompletedCallback {
resetCombatState();
}
private void recordLootInCombatLog() {
Loot combinedLoot = Loot.combine(killedMonsterBags);
if (combinedLoot.gold > 0) {
world.model.combatLog.append(controllers.getResources().getString(R.string.dialog_loot_foundgold, combinedLoot.gold));
}
int itemCount = combinedLoot.items.countItems();
if (itemCount > 0) {
StringBuilder itemMessage = new StringBuilder();
if (itemCount == 1) {
itemMessage.append(controllers.getResources().getString(R.string.combat_log_item_single));
} else {
itemMessage.append(controllers.getResources().getString(R.string.combat_log_item_plural, itemCount));
}
boolean firstItem = true;
for (ItemContainer.ItemEntry entry : combinedLoot.items.items) {
if (!firstItem) {
itemMessage.append(";");
}
itemMessage.append(" " + entry.itemType.getName(world.model.player) + " (" + entry.quantity + ")");
firstItem = false;
}
world.model.combatLog.append(itemMessage.toString());
}
}
private void resetCombatState() {
killedMonsterBags.clear();
totalExpThisFight = 0;
@@ -209,8 +238,9 @@ public final class CombatController implements VisualEffectCompletedCallback {
controllers.actorStatsController.addActorAP(player, player.getSkillLevel(SkillCollection.SkillID.cleave) * SkillCollection.PER_SKILLPOINT_INCREASE_CLEAVE_AP);
controllers.actorStatsController.addActorHealth(player, player.getSkillLevel(SkillCollection.SkillID.eater) * SkillCollection.PER_SKILLPOINT_INCREASE_EATER_HEALTH);
world.model.statistics.addMonsterKill(killedMonster.getMonsterTypeID());
world.model.statistics.addMonsterKill(killedMonster.monsterType);
controllers.actorStatsController.addExperience(loot.exp);
world.model.combatLog.append(controllers.getResources().getString(R.string.dialog_monsterloot_gainedexp, loot.exp));
totalExpThisFight += loot.exp;
loot.exp = 0;

View File

@@ -23,10 +23,11 @@ public final class Constants {
public static final long MINIMUM_INPUT_INTERVAL_STD = 200;
//TODO restore final modifier before release
public static long MINIMUM_INPUT_INTERVAL = AndorsTrailApplication.DEVELOPMENT_FASTSPEED ? MINIMUM_INPUT_INTERVAL_FAST : MINIMUM_INPUT_INTERVAL_STD;
public static final int MAX_MAP_WIDTH = 33;
public static final int MAX_MAP_HEIGHT = 33;
public static final int MAX_MAP_WIDTH = 46;
public static final int MAX_MAP_HEIGHT = 46;
public static final int MONSTER_MOVEMENT_TURN_DURATION_MS = 1200;
public static final int MONSTER_IMMOBILE_MOVE_COST = 999;
public static final int TICK_DELAY = 500;
private static final int ROUND_DURATION = 6000;
@@ -48,10 +49,15 @@ public final class Constants {
public static final String FILENAME_SAVEGAME_FILENAME_PREFIX = "savegame";
public static final String PLACEHOLDER_PLAYERNAME = "$playername";
public static final String CHEAT_DETECTION_FOLDER = "dEAGyGE3YojqXjI3x4x7";
public static final String PASSIVE_ACHIEVEMENT_CHECK_PHRASE = "passive_achievement_check";
public static final String SAVEGAME_FILE_MIME_TYPE = "application/octet-stream";
public static final String WORLDMAP_FILE_MIME_TYPE = "image/png";
public static final String NO_FILE_EXTENSION_MIME_TYPE = "application/no_file_extension_mime_type";
public static final Random rnd = new Random();
public static int rollValue(final ConstRange r) { return rollValue(r.max, r.current); }
public static int rollValue(final ConstRange r, int bias) { return rollValue(r.max, r.current + bias); }
public static int rollValue(final ConstRange r, int bias) { return rollValue((r.max + 1) * 100 -1, r.current * 100 + bias)/100; }
public static int rollValue(final Range r) { return rollValue(r.max, r.current); }
private static int rollValue(final int max, final int min) {
if (max <= min) return max;
@@ -59,7 +65,7 @@ public final class Constants {
}
public static boolean roll100(final int chance) { return rollResult(100, chance); }
public static boolean rollResult(final ConstRange r) { return rollResult(r.max, r.current); }
public static boolean rollResult(final ConstRange r, int bias) { return rollResult(r.max, r.current + bias); }
public static boolean rollResult(final ConstRange r, int bias) { return rollResult(r.max * 100, r.current * 100 + bias); }
public static boolean rollResult(final Range r) { return rollResult(r.max, r.current); }
private static boolean rollResult(final int probabilityMax, final int probabilityValue) { return rnd.nextInt(probabilityMax) < probabilityValue; }
}

View File

@@ -393,18 +393,24 @@ public final class ConversationController {
}
public void proceedToPhrase(final Resources res, String phraseID, boolean applyScriptEffects, boolean displayPhraseMessage) {
while (phraseID != null) {
phraseID = proceedToPhraseInternal(res, phraseID, applyScriptEffects, displayPhraseMessage);
}
}
private String proceedToPhraseInternal(final Resources res, String phraseID, boolean applyScriptEffects, boolean displayPhraseMessage) {
if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_CLOSE)) {
listener.onConversationEnded();
return;
return null;
} else if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_SHOP)) {
listener.onConversationEndedWithShop(npc);
return;
return null;
} else if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_ATTACK)) {
endConversationWithCombat();
return;
return null;
} else if (phraseID.equalsIgnoreCase(ConversationCollection.PHRASE_REMOVE)) {
endConversationWithRemovingNPC();
return;
return null;
}
setCurrentPhrase(res, phraseID);
@@ -420,8 +426,7 @@ public final class ConversationController {
for (Reply r : currentPhrase.replies) {
if (!canSelectReply(world, r)) continue;
applyReplyEffect(world, r, controllers);
proceedToPhrase(res, r.nextPhrase, applyScriptEffects, displayPhraseMessage);
return;
return r.nextPhrase;
}
} else if (displayPhraseMessage) {
String message = getDisplayMessage(currentPhrase, player);
@@ -430,13 +435,14 @@ public final class ConversationController {
if (hasOnlyOneNextReply()) {
listener.onConversationCanProceedWithNext();
return;
return null;
}
for (Reply r : currentPhrase.replies) {
if (!canSelectReply(world, r)) continue;
listener.onConversationHasReply(r, getDisplayMessage(r, player));
}
return null;
}
private void endConversationWithRemovingNPC() {

View File

@@ -0,0 +1,342 @@
package com.gpl.rpg.AndorsTrail.controller;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.SparseIntArray;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import com.gpl.rpg.AndorsTrail.activity.HeroinfoActivity;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.L;
public final class InputController implements OnClickListener, OnLongClickListener{
private final ControllerContext controllers;
private final WorldContext world;
private final Coord lastTouchPosition_tileCoords = new Coord();
private int lastTouchPosition_dx = 0;
private int lastTouchPosition_dy = 0;
private long lastTouchEventTime = 0;
private boolean isDpadActive = false;
private int keyState_dx = 0;
private int keyState_dy = 0;
private boolean keyState_attack = false;
private boolean keyState_flee = false;
private boolean keyState_endturn = false;
final private int KEY_UNHANDLED = 0; // Default, for unhandled keycodes
final private int KEY_MOVE_UP = 1;
final private int KEY_MOVE_DOWN = 2;
final private int KEY_MOVE_LEFT = 3;
final private int KEY_MOVE_RIGHT = 4;
final private int KEY_MOVE_UP_LEFT = 5;
final private int KEY_MOVE_UP_RIGHT = 6;
final private int KEY_MOVE_DOWN_LEFT = 7;
final private int KEY_MOVE_DOWN_RIGHT = 8;
final private int KEY_ATTACK = 9;
final private int KEY_FLEE = 10;
final private int KEY_END_TURN = 11;
final private int KEY_HERO_INFO = 12;
final private int KEY_TOOLBOX = 13;
private SparseIntArray keyMap = new SparseIntArray(); // Android keycode to internal key event mapping. TODO: Configure via preferences
public InputController(ControllerContext controllers, WorldContext world) {
this.controllers = controllers;
this.world = world;
initializeKeyMap();
}
/* New keyboard handler. Both Key Down and Key Up events handled here to allow conditional behaviours.
On 4-way dpad controllers, cursor keys, and WASD, diagonals are generated by chording two keys.
Single-key diagonals are supported on numeric keypad and 8-way dpads (not seen/tested in the wild).
Because two-key combos initially generate a ordinal movement (one key comes in first), which can
be dangerous in tight spaces, modifiers are provided to "lock" the input until both keys are down.
TODO: Use delay timer to enable chorded diagonals on first move without locking kludge?
*/
// Map key codes to spectic internal actions
// TODO: Move mapping out of code to JSON/XML file, or maybe player prefs
private void initializeKeyMap() {
int key;
// Keys mapping to UP
key = KEY_MOVE_UP;
keyMap.put(KeyEvent.KEYCODE_DPAD_UP, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_8, key);
keyMap.put(KeyEvent.KEYCODE_8, key);
keyMap.put(KeyEvent.KEYCODE_W, key);
// Keys mapping to DOWN
key = KEY_MOVE_DOWN;
keyMap.put(KeyEvent.KEYCODE_DPAD_DOWN, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_2, key);
keyMap.put(KeyEvent.KEYCODE_2, key);
keyMap.put(KeyEvent.KEYCODE_S, key);
// Keys mapping to LEFT
key = KEY_MOVE_LEFT;
keyMap.put(KeyEvent.KEYCODE_DPAD_LEFT, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_4, key);
keyMap.put(KeyEvent.KEYCODE_4, key);
keyMap.put(KeyEvent.KEYCODE_A, key);
// Keys mapping to RIGHT
key = KEY_MOVE_RIGHT;
keyMap.put(KeyEvent.KEYCODE_DPAD_RIGHT, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_6, key);
keyMap.put(KeyEvent.KEYCODE_6, key);
keyMap.put(KeyEvent.KEYCODE_D, key);
// Keys mapping to UP_LEFT
key = KEY_MOVE_UP_LEFT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
keyMap.put(KeyEvent.KEYCODE_DPAD_UP_LEFT, key);
}
keyMap.put(KeyEvent.KEYCODE_NUMPAD_7, key);
keyMap.put(KeyEvent.KEYCODE_7, key);
keyMap.put(KeyEvent.KEYCODE_MOVE_HOME, key);
// Keys mapping to UP_RIGHT
key = KEY_MOVE_UP_RIGHT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
keyMap.put(KeyEvent.KEYCODE_DPAD_UP_RIGHT, key);
}
keyMap.put(KeyEvent.KEYCODE_NUMPAD_9, key);
keyMap.put(KeyEvent.KEYCODE_9, key);
keyMap.put(KeyEvent.KEYCODE_PAGE_UP, key);
// Keys mapping to DOWN_LEFT
key = KEY_MOVE_DOWN_LEFT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
keyMap.put(KeyEvent.KEYCODE_DPAD_DOWN_LEFT, key);
}
keyMap.put(KeyEvent.KEYCODE_NUMPAD_1, key);
keyMap.put(KeyEvent.KEYCODE_1, key);
keyMap.put(KeyEvent.KEYCODE_MOVE_END, key);
// Keys mapping to DOWN_RIGHT
key = KEY_MOVE_DOWN_RIGHT;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
keyMap.put(KeyEvent.KEYCODE_DPAD_DOWN_RIGHT, key);
}
keyMap.put(KeyEvent.KEYCODE_NUMPAD_3, key);
keyMap.put(KeyEvent.KEYCODE_3, key);
keyMap.put(KeyEvent.KEYCODE_PAGE_DOWN, key);
// Keys mapping to ATTACK
key = KEY_ATTACK;
keyMap.put(KeyEvent.KEYCODE_DPAD_CENTER, key);
keyMap.put(KeyEvent.KEYCODE_BUTTON_A, key);
keyMap.put(KeyEvent.KEYCODE_SPACE, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_5, key);
// Keys mapping to FLEE
key = KEY_FLEE;
keyMap.put(KeyEvent.KEYCODE_BUTTON_X, key);
keyMap.put(KeyEvent.KEYCODE_F, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_ENTER, key);
keyMap.put(KeyEvent.KEYCODE_ENTER, key);
// Keys mapping to END_TURN
key = KEY_END_TURN;
keyMap.put(KeyEvent.KEYCODE_BUTTON_Y, key);
keyMap.put(KeyEvent.KEYCODE_E, key);
keyMap.put(KeyEvent.KEYCODE_FORWARD_DEL, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_DOT, key);
// Keys mapping to HERO_INFO
key = KEY_HERO_INFO;
//keyMap.put(KeyEvent.KEYCODE_BUTTON_SELECT, key);
keyMap.put(KeyEvent.KEYCODE_BUTTON_L1, key);
keyMap.put(KeyEvent.KEYCODE_NUM_LOCK, key);
keyMap.put(KeyEvent.KEYCODE_C, key);
// Keys mapping to TOOLBOX
key = KEY_TOOLBOX;
keyMap.put(KeyEvent.KEYCODE_BUTTON_R1, key);
keyMap.put(KeyEvent.KEYCODE_NUMPAD_DIVIDE, key);
keyMap.put(KeyEvent.KEYCODE_B, key);
}
// Generate game actions based on mapped keys
public boolean onKeyboardAction(Context context, KeyEvent event, boolean acceptInput) {
//L.log("onKeyboardAction(): Processing action " + event.getAction() + " for keyCode " + event.getKeyCode());
if (event.getAction() != KeyEvent.ACTION_DOWN && event.getAction() != KeyEvent.ACTION_UP) return false; // don't handle other actions
boolean keydown = (event.getAction() == KeyEvent.ACTION_DOWN);
boolean inihbit = (keyState_attack || keyState_flee); // used to inhibit movement if an action key is held down
switch (keyMap.get(event.getKeyCode())) {
// Ordinal directional keys - only modify one direction register; registers are combined when
// keys used simultaneously to create synthetic diagonals
case KEY_MOVE_UP:
keyState_dy = keydown ? -1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_DOWN:
keyState_dy = keydown ? 1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_LEFT:
keyState_dx = keydown ? -1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_RIGHT:
keyState_dx = keydown ? 1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
// Diagonal directional keys. Modify both direction registers, can't be combined
// TODO: store individual key position to allow combinations. May not be worth the trouble.
case KEY_MOVE_UP_LEFT:
keyState_dx = keydown ? -1 : 0;
keyState_dy = keydown ? -1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_UP_RIGHT:
keyState_dx = keydown ? 1 : 0;
keyState_dy = keydown ? -1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_DOWN_LEFT:
keyState_dx = keydown ? -1 : 0;
keyState_dy = keydown ? 1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
case KEY_MOVE_DOWN_RIGHT:
keyState_dx = keydown ? 1 : 0;
keyState_dy = keydown ? 1 : 0;
if (acceptInput && !inihbit) onRelativeMovement(keyState_dx, keyState_dy);
break;
// Special key handling below - some combat/movement stuff done here because it's too
// specific for logic in onRelativeMovement
// "Attack" shortcut - freeze movement to allow chorded direction when key is released.
// if in combat, executes an attack on key release
case KEY_ATTACK:
if (keydown && !keyState_attack) { // key pressed - pause any movement
if(!world.model.uiSelections.isInCombat) controllers.movementController.stopMovement();
} else if (!keydown && keyState_attack) { // key released - execute attack / move in direction
if (acceptInput) onRelativeMovement(keyState_dx, keyState_dy);
}
keyState_attack = keydown;
break;
// "Flee" shortcut. Intitiates flee when pressed. If a direction is held, moves in chosen direction when released
case KEY_FLEE:
if (world.model.uiSelections.isInCombat) {
if (keydown && !keyState_flee) { // button pressed - set flee; movement locked while pressed
if(acceptInput) controllers.combatController.startFlee();
} else if (!keydown && keyState_flee) { // button released - move flee direction, if held
// We need to do a special call because the movement key may already be down, and if the device
// doesn't generate repeat keystrokes, this handler won't get another event
if ((keyState_dx != 0 || keyState_dy != 0) && allowInputInterval()) {
if(acceptInput) controllers.combatController.executeMoveAttack(keyState_dx, keyState_dy);
}
}
}
keyState_flee = keydown;
break;
// "End Turn" shortcut. Flag prevents repeated end turn if key is held down.
case KEY_END_TURN:
if (acceptInput && keydown && !keyState_endturn) {
if (world.model.uiSelections.isInCombat) controllers.combatController.endPlayerTurn();
}
keyState_endturn = keydown;
break;
// "Hero Info" screen shortcut. New activity takes focus, so we don't need to worry about repeats.
case KEY_HERO_INFO:
if (acceptInput && keydown) context.startActivity(new Intent(context, HeroinfoActivity.class));
break;
case KEY_TOOLBOX:
// ??? ToolboxView toolboxview = context.getApplicationContext(). findViewById(R.id.main_toolboxview);
break;
case KEY_UNHANDLED: // Unhandled keycode
return false;
default: // unhandled keymap code entry (should not happen)
L.log("onKeyboardAction(): Unhandled keyMap code constant " + keyMap.get(event.getKeyCode()) + " for keyCode " + event.getKeyCode());
return false;
}
return true;
}
public void onRelativeMovement(int dx, int dy) {
//L.log("onRelativeMovement(): dx=" + dx + " dy=" + dy + " combat: " + world.model.uiSelections.isInCombat);
if (world.model.uiSelections.isInCombat) {
if (allowInputInterval()) controllers.combatController.executeMoveAttack(dx, dy);
} else if (dx == 0 && dy == 0) {
controllers.movementController.stopMovement();
} else {
controllers.movementController.startMovement(dx, dy, null);
}
}
public void onKeyboardCancel() {
controllers.movementController.stopMovement();
}
@Override
public void onClick(View arg0) {
if (!world.model.uiSelections.isInCombat) return;
onRelativeMovement(lastTouchPosition_dx, lastTouchPosition_dy);
}
@Override
public boolean onLongClick(View arg0) {
if (world.model.uiSelections.isInCombat) {
//TODO: Should be able to mark positions far away (mapwalk / ranged combat)
if (lastTouchPosition_dx == 0 && lastTouchPosition_dy == 0) return false;
if (Math.abs(lastTouchPosition_dx) > 1) return false;
if (Math.abs(lastTouchPosition_dy) > 1) return false;
controllers.combatController.setCombatSelection(lastTouchPosition_tileCoords);
return true;
}
return false;
}
private boolean allowInputInterval() {
final long now = System.currentTimeMillis();
if ((now - lastTouchEventTime) < Constants.MINIMUM_INPUT_INTERVAL) return false;
lastTouchEventTime = now;
return true;
}
public void setDpadActive(boolean isDpadActive) {
this.isDpadActive = isDpadActive;
}
public void onTouchCancel() {
controllers.movementController.stopMovement();
}
public boolean onTouchedTile(int tile_x, int tile_y) {
lastTouchPosition_tileCoords.set(tile_x, tile_y);
lastTouchPosition_dx = tile_x - world.model.player.position.x;
lastTouchPosition_dy = tile_y - world.model.player.position.y;
if (world.model.uiSelections.isInCombat || isDpadActive) return false;
controllers.movementController.startMovement(lastTouchPosition_dx, lastTouchPosition_dy, lastTouchPosition_tileCoords);
return true;
}
}

View File

@@ -1,438 +1,446 @@
package com.gpl.rpg.AndorsTrail.controller;
import java.util.ArrayList;
import java.util.Collection;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.listeners.QuickSlotListeners;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import static java.lang.Math.min;
public final class ItemController {
private final ControllerContext controllers;
private final WorldContext world;
public final QuickSlotListeners quickSlotListeners = new QuickSlotListeners();
public ItemController(ControllerContext controllers, WorldContext world) {
this.controllers = controllers;
this.world = world;
}
public void dropItem(ItemType type, int quantity) {
if (world.model.player.inventory.getItemQuantity(type.id) < quantity) return;
world.model.player.inventory.removeItem(type.id, quantity);
world.model.currentMaps.map.itemDropped(type, quantity, world.model.player.position);
}
public void equipItem(ItemType type, Inventory.WearSlot slot) {
if (!type.isEquippable()) return;
final Player player = world.model.player;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getReequipCost());
if (!changed) return;
}
if (!player.inventory.removeItem(type.id, 1)) return;
unequipSlot(player, slot);
if (type.isTwohandWeapon()) unequipSlot(player, Inventory.WearSlot.shield);
else if (slot == Inventory.WearSlot.shield) {
ItemType currentWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (currentWeapon != null && currentWeapon.isTwohandWeapon()) unequipSlot(player, Inventory.WearSlot.weapon);
}
player.inventory.setItemTypeInWearSlot(slot, type);
controllers.actorStatsController.addConditionsFromEquippedItem(player, type);
controllers.actorStatsController.recalculatePlayerStats(player);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
}
public void unequipSlot(ItemType type, Inventory.WearSlot slot) {
if (!type.isEquippable()) return;
final Player player = world.model.player;
if (player.inventory.isEmptySlot(slot)) return;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getReequipCost());
if (!changed) return;
}
unequipSlot(player, slot);
controllers.actorStatsController.recalculatePlayerStats(player);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
}
private void unequipSlot(Player player, Inventory.WearSlot slot) {
ItemType removedItemType = player.inventory.getItemTypeInWearSlot(slot);
if (removedItemType == null) return;
player.inventory.addItem(removedItemType);
player.inventory.setItemTypeInWearSlot(slot, null);
controllers.actorStatsController.removeConditionsFromUnequippedItem(player, removedItemType);
}
public void useItem(ItemType type) {
if (!type.isUsable()) return;
final Player player = world.model.player;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getUseItemCost());
if (!changed) return;
}
if (!player.inventory.removeItem(type.id, 1)) return;
controllers.actorStatsController.applyUseEffect(player, null, type.effects_use);
world.model.statistics.addItemUsage(type);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
//TODO: provide feedback that the item has been used.
//context.mainActivity.message(androidContext.getResources().getString(R.string.inventory_item_used, type.name));
}
public void playerSteppedOnLootBag(Loot loot) {
if (pickupLootBagWithoutConfirmation(loot)) {
controllers.mapController.worldEventListeners.onPlayerPickedUpGroundLoot(loot);
pickupAll(loot);
removeLootBagIfEmpty(loot);
} else {
controllers.mapController.worldEventListeners.onPlayerSteppedOnGroundLoot(loot);
consumeNonItemLoot(loot);
}
}
public void lootMonsterBags(Collection<Loot> killedMonsterBags, int totalExpThisFight) {
if (pickupLootBagsWithoutConfirmation(killedMonsterBags)) {
controllers.mapController.worldEventListeners.onPlayerPickedUpMonsterLoot(killedMonsterBags, totalExpThisFight);
pickupAll(killedMonsterBags);
removeLootBagIfEmpty(killedMonsterBags);
controllers.gameRoundController.resume();
} else {
controllers.mapController.worldEventListeners.onPlayerFoundMonsterLoot(killedMonsterBags, totalExpThisFight);
consumeNonItemLoot(killedMonsterBags);
}
}
private boolean pickupLootBagWithoutConfirmation(Loot bag) {
if (bag.isContainer()) return false;
switch (controllers.preferences.displayLoot) {
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_ALWAYS:
return false;
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS:
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST:
if (bag.hasItems()) return false;
}
return true;
}
private boolean pickupLootBagsWithoutConfirmation(Collection<Loot> bags) {
if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_DIALOG_ALWAYS) return false;
for (Loot bag : bags) {
if (!pickupLootBagWithoutConfirmation(bag)) return false;
}
return true;
}
public void applyInventoryEffects(Player player) {
ItemType weapon = getMainWeapon(player);
if (weapon != null) {
player.attackCost = 0;
player.criticalMultiplier = weapon.effects_equip.stats.setCriticalMultiplier;
}
applyInventoryEffects(player, Inventory.WearSlot.weapon);
applyInventoryEffects(player, Inventory.WearSlot.shield);
SkillController.applySkillEffectsFromFightingStyles(player);
applyInventoryEffects(player, Inventory.WearSlot.head);
applyInventoryEffects(player, Inventory.WearSlot.body);
applyInventoryEffects(player, Inventory.WearSlot.hand);
applyInventoryEffects(player, Inventory.WearSlot.feet);
applyInventoryEffects(player, Inventory.WearSlot.neck);
applyInventoryEffects(player, Inventory.WearSlot.leftring);
applyInventoryEffects(player, Inventory.WearSlot.rightring);
SkillController.applySkillEffectsFromItemProficiencies(player);
}
public static ItemType getMainWeapon(Player player) {
ItemType itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (itemType != null) return itemType;
itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.shield);
if (itemType != null && itemType.isWeapon()) return itemType;
return null;
}
private void applyInventoryEffects(Player player, Inventory.WearSlot slot) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type == null) return;
if (slot == Inventory.WearSlot.shield) {
ItemType mainHandItem = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
// The stats for off-hand weapons will be added later in SkillController.applySkillEffectsFromFightingStyles
if (SkillController.isDualWielding(mainHandItem, type)) return;
}
if (type.effects_equip != null && type.effects_equip.stats != null) {
controllers.actorStatsController.applyAbilityEffects(player, type.effects_equip.stats, 1);
if (type.isWeapon()) {
controllers.actorStatsController.addPlayerWeaponDamage(player, type.effects_equip.stats.increaseMinDamage, type.effects_equip.stats.increaseMaxDamage);
}
}
}
public static void recalculateHitEffectsFromWornItems(Player player) {
ArrayList<ItemTraits_OnUse> effects_onHit = null;
ArrayList<ItemTraits_OnHitReceived> effects_onHitReceived = null;
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type == null) continue;
ItemTraits_OnUse eh = type.effects_hit;
ItemTraits_OnHitReceived ehr = type.effects_hitReceived;
if (eh == null && ehr == null) continue;
if (effects_onHit == null) effects_onHit = new ArrayList<ItemTraits_OnUse>();
if (eh != null) effects_onHit.add(eh);
if (effects_onHitReceived == null) effects_onHitReceived = new ArrayList<ItemTraits_OnHitReceived>();
if (ehr != null) effects_onHitReceived.add(ehr);
}
if (effects_onHit != null) {
ItemTraits_OnUse[] effects_ = new ItemTraits_OnUse[effects_onHit.size()];
effects_ = effects_onHit.toArray(effects_);
player.onHitEffects = effects_;
} else {
player.onHitEffects = null;
}
if (effects_onHitReceived != null) {
ItemTraits_OnHitReceived[] effects_ = new ItemTraits_OnHitReceived[effects_onHitReceived.size()];
effects_ = effects_onHitReceived.toArray(effects_);
player.onHitReceivedEffects = effects_;
} else {
player.onHitReceivedEffects = null;
}
}
public void consumeNonItemLoot(Loot loot) {
// Experience will be given as soon as the monster is killed.
world.model.player.inventory.gold += loot.gold;
loot.gold = 0;
removeLootBagIfEmpty(loot);
}
public void consumeNonItemLoot(Iterable<Loot> lootBags) {
for(Loot l : lootBags) {
consumeNonItemLoot(l);
}
}
public void pickupAll(Loot loot) {
world.model.player.inventory.add(loot.items);
consumeNonItemLoot(loot);
checkQuickslotItemLooted(loot.items);
loot.clear();
}
public void pickupAll(Iterable<Loot> lootBags) {
for(Loot l : lootBags) {
pickupAll(l);
}
}
public boolean removeLootBagIfEmpty(final Loot loot) {
if (loot.hasItemsOrGold()) return false;
world.model.currentMaps.map.removeGroundLoot(loot);
controllers.mapController.mapLayoutListeners.onLootBagRemoved(world.model.currentMaps.map, loot.position);
return true; // The bag was removed.
}
public boolean removeLootBagIfEmpty(final Iterable<Loot> lootBags) {
boolean isEmpty = true;
for (Loot l : lootBags) {
if (!removeLootBagIfEmpty(l)) isEmpty = false;
}
return isEmpty;
}
private static int getMarketPriceFactor(Player player) {
return Constants.MARKET_PRICEFACTOR_PERCENT
- player.getSkillLevel(SkillCollection.SkillID.barter) * SkillCollection.PER_SKILLPOINT_INCREASE_BARTER_PRICEFACTOR_PERCENTAGE;
}
public static int getBuyingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost + itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static int getSellingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost - itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static boolean canAfford(Player player, ItemType itemType) {
return player.inventory.gold >= getBuyingPrice(player, itemType);
}
public static boolean canAfford(Player player, int price) {
return player.inventory.gold >= price;
}
public static boolean maySellItem(Player player, ItemType itemType) {
if (!itemType.isSellable()) return false;
return true;
}
public static boolean sell(Player player, ItemType itemType, ItemContainer merchant, int quantity) {
int price = getSellingPrice(player, itemType) * quantity;
if (!maySellItem(player, itemType)) return false;
if (!player.inventory.removeItem(itemType.id, quantity)) return false;
player.inventory.gold += price;
merchant.addItem(itemType, quantity);
return true;
}
public static boolean buy(ModelContainer model, Player player, ItemType itemType, ItemContainer merchant, int quantity) {
int price = getBuyingPrice(player, itemType) * quantity;
if (!canAfford(player, price)) return false;
if (!merchant.removeItem(itemType.id, quantity)) return false;
player.inventory.gold -= price;
player.inventory.addItem(itemType, quantity);
model.statistics.addGoldSpent(price);
return true;
}
public static String describeItemForListView(ItemEntry item, Player player) {
StringBuilder sb = new StringBuilder(item.itemType.getName(player));
if (item.quantity > 1) {
sb.append(" (");
sb.append(item.quantity);
sb.append(')');
}
if (item.itemType.effects_equip != null) {
AbilityModifierTraits t = item.itemType.effects_equip.stats;
if (t != null) {
if (t.increaseAttackChance != 0
|| t.increaseMinDamage != 0
|| t.increaseMaxDamage != 0
|| t.increaseCriticalSkill != 0
|| t.setCriticalMultiplier != 0) {
sb.append(" [");
describeAttackEffect(t.increaseAttackChance, t.increaseMinDamage, t.increaseMaxDamage, t.increaseCriticalSkill, t.setCriticalMultiplier, sb);
sb.append(']');
}
if (t.increaseBlockChance != 0
|| t.increaseDamageResistance != 0) {
sb.append(" [");
describeBlockEffect(t.increaseBlockChance, t.increaseDamageResistance, sb);
sb.append(']');
}
}
}
return sb.toString();
}
public static void describeAttackEffect(int attackChance, int minDamage, int maxDamage, int criticalSkill, float criticalMultiplier, StringBuilder sb) {
boolean addSpace = false;
if (attackChance != 0) {
sb.append(attackChance);
addSpace = true;
}
if (minDamage != 0 || maxDamage != 0) {
if (addSpace) sb.append(' ');
sb.append(minDamage);
if (minDamage != maxDamage) {
sb.append('-');
sb.append(maxDamage);
}
addSpace = true;
}
if (criticalSkill != 0) {
if (addSpace) sb.append(' ');
if (criticalSkill >= 0) {
sb.append('+');
}
sb.append(criticalSkill);
}
if (criticalMultiplier != 0 && criticalMultiplier != 1) {
sb.append('x');
sb.append(criticalMultiplier);
}
}
public static void describeBlockEffect(int blockChance, int damageResistance, StringBuilder sb) {
if (blockChance != 0) {
sb.append(blockChance);
}
if (damageResistance != 0) {
sb.append('/');
sb.append(damageResistance);
}
}
public void quickitemUse(int quickSlotId) {
useItem(world.model.player.inventory.quickitem[quickSlotId]);
quickSlotListeners.onQuickSlotUsed(quickSlotId);
}
public void setQuickItem(ItemType itemType, int quickSlotId) {
world.model.player.inventory.quickitem[quickSlotId] = itemType;
quickSlotListeners.onQuickSlotChanged(quickSlotId);
}
private void checkQuickslotItemLooted(ItemContainer items) {
for (ItemEntry item : items.items) {
if (item.itemType.isUsable()) {
for (int i = 0; i < world.model.player.inventory.quickitem.length; i++) {
if (item.itemType == world.model.player.inventory.quickitem[i]) {
quickSlotListeners.onQuickSlotChanged(i);
}
}
}
}
}
public int removeEquippedItem(String itemTypeID, int count) {
int removed = 0;
final Player player = world.model.player;
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type != null && type.id.equals(itemTypeID)) {
player.inventory.setItemTypeInWearSlot(slot, null);
controllers.actorStatsController.removeConditionsFromUnequippedItem(player, type);
controllers.actorStatsController.recalculatePlayerStats(player);
removed++;
if (removed >= count) {
break;
}
}
}
return removed;
}
public static void applyDamageModifier(Player player) {
ItemType itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
int modifier1 = -1;
int modifier2 = -1;
if (itemType != null) modifier1 = itemType.effects_equip.stats.setNonWeaponDamageModifier;
itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.shield);
if (itemType != null && itemType.isWeapon()) modifier2 = itemType.effects_equip.stats.setNonWeaponDamageModifier;
int modifier = 100;
if (modifier1 >= 0 && modifier2 >= 0) modifier = Math.min(modifier1, modifier2);
else if (modifier1 <= 0 && modifier2 >= 0) modifier = modifier2;
else if (modifier2 <= 0 && modifier1 >= 0) modifier = modifier1;
if (modifier != 100) {
final int minBaseDamage = player.damagePotential.current - player.weaponDamage.current;
final int maxBaseDamage = player.damagePotential.max - player.weaponDamage.max;
player.damagePotential.add(Math.round(minBaseDamage * ((modifier - 100)/100f)), true);
player.damagePotential.addToMax(Math.round(maxBaseDamage * ((modifier - 100)/100f)));
}
}
}
package com.gpl.rpg.AndorsTrail.controller;
import java.util.ArrayList;
import java.util.Collection;
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.controller.listeners.QuickSlotListeners;
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
import com.gpl.rpg.AndorsTrail.model.ability.SkillCollection;
import com.gpl.rpg.AndorsTrail.model.ability.traits.AbilityModifierTraits;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.item.Inventory;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer;
import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnHitReceived;
import com.gpl.rpg.AndorsTrail.model.item.ItemTraits_OnUse;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.item.Loot;
import static java.lang.Math.min;
public final class ItemController {
private final ControllerContext controllers;
private final WorldContext world;
public final QuickSlotListeners quickSlotListeners = new QuickSlotListeners();
public ItemController(ControllerContext controllers, WorldContext world) {
this.controllers = controllers;
this.world = world;
}
public void dropItem(ItemType type, int quantity) {
if (world.model.player.inventory.getItemQuantity(type.id) < quantity) return;
world.model.player.inventory.removeItem(type.id, quantity);
world.model.currentMaps.map.itemDropped(type, quantity, world.model.player.position);
}
public void equipItem(ItemType type, Inventory.WearSlot slot) {
if (!type.isEquippable()) return;
final Player player = world.model.player;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getReequipCost());
if (!changed) return;
}
if (!player.inventory.removeItem(type.id, 1)) return;
unequipSlot(player, slot);
if (type.isTwohandWeapon()) unequipSlot(player, Inventory.WearSlot.shield);
else if (slot == Inventory.WearSlot.shield) {
ItemType currentWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (currentWeapon != null && currentWeapon.isTwohandWeapon()) unequipSlot(player, Inventory.WearSlot.weapon);
}
player.inventory.setItemTypeInWearSlot(slot, type);
controllers.actorStatsController.addConditionsFromEquippedItem(player, type);
controllers.actorStatsController.recalculatePlayerStats(player);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
}
public void unequipSlot(ItemType type, Inventory.WearSlot slot) {
if (!type.isEquippable()) return;
final Player player = world.model.player;
if (player.inventory.isEmptySlot(slot)) return;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getReequipCost());
if (!changed) return;
}
unequipSlot(player, slot);
controllers.actorStatsController.recalculatePlayerStats(player);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
}
private void unequipSlot(Player player, Inventory.WearSlot slot) {
ItemType removedItemType = player.inventory.getItemTypeInWearSlot(slot);
if (removedItemType == null) return;
player.inventory.addItem(removedItemType);
player.inventory.setItemTypeInWearSlot(slot, null);
controllers.actorStatsController.removeConditionsFromUnequippedItem(player, removedItemType);
}
public void useItem(ItemType type) {
if (!type.isUsable()) return;
final Player player = world.model.player;
if (world.model.uiSelections.isInCombat) {
boolean changed = controllers.actorStatsController.useAPs(player, player.getUseItemCost());
if (!changed) return;
}
if (!player.inventory.removeItem(type.id, 1)) return;
world.model.combatLog.append(controllers.getResources().getString(R.string.inventory_item_used, type.getName(player)));
controllers.actorStatsController.applyUseEffect(player, null, type.effects_use);
world.model.statistics.addItemUsage(type);
if (world.model.uiSelections.isInCombat && !controllers.combatController.playerHasApLeft()) {
controllers.combatController.endPlayerTurn();
}
}
public void playerSteppedOnLootBag(Loot loot) {
if (pickupLootBagWithoutConfirmation(loot)) {
controllers.mapController.worldEventListeners.onPlayerPickedUpGroundLoot(loot);
pickupAll(loot);
removeLootBagIfEmpty(loot);
} else {
controllers.mapController.worldEventListeners.onPlayerSteppedOnGroundLoot(loot);
consumeNonItemLoot(loot);
}
}
public void lootMonsterBags(Collection<Loot> killedMonsterBags, int totalExpThisFight) {
if (pickupLootBagsWithoutConfirmation(killedMonsterBags)) {
controllers.mapController.worldEventListeners.onPlayerPickedUpMonsterLoot(killedMonsterBags, totalExpThisFight);
pickupAll(killedMonsterBags);
removeLootBagIfEmpty(killedMonsterBags);
controllers.gameRoundController.resume();
} else {
controllers.mapController.worldEventListeners.onPlayerFoundMonsterLoot(killedMonsterBags, totalExpThisFight);
consumeNonItemLoot(killedMonsterBags);
}
}
private boolean pickupLootBagWithoutConfirmation(Loot bag) {
if (bag.isContainer()) return false;
switch (controllers.preferences.displayLoot) {
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_ALWAYS:
return false;
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS:
case AndorsTrailPreferences.DISPLAYLOOT_DIALOG_FOR_ITEMS_ELSE_TOAST:
if (bag.hasItems()) return false;
}
return true;
}
private boolean pickupLootBagsWithoutConfirmation(Collection<Loot> bags) {
if (controllers.preferences.displayLoot == AndorsTrailPreferences.DISPLAYLOOT_DIALOG_ALWAYS) return false;
for (Loot bag : bags) {
if (!pickupLootBagWithoutConfirmation(bag)) return false;
}
return true;
}
public void applyInventoryEffects(Player player) {
ItemType weapon = getMainWeapon(player);
if (weapon != null) {
player.attackCost = 0;
player.criticalMultiplier = weapon.effects_equip.stats.setCriticalMultiplier;
}
applyInventoryEffects(player, Inventory.WearSlot.weapon);
applyInventoryEffects(player, Inventory.WearSlot.shield);
SkillController.applySkillEffectsFromFightingStyles(player);
applyInventoryEffects(player, Inventory.WearSlot.head);
applyInventoryEffects(player, Inventory.WearSlot.body);
applyInventoryEffects(player, Inventory.WearSlot.hand);
applyInventoryEffects(player, Inventory.WearSlot.feet);
applyInventoryEffects(player, Inventory.WearSlot.neck);
applyInventoryEffects(player, Inventory.WearSlot.leftring);
applyInventoryEffects(player, Inventory.WearSlot.rightring);
SkillController.applySkillEffectsFromItemProficiencies(player);
}
public static ItemType getMainWeapon(Player player) {
ItemType itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
if (itemType != null) return itemType;
itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.shield);
if (itemType != null && itemType.isWeapon()) return itemType;
return null;
}
private void applyInventoryEffects(Player player, Inventory.WearSlot slot) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type == null) return;
if (slot == Inventory.WearSlot.shield) {
ItemType mainHandItem = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
// The stats for off-hand weapons will be added later in SkillController.applySkillEffectsFromFightingStyles
if (SkillController.isDualWielding(mainHandItem, type)) return;
}
if (type.effects_equip != null && type.effects_equip.stats != null) {
controllers.actorStatsController.applyAbilityEffects(player, type.effects_equip.stats, 1);
if (type.isWeapon()) {
controllers.actorStatsController.addPlayerWeaponDamage(player, type.effects_equip.stats.increaseMinDamage, type.effects_equip.stats.increaseMaxDamage);
}
}
}
public static void recalculateHitEffectsFromWornItems(Player player) {
ArrayList<ItemTraits_OnUse> effects_onHit = null;
ArrayList<ItemTraits_OnHitReceived> effects_onHitReceived = null;
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type == null) continue;
ItemTraits_OnUse eh = type.effects_hit;
ItemTraits_OnHitReceived ehr = type.effects_hitReceived;
if (eh == null && ehr == null) continue;
if (effects_onHit == null) effects_onHit = new ArrayList<ItemTraits_OnUse>();
if (eh != null) effects_onHit.add(eh);
if (effects_onHitReceived == null) effects_onHitReceived = new ArrayList<ItemTraits_OnHitReceived>();
if (ehr != null) effects_onHitReceived.add(ehr);
}
if (effects_onHit != null) {
ItemTraits_OnUse[] effects_ = new ItemTraits_OnUse[effects_onHit.size()];
effects_ = effects_onHit.toArray(effects_);
player.onHitEffects = effects_;
} else {
player.onHitEffects = null;
}
if (effects_onHitReceived != null) {
ItemTraits_OnHitReceived[] effects_ = new ItemTraits_OnHitReceived[effects_onHitReceived.size()];
effects_ = effects_onHitReceived.toArray(effects_);
player.onHitReceivedEffects = effects_;
} else {
player.onHitReceivedEffects = null;
}
}
public void consumeNonItemLoot(Loot loot) {
// Experience will be given as soon as the monster is killed.
world.model.player.inventory.gold += loot.gold;
loot.gold = 0;
removeLootBagIfEmpty(loot);
}
public void consumeNonItemLoot(Iterable<Loot> lootBags) {
for(Loot l : lootBags) {
consumeNonItemLoot(l);
}
}
public void pickupAll(Loot loot) {
world.model.player.inventory.add(loot.items);
consumeNonItemLoot(loot);
checkQuickslotItemLooted(loot.items);
loot.clear();
}
public void pickupAll(Iterable<Loot> lootBags) {
for(Loot l : lootBags) {
pickupAll(l);
}
}
public boolean removeLootBagIfEmpty(final Loot loot) {
if (loot.hasItemsOrGold()) return false;
world.model.currentMaps.map.removeGroundLoot(loot);
controllers.mapController.mapLayoutListeners.onLootBagRemoved(world.model.currentMaps.map, loot.position);
return true; // The bag was removed.
}
public boolean removeLootBagIfEmpty(final Iterable<Loot> lootBags) {
boolean isEmpty = true;
for (Loot l : lootBags) {
if (!removeLootBagIfEmpty(l)) isEmpty = false;
}
return isEmpty;
}
private static int getMarketPriceFactor(Player player) {
return Constants.MARKET_PRICEFACTOR_PERCENT
- player.getSkillLevel(SkillCollection.SkillID.barter) * SkillCollection.PER_SKILLPOINT_INCREASE_BARTER_PRICEFACTOR_PERCENTAGE;
}
public static int getBuyingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost + itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static int getSellingPrice(Player player, ItemType itemType) {
return itemType.baseMarketCost - itemType.baseMarketCost * getMarketPriceFactor(player) / 100;
}
public static boolean canAfford(Player player, ItemType itemType) {
return player.inventory.gold >= getBuyingPrice(player, itemType);
}
public static boolean canAfford(Player player, int price) {
return player.inventory.gold >= price;
}
public static boolean maySellItem(Player player, ItemType itemType) {
if (!itemType.isSellable()) return false;
return true;
}
public static boolean sell(Player player, ItemType itemType, ItemContainer merchant, int quantity) {
int price = getSellingPrice(player, itemType) * quantity;
if (!maySellItem(player, itemType)) return false;
if (!player.inventory.removeItem(itemType.id, quantity)) return false;
player.inventory.gold += price;
merchant.addItem(itemType, quantity);
return true;
}
public static boolean buy(ModelContainer model, Player player, ItemType itemType, ItemContainer merchant, int quantity) {
int price = getBuyingPrice(player, itemType) * quantity;
if (!canAfford(player, price)) return false;
if (!merchant.removeItem(itemType.id, quantity)) return false;
player.inventory.gold -= price;
player.inventory.addItem(itemType, quantity);
model.statistics.addGoldSpent(price);
return true;
}
public static String describeItemForListView(ItemEntry item, Player player) {
StringBuilder sb = new StringBuilder(item.itemType.getName(player));
if (item.quantity > 1) {
sb.append(" (");
sb.append(item.quantity);
sb.append(')');
}
if (item.itemType.effects_equip != null) {
AbilityModifierTraits t = item.itemType.effects_equip.stats;
if (t != null) {
if (t.increaseAttackChance != 0
|| t.increaseMinDamage != 0
|| t.increaseMaxDamage != 0
|| t.increaseCriticalSkill != 0
|| t.setCriticalMultiplier != 0) {
sb.append(" [");
describeAttackEffect(t.increaseAttackChance, t.increaseMinDamage, t.increaseMaxDamage, t.increaseCriticalSkill, t.setCriticalMultiplier, sb);
sb.append(']');
}
if (t.increaseBlockChance != 0
|| t.increaseDamageResistance != 0) {
sb.append(" [");
describeBlockEffect(t.increaseBlockChance, t.increaseDamageResistance, sb);
sb.append(']');
}
}
}
return sb.toString();
}
public static void describeAttackEffect(int attackChance, int minDamage, int maxDamage, int criticalSkill, float criticalMultiplier, StringBuilder sb) {
boolean addSpace = false;
if (attackChance != 0) {
sb.append(attackChance);
addSpace = true;
}
if (minDamage != 0 || maxDamage != 0) {
if (addSpace) sb.append(' ');
sb.append(minDamage);
if (minDamage != maxDamage) {
sb.append('-');
sb.append(maxDamage);
}
addSpace = true;
}
if (criticalSkill != 0) {
if (addSpace) sb.append(' ');
if (criticalSkill >= 0) {
sb.append('+');
}
sb.append(criticalSkill);
}
if (criticalMultiplier != 0 && criticalMultiplier != 1) {
sb.append('x');
sb.append(criticalMultiplier);
}
}
public static void describeBlockEffect(int blockChance, int damageResistance, StringBuilder sb) {
if (blockChance != 0) {
sb.append(blockChance);
}
if (damageResistance != 0) {
sb.append('/');
sb.append(damageResistance);
}
}
public void quickitemUse(int quickSlotId) {
useItem(world.model.player.inventory.quickitem[quickSlotId]);
quickSlotListeners.onQuickSlotUsed(quickSlotId);
}
public void setQuickItem(ItemType itemType, int quickSlotId) {
world.model.player.inventory.quickitem[quickSlotId] = itemType;
quickSlotListeners.onQuickSlotChanged(quickSlotId);
}
private void checkQuickslotItemLooted(ItemContainer items) {
for (ItemEntry item : items.items) {
if (item.itemType.isUsable()) {
for (int i = 0; i < world.model.player.inventory.quickitem.length; i++) {
if (item.itemType == world.model.player.inventory.quickitem[i]) {
quickSlotListeners.onQuickSlotChanged(i);
}
}
}
}
}
public int removeEquippedItem(String itemTypeID, int count) {
int removed = 0;
final Player player = world.model.player;
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
ItemType type = player.inventory.getItemTypeInWearSlot(slot);
if (type != null && type.id.equals(itemTypeID)) {
player.inventory.setItemTypeInWearSlot(slot, null);
controllers.actorStatsController.removeConditionsFromUnequippedItem(player, type);
controllers.actorStatsController.recalculatePlayerStats(player);
removed++;
if (removed >= count) {
break;
}
}
}
return removed;
}
public static void applyDamageModifier(Player player) {
ItemType itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon);
int modifier1 = -1;
int modifier2 = -1;
if (itemType != null) modifier1 = itemType.effects_equip.stats.setNonWeaponDamageModifier;
itemType = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.shield);
if (itemType != null && itemType.isWeapon()) modifier2 = itemType.effects_equip.stats.setNonWeaponDamageModifier;
int modifier = 100;
if (modifier1 >= 0 && modifier2 >= 0) {
int skillLevelFightStyle = player.getSkillLevel(SkillCollection.SkillID.fightstyleDualWield);
if (skillLevelFightStyle == 2) {
modifier = Math.max(modifier1, modifier2);
} else if (skillLevelFightStyle == 1) {
modifier = (modifier1 + modifier2) / 2;
} else {
modifier = Math.min(modifier1, modifier2);
}
}
else if (modifier1 <= 0 && modifier2 >= 0) modifier = modifier2;
else if (modifier2 <= 0 && modifier1 >= 0) modifier = modifier1;
if (modifier != 100) {
final int minBaseDamage = player.damagePotential.current - player.weaponDamage.current;
final int maxBaseDamage = player.damagePotential.max - player.weaponDamage.max;
player.damagePotential.add(Math.round(minBaseDamage * ((modifier - 100)/100f)), true);
player.damagePotential.addToMax(Math.round(maxBaseDamage * ((modifier - 100)/100f)));
}
}
}

View File

@@ -149,6 +149,7 @@ public final class MapController {
controllers.monsterSpawnController.spawnAll(world.model.currentMaps.map, world.model.currentMaps.tileMap);
world.model.worldData.tickWorldTime(20);
controllers.gameRoundController.resetRoundTimers();
mapScriptExecutor.proceedToPhrase(controllers.getResources(), Constants.PASSIVE_ACHIEVEMENT_CHECK_PHRASE, true, true);
}
public void rest(MapObject area) {
@@ -180,7 +181,7 @@ public final class MapController {
world.maps.worldMapRequiresUpdate = true;
if (!updateWorldmap) return;
WorldMapController.updateWorldMap(world, res);
WorldMapController.updateWorldMap(controllers.getContext(), world, res);
mapLayoutListeners.onMapTilesChanged(world.model.currentMaps.map, world.model.currentMaps.tileMap);
}

View File

@@ -75,6 +75,9 @@ public final class MonsterMovementController implements EvaluateWalkable {
}
private void moveMonster(final Monster m, final MonsterSpawnArea area) {
if (m.getMoveCost() == Constants.MONSTER_IMMOBILE_MOVE_COST) {
return;
}
PredefinedMap map = world.model.currentMaps.map;
LayeredTileMap tileMap = world.model.currentMaps.tileMap;
m.nextActionTime = System.currentTimeMillis() + getMillisecondsPerMove(m);

View File

@@ -128,7 +128,7 @@ public final class MovementController implements TimedMessageTask.Callback {
moveBlockedActors(newMap, model.currentMaps.tileMap);
refreshMonsterAggressiveness(newMap, model.player);
controllers.effectController.updateSplatters(newMap);
WorldMapController.updateWorldMap(world, res);
WorldMapController.updateWorldMap(controllers.getContext(), world, res);
}
private boolean mayMovePlayer() {

View File

@@ -72,7 +72,7 @@ public final class SkillController {
if (player == null) return 0;
if (!ItemTypeCollection.isGoldItemType(item.itemType.id)) return 0;
return getRollBias(item, player, SkillID.coinfinder, SkillCollection.PER_SKILLPOINT_INCREASE_COINFINDER_QUANTITY_PERCENT);
return getRollBias(item.quantity, player, SkillID.coinfinder, SkillCollection.PER_SKILLPOINT_INCREASE_COINFINDER_QUANTITY_PERCENT);
}
private static int getRollBias(DropItem item, Player player, SkillID skill, int perSkillpointIncrease) {
@@ -82,7 +82,7 @@ public final class SkillController {
private static int getRollBias(ConstRange chance, Player player, SkillID skill, int perSkillpointIncrease) {
int skillLevel = player.getSkillLevel(skill);
if (skillLevel <= 0) return 0;
return chance.current * skillLevel * perSkillpointIncrease / 100;
return chance.current * skillLevel * perSkillpointIncrease;
}
@@ -126,6 +126,9 @@ public final class SkillController {
int result = 0;
result += getActorConditionEffectChanceRollBiasFromResistanceSkills(effect, player);
result += getActorConditionEffectChanceRollBias(effect, player, SkillID.shadowBless, SkillCollection.PER_SKILLPOINT_INCREASE_RESISTANCE_SHADOW_BLESS);
if ("spore_poison".equals(effect.conditionType.conditionTypeID)) {
result += getActorConditionEffectChanceRollBias(effect, player, SkillID.sporeImmunity, 100);
}
return result;
}

View File

@@ -1,318 +1,317 @@
package com.gpl.rpg.AndorsTrail.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.os.Environment;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.DisplayWorldMapActivity;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
import com.gpl.rpg.AndorsTrail.model.map.MapLayer;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.NamedWorldMapArea;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.WorldMapSegmentMap;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.CoordRect;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Size;
public final class WorldMapController {
private static final int WORLDMAP_SCREENSHOT_TILESIZE = 8;
public static final int WORLDMAP_DISPLAY_TILESIZE = WORLDMAP_SCREENSHOT_TILESIZE;
public static void updateWorldMap(final WorldContext world, final Resources res) {
updateWorldMap(world, world.model.currentMaps.map, world.model.currentMaps.tileMap, world.model.currentMaps.tiles, res);
}
private static void updateWorldMap(
final WorldContext world,
final PredefinedMap map,
final LayeredTileMap mapTiles,
final TileCollection cachedTiles,
final Resources res) {
final String worldMapSegmentName = world.maps.getWorldMapSegmentNameForMap(map.name);
if (worldMapSegmentName == null) return;
if (!shouldUpdateWorldMap(map, worldMapSegmentName, world.maps.worldMapRequiresUpdate)) return;
(new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
final MapRenderer renderer = new MapRenderer(world, map, mapTiles, cachedTiles);
try {
updateCachedBitmap(map, renderer);
updateWorldMapSegment(res, world, worldMapSegmentName);
world.maps.worldMapRequiresUpdate = false;
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) {
L.log("WorldMapController: Updated worldmap segment " + worldMapSegmentName + " for map " + map.name);
}
} catch (IOException e) {
L.log("Error creating worldmap file for map " + map.name + " : " + e.toString());
}
return null;
}
}).execute();
}
private static boolean shouldUpdateWorldMap(PredefinedMap map, String worldMapSegmentName, boolean forceUpdate) {
if (forceUpdate) return true;
if (!map.visited) return true;
File file = getFileForMap(map, false);
if (!file.exists()) return true;
file = getCombinedWorldMapFile(worldMapSegmentName);
if (!file.exists()) return true;
return false;
}
private static void updateCachedBitmap(PredefinedMap map, MapRenderer renderer) throws IOException {
ensureWorldmapDirectoryExists();
File file = getFileForMap(map, false);
if (file.exists()) return;
Bitmap image = renderer.drawMap();
FileOutputStream fos = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.PNG, 70, fos);
fos.flush();
fos.close();
image.recycle();
L.log("WorldMapController: Wrote " + file.getAbsolutePath());
}
private static final class MapRenderer {
private final PredefinedMap map;
private final LayeredTileMap mapTiles;
private final TileCollection cachedTiles;
private final int tileSize;
private final float scale;
private final Paint mPaint = new Paint();
public MapRenderer(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles) {
this.map = map;
this.mapTiles = mapTiles;
this.cachedTiles = cachedTiles;
this.tileSize = world.tileManager.tileSize;
this.scale = (float) WORLDMAP_SCREENSHOT_TILESIZE / world.tileManager.tileSize;
mapTiles.setColorFilter(mPaint, null, true);
}
public Bitmap drawMap() {
Bitmap image = Bitmap.createBitmap(map.size.width * WORLDMAP_SCREENSHOT_TILESIZE, map.size.height * WORLDMAP_SCREENSHOT_TILESIZE, Config.RGB_565);
image.setDensity(Bitmap.DENSITY_NONE);
Canvas canvas = new Canvas(image);
canvas.scale(scale, scale);
synchronized (cachedTiles) {
drawMapLayer(canvas, mapTiles.currentLayout.layerGround);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerObjects);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerAbove);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerTop);
}
return image;
}
private void tryDrawMapLayer(Canvas canvas, final MapLayer layer) {
if (layer != null) drawMapLayer(canvas, layer);
}
private void drawMapLayer(Canvas canvas, final MapLayer layer) {
int py = 0;
for (int y = 0; y < map.size.height; ++y, py += tileSize) {
int px = 0;
for (int x = 0; x < map.size.width; ++x, px += tileSize) {
final int tile = layer.tiles[x][y];
if (tile == 0) continue;
cachedTiles.drawTile(canvas, tile, px, py, mPaint);
}
}
}
}
private static void ensureWorldmapDirectoryExists() throws IOException {
File root = Environment.getExternalStorageDirectory();
File dir = new File(root, Constants.FILENAME_SAVEGAME_DIRECTORY);
if (!dir.exists()) dir.mkdir();
dir = new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
if (!dir.exists()) dir.mkdir();
File noMediaFile = new File(dir, ".nomedia");
if (!noMediaFile.exists()) noMediaFile.createNewFile();
}
public static boolean fileForMapExists(PredefinedMap map) {
if (map.lastSeenLayoutHash.length() > 0) {
return getPngFile(map.name + '.' + map.lastSeenLayoutHash).exists();
}
return getPngFile(map.name).exists();
}
private static File getFileForMap(PredefinedMap map, boolean verifyFileExists) {
if (map.lastSeenLayoutHash.length() > 0) {
File fileWithHash = getPngFile(map.name + '.' + map.lastSeenLayoutHash);
if (!verifyFileExists) return fileWithHash;
else if (fileWithHash.exists()) return fileWithHash;
}
return getPngFile(map.name);
}
private static File getPngFile(String fileName) {
return new File(getWorldmapDirectory(), fileName + ".png");
}
private static File getWorldmapDirectory() {
File dir = Environment.getExternalStorageDirectory();
dir = new File(dir, Constants.FILENAME_SAVEGAME_DIRECTORY);
return new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
}
public static File getCombinedWorldMapFile(String segmentName) {
return new File(getWorldmapDirectory(), Constants.FILENAME_WORLDMAP_HTMLFILE_PREFIX + segmentName + Constants.FILENAME_WORLDMAP_HTMLFILE_SUFFIX);
}
private static String getWorldMapSegmentAsHtml(Resources res, WorldContext world, String segmentName) {
WorldMapSegment segment = world.maps.worldMapSegments.get(segmentName);
Map<String, File> displayedMapFilenamesPerMapName = new HashMap<String, File>(segment.maps.size());
Coord offsetWorldmapTo = new Coord(999999, 999999);
for (WorldMapSegmentMap map : segment.maps.values()) {
PredefinedMap predefinedMap = world.maps.findPredefinedMap(map.mapName);
if (predefinedMap == null) continue;
if (!predefinedMap.visited) continue;
File f = WorldMapController.getFileForMap(predefinedMap, true);
if (!f.exists()) continue;
displayedMapFilenamesPerMapName.put(map.mapName, f);
offsetWorldmapTo.x = Math.min(offsetWorldmapTo.x, map.worldPosition.x);
offsetWorldmapTo.y = Math.min(offsetWorldmapTo.y, map.worldPosition.y);
}
Coord bottomRight = new Coord(0, 0);
StringBuilder mapsAsHtml = new StringBuilder(1000);
for (WorldMapSegmentMap segmentMap : segment.maps.values()) {
File f = displayedMapFilenamesPerMapName.get(segmentMap.mapName);
if (f == null) continue;
Size size = getMapSize(segmentMap, world);
mapsAsHtml
.append("<img src=\"")
.append(f.getName())
.append("\" id=\"")
.append(segmentMap.mapName)
.append("\" style=\"width:")
.append(size.width * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; height:")
.append(size.height * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; left:")
.append((segmentMap.worldPosition.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; top:")
.append((segmentMap.worldPosition.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px;\" />");
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) mapsAsHtml.append('\n');
bottomRight.x = Math.max(bottomRight.x, segmentMap.worldPosition.x + size.width);
bottomRight.y = Math.max(bottomRight.y, segmentMap.worldPosition.y + size.height);
}
Size worldmapSegmentSize = new Size(
(bottomRight.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
,(bottomRight.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
);
StringBuilder namedAreasAsHtml = new StringBuilder(500);
for (NamedWorldMapArea area : segment.namedAreas.values()) {
CoordRect r = determineNamedAreaBoundary(area, segment, world, displayedMapFilenamesPerMapName.keySet());
if (r == null) continue;
namedAreasAsHtml
.append("<div class=\"namedarea ")
.append(area.type)
.append("\" style=\"width:")
.append(r.size.width * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; line-height:")
.append(r.size.height * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; left:")
.append((r.topLeft.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; top:")
.append((r.topLeft.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px;\"><span>")
.append(area.name)
.append("</span></div>");
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) namedAreasAsHtml.append('\n');
}
return res.getString(R.string.worldmap_template)
.replace("{{maps}}", mapsAsHtml.toString())
.replace("{{areas}}", namedAreasAsHtml.toString())
.replace("{{sizex}}", Integer.toString(worldmapSegmentSize.width))
.replace("{{sizey}}", Integer.toString(worldmapSegmentSize.height))
.replace("{{offsetx}}", Integer.toString(offsetWorldmapTo.x * WorldMapController.WORLDMAP_DISPLAY_TILESIZE))
.replace("{{offsety}}", Integer.toString(offsetWorldmapTo.y * WorldMapController.WORLDMAP_DISPLAY_TILESIZE));
}
private static Size getMapSize(WorldMapSegmentMap map, WorldContext world) {
return world.maps.findPredefinedMap(map.mapName).size;
}
private static CoordRect determineNamedAreaBoundary(NamedWorldMapArea area, WorldMapSegment segment, WorldContext world, Set<String> displayedMapNames) {
Coord topLeft = null;
Coord bottomRight = null;
for (String mapName : area.mapNames) {
if (!displayedMapNames.contains(mapName)) continue;
WorldMapSegmentMap map = segment.maps.get(mapName);
Size size = getMapSize(map, world);
if (topLeft == null) {
topLeft = new Coord(map.worldPosition);
} else {
topLeft.x = Math.min(topLeft.x, map.worldPosition.x);
topLeft.y = Math.min(topLeft.y, map.worldPosition.y);
}
if (bottomRight == null) {
bottomRight = new Coord(map.worldPosition.x + size.width, map.worldPosition.y + size.height);
} else {
bottomRight.x = Math.max(bottomRight.x, map.worldPosition.x + size.width);
bottomRight.y = Math.max(bottomRight.y, map.worldPosition.y + size.height);
}
}
if (topLeft == null) return null;
return new CoordRect(topLeft, new Size(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y));
}
public static void updateWorldMapSegment(Resources res, WorldContext world, String segmentName) throws IOException {
String mapAsHtml = getWorldMapSegmentAsHtml(res, world, segmentName);
File outputFile = getCombinedWorldMapFile(segmentName);
PrintWriter pw = new PrintWriter(outputFile);
pw.write(mapAsHtml);
pw.close();
}
public static boolean displayWorldMap(Context context, WorldContext world) {
String worldMapSegmentName = world.maps.getWorldMapSegmentNameForMap(world.model.currentMaps.map.name);
if (worldMapSegmentName == null) {
Toast.makeText(context, context.getResources().getString(R.string.display_worldmap_not_available), Toast.LENGTH_LONG).show();
return false;
}
Intent intent = new Intent(context, DisplayWorldMapActivity.class);
intent.putExtra("worldMapSegmentName", worldMapSegmentName);
context.startActivity(intent);
return true;
}
}
package com.gpl.rpg.AndorsTrail.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.AsyncTask;
import android.widget.Toast;
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
import com.gpl.rpg.AndorsTrail.R;
import com.gpl.rpg.AndorsTrail.activity.DisplayWorldMapActivity;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
import com.gpl.rpg.AndorsTrail.model.map.MapLayer;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.NamedWorldMapArea;
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.WorldMapSegmentMap;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
import com.gpl.rpg.AndorsTrail.util.Coord;
import com.gpl.rpg.AndorsTrail.util.CoordRect;
import com.gpl.rpg.AndorsTrail.util.L;
import com.gpl.rpg.AndorsTrail.util.Size;
public final class WorldMapController {
private static final int WORLDMAP_SCREENSHOT_TILESIZE = 8;
public static final int WORLDMAP_DISPLAY_TILESIZE = WORLDMAP_SCREENSHOT_TILESIZE;
public static void updateWorldMap(Context context, final WorldContext world, final Resources res) {
updateWorldMap(context, world, world.model.currentMaps.map, world.model.currentMaps.tileMap, world.model.currentMaps.tiles, res);
}
private static void updateWorldMap(
Context context, final WorldContext world,
final PredefinedMap map,
final LayeredTileMap mapTiles,
final TileCollection cachedTiles,
final Resources res) {
final String worldMapSegmentName = world.maps.getWorldMapSegmentNameForMap(map.name);
if (worldMapSegmentName == null) return;
if (!shouldUpdateWorldMap(context, map, worldMapSegmentName, world.maps.worldMapRequiresUpdate)) return;
(new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
final MapRenderer renderer = new MapRenderer(world, map, mapTiles, cachedTiles);
try {
updateCachedBitmap(context, map, renderer);
updateWorldMapSegment(context, res, world, worldMapSegmentName);
world.maps.worldMapRequiresUpdate = false;
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) {
L.log("WorldMapController: Updated worldmap segment " + worldMapSegmentName + " for map " + map.name);
}
} catch (IOException e) {
L.log("Error creating worldmap file for map " + map.name + " : " + e.toString());
}
return null;
}
}).execute();
}
private static boolean shouldUpdateWorldMap(Context context, PredefinedMap map, String worldMapSegmentName, boolean forceUpdate) {
if (forceUpdate) return true;
if (!map.visited) return true;
File file = getFileForMap(context, map, false);
if (!file.exists()) return true;
file = getCombinedWorldMapFile(context, worldMapSegmentName);
if (!file.exists()) return true;
return false;
}
private static void updateCachedBitmap(Context context, PredefinedMap map, MapRenderer renderer) throws IOException {
ensureWorldmapDirectoryExists(context);
File file = getFileForMap(context, map, false);
if (file.exists()) return;
Bitmap image = renderer.drawMap();
FileOutputStream fos = new FileOutputStream(file);
image.compress(Bitmap.CompressFormat.PNG, 70, fos);
fos.flush();
fos.close();
image.recycle();
L.log("WorldMapController: Wrote " + file.getAbsolutePath());
}
private static final class MapRenderer {
private final PredefinedMap map;
private final LayeredTileMap mapTiles;
private final TileCollection cachedTiles;
private final int tileSize;
private final float scale;
private final Paint mPaint = new Paint();
public MapRenderer(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles) {
this.map = map;
this.mapTiles = mapTiles;
this.cachedTiles = cachedTiles;
this.tileSize = world.tileManager.tileSize;
this.scale = (float) WORLDMAP_SCREENSHOT_TILESIZE / world.tileManager.tileSize;
mapTiles.setColorFilter(mPaint, null, true);
}
public Bitmap drawMap() {
Bitmap image = Bitmap.createBitmap(map.size.width * WORLDMAP_SCREENSHOT_TILESIZE, map.size.height * WORLDMAP_SCREENSHOT_TILESIZE, Config.RGB_565);
image.setDensity(Bitmap.DENSITY_NONE);
Canvas canvas = new Canvas(image);
canvas.scale(scale, scale);
synchronized (cachedTiles) {
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerBase);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerGround);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerObjects);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerAbove);
tryDrawMapLayer(canvas, mapTiles.currentLayout.layerTop);
}
return image;
}
private void tryDrawMapLayer(Canvas canvas, final MapLayer layer) {
if (layer != null) drawMapLayer(canvas, layer);
}
private void drawMapLayer(Canvas canvas, final MapLayer layer) {
int py = 0;
for (int y = 0; y < map.size.height; ++y, py += tileSize) {
int px = 0;
for (int x = 0; x < map.size.width; ++x, px += tileSize) {
final int tile = layer.tiles[x][y];
if (tile == 0) continue;
cachedTiles.drawTile(canvas, tile, px, py, mPaint);
}
}
}
}
private static void ensureWorldmapDirectoryExists(Context context) throws IOException {
File dir = AndroidStorage.getStorageDirectory(context, Constants.FILENAME_SAVEGAME_DIRECTORY);
if (!dir.exists()) dir.mkdir();
dir = new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
if (!dir.exists()) dir.mkdir();
File noMediaFile = new File(dir, ".nomedia");
if (!noMediaFile.exists()) noMediaFile.createNewFile();
}
public static boolean fileForMapExists(Context context, PredefinedMap map) {
if (map.lastSeenLayoutHash.length() > 0) {
return getPngFile(context, map.name + '.' + map.lastSeenLayoutHash).exists();
}
return getPngFile(context, map.name).exists();
}
private static File getFileForMap(Context context, PredefinedMap map, boolean verifyFileExists) {
if (map.lastSeenLayoutHash.length() > 0) {
File fileWithHash = getPngFile(context, map.name + '.' + map.lastSeenLayoutHash);
if (!verifyFileExists) return fileWithHash;
else if (fileWithHash.exists()) return fileWithHash;
}
return getPngFile(context, map.name);
}
private static File getPngFile(Context context, String fileName) {
return new File(getWorldmapDirectory(context), fileName + ".png");
}
private static File getWorldmapDirectory(Context context) {
File dir = AndroidStorage.getStorageDirectory(context, Constants.FILENAME_SAVEGAME_DIRECTORY);
return new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
}
public static File getCombinedWorldMapFile(Context context, String segmentName) {
return new File(getWorldmapDirectory(context), Constants.FILENAME_WORLDMAP_HTMLFILE_PREFIX + segmentName + Constants.FILENAME_WORLDMAP_HTMLFILE_SUFFIX);
}
private static String getWorldMapSegmentAsHtml(Context context, Resources res, WorldContext world, String segmentName) {
WorldMapSegment segment = world.maps.worldMapSegments.get(segmentName);
Map<String, File> displayedMapFilenamesPerMapName = new HashMap<String, File>(segment.maps.size());
Coord offsetWorldmapTo = new Coord(999999, 999999);
for (WorldMapSegmentMap map : segment.maps.values()) {
PredefinedMap predefinedMap = world.maps.findPredefinedMap(map.mapName);
if (predefinedMap == null) continue;
if (!predefinedMap.visited) continue;
File f = WorldMapController.getFileForMap(context, predefinedMap, true);
if (!f.exists()) continue;
displayedMapFilenamesPerMapName.put(map.mapName, f);
offsetWorldmapTo.x = Math.min(offsetWorldmapTo.x, map.worldPosition.x);
offsetWorldmapTo.y = Math.min(offsetWorldmapTo.y, map.worldPosition.y);
}
Coord bottomRight = new Coord(0, 0);
StringBuilder mapsAsHtml = new StringBuilder(1000);
for (WorldMapSegmentMap segmentMap : segment.maps.values()) {
File f = displayedMapFilenamesPerMapName.get(segmentMap.mapName);
if (f == null) continue;
Size size = getMapSize(segmentMap, world);
mapsAsHtml
.append("<img src=\"")
.append(f.getName())
.append("\" id=\"")
.append(segmentMap.mapName)
.append("\" style=\"width:")
.append(size.width * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; height:")
.append(size.height * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; left:")
.append((segmentMap.worldPosition.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; top:")
.append((segmentMap.worldPosition.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px;\" />");
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) mapsAsHtml.append('\n');
bottomRight.x = Math.max(bottomRight.x, segmentMap.worldPosition.x + size.width);
bottomRight.y = Math.max(bottomRight.y, segmentMap.worldPosition.y + size.height);
}
Size worldmapSegmentSize = new Size(
(bottomRight.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
,(bottomRight.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE
);
StringBuilder namedAreasAsHtml = new StringBuilder(500);
for (NamedWorldMapArea area : segment.namedAreas.values()) {
CoordRect r = determineNamedAreaBoundary(area, segment, world, displayedMapFilenamesPerMapName.keySet());
if (r == null) continue;
namedAreasAsHtml
.append("<div class=\"namedarea ")
.append(area.type)
.append("\" style=\"width:")
.append(r.size.width * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; line-height:")
.append(r.size.height * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; left:")
.append((r.topLeft.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px; top:")
.append((r.topLeft.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
.append("px;\"><span>")
.append(area.name)
.append("</span></div>");
if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) namedAreasAsHtml.append('\n');
}
return res.getString(R.string.worldmap_template)
.replace("{{maps}}", mapsAsHtml.toString())
.replace("{{areas}}", namedAreasAsHtml.toString())
.replace("{{sizex}}", Integer.toString(worldmapSegmentSize.width))
.replace("{{sizey}}", Integer.toString(worldmapSegmentSize.height))
.replace("{{offsetx}}", Integer.toString(offsetWorldmapTo.x * WorldMapController.WORLDMAP_DISPLAY_TILESIZE))
.replace("{{offsety}}", Integer.toString(offsetWorldmapTo.y * WorldMapController.WORLDMAP_DISPLAY_TILESIZE));
}
private static Size getMapSize(WorldMapSegmentMap map, WorldContext world) {
return world.maps.findPredefinedMap(map.mapName).size;
}
private static CoordRect determineNamedAreaBoundary(NamedWorldMapArea area, WorldMapSegment segment, WorldContext world, Set<String> displayedMapNames) {
Coord topLeft = null;
Coord bottomRight = null;
for (String mapName : area.mapNames) {
if (!displayedMapNames.contains(mapName)) continue;
WorldMapSegmentMap map = segment.maps.get(mapName);
Size size = getMapSize(map, world);
if (topLeft == null) {
topLeft = new Coord(map.worldPosition);
} else {
topLeft.x = Math.min(topLeft.x, map.worldPosition.x);
topLeft.y = Math.min(topLeft.y, map.worldPosition.y);
}
if (bottomRight == null) {
bottomRight = new Coord(map.worldPosition.x + size.width, map.worldPosition.y + size.height);
} else {
bottomRight.x = Math.max(bottomRight.x, map.worldPosition.x + size.width);
bottomRight.y = Math.max(bottomRight.y, map.worldPosition.y + size.height);
}
}
if (topLeft == null) return null;
return new CoordRect(topLeft, new Size(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y));
}
public static void updateWorldMapSegment(Context context, Resources res, WorldContext world, String segmentName) throws IOException {
String mapAsHtml = getWorldMapSegmentAsHtml(context, res, world, segmentName);
File outputFile = getCombinedWorldMapFile(context, segmentName);
PrintWriter pw = new PrintWriter(outputFile);
pw.write(mapAsHtml);
pw.close();
}
public static boolean displayWorldMap(Context context, WorldContext world) {
String worldMapSegmentName = world.maps.getWorldMapSegmentNameForMap(world.model.currentMaps.map.name);
if (worldMapSegmentName == null) {
Toast.makeText(context, context.getResources().getString(R.string.display_worldmap_not_available), Toast.LENGTH_LONG).show();
return false;
}
Intent intent = new Intent(context, DisplayWorldMapActivity.class);
intent.putExtra("worldMapSegmentName", worldMapSegmentName);
context.startActivity(intent);
return true;
}
}

View File

@@ -19,10 +19,12 @@ import com.gpl.rpg.AndorsTrail.model.actor.MonsterType;
import com.gpl.rpg.AndorsTrail.model.item.ItemType;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.model.quest.Quest;
import com.gpl.rpg.AndorsTrail.util.HashMapHelper;
public final class GameStatistics {
private int deaths = 0;
private final HashMap<String, Integer> killedMonsters = new HashMap<String, Integer>();
private final HashMap<String, Integer> killedMonstersByTypeID = new HashMap<String, Integer>();
private final HashMap<String, Integer> killedMonstersByName = new HashMap<String, Integer>();
private final HashMap<String, Integer> usedItems = new HashMap<String, Integer>();
private int spentGold = 0;
private boolean unlimitedSaves = true;
@@ -33,10 +35,14 @@ public final class GameStatistics {
this.startLives = startLives;
}
public void addMonsterKill(String monsterTypeID) {
if (!killedMonsters.containsKey(monsterTypeID)) killedMonsters.put(monsterTypeID, 1);
else killedMonsters.put(monsterTypeID, killedMonsters.get(monsterTypeID) + 1);
public void addMonsterKill(MonsterType monsterType) {
// Track monster kills by type ID, for savegame file
killedMonstersByTypeID.put(monsterType.id, getNumberOfKillsForMonsterType(monsterType.id) + 1);
// Also track by name, for statistics display (multiple IDs w/same name don't matter to player)
killedMonstersByName.put(monsterType.name, getNumberOfKillsForMonsterName(monsterType.name) + 1);
}
public void addPlayerDeath(int lostExp) {
++deaths;
}
@@ -45,8 +51,7 @@ public final class GameStatistics {
}
public void addItemUsage(ItemType type) {
final String n = type.id;
if (!usedItems.containsKey(n)) usedItems.put(n, 1);
else usedItems.put(n, usedItems.get(n) + 1);
usedItems.put(n, HashMapHelper.getOrDefault(usedItems, n,0) + 1);
}
public int getDeaths() {
@@ -68,30 +73,30 @@ public final class GameStatistics {
public boolean isDead() { return !hasUnlimitedLives() && getLivesLeft() < 1; }
public int getNumberOfKillsForMonsterType(String monsterTypeID) {
Integer v = killedMonsters.get(monsterTypeID);
if (v == null) return 0;
return v;
return HashMapHelper.getOrDefault(killedMonstersByTypeID, monsterTypeID, 0);
}
public int getNumberOfKillsForMonsterName(String monsterName) {
return HashMapHelper.getOrDefault(killedMonstersByName, monsterName, 0);
}
public String getTop5MostCommonlyKilledMonsters(WorldContext world, Resources res) {
if (killedMonsters.isEmpty()) return null;
List<Entry<String, Integer>> entries = new ArrayList<Entry<String, Integer>>(killedMonsters.entrySet());
if (killedMonstersByTypeID.isEmpty()) return null;
List<Entry<String, Integer>> entries = new ArrayList<Entry<String, Integer>>(killedMonstersByName.entrySet());
Collections.sort(entries, descendingValueComparator);
StringBuilder sb = new StringBuilder(100);
int i = 0;
for (Entry<String, Integer> e : entries) {
if (i++ >= 5) break;
MonsterType t = world.monsterTypes.getMonsterType(e.getKey());
if (t == null) continue;
sb.append(res.getString(R.string.heroinfo_gamestats_name_and_qty, t.name, e.getValue())).append('\n');
sb.append(res.getString(R.string.heroinfo_gamestats_name_and_qty, e.getKey(), e.getValue())).append('\n');
}
return sb.toString();
}
public String getMostPowerfulKilledMonster(WorldContext world) {
if (killedMonsters.isEmpty()) return null;
HashMap<String, Integer> expPerMonsterType = new HashMap<String, Integer>(killedMonsters.size());
for (String monsterTypeID : killedMonsters.keySet()) {
if (killedMonstersByTypeID.isEmpty()) return null;
HashMap<String, Integer> expPerMonsterType = new HashMap<String, Integer>(killedMonstersByTypeID.size());
for (String monsterTypeID : killedMonstersByTypeID.keySet()) {
MonsterType t = world.monsterTypes.getMonsterType(monsterTypeID);
expPerMonsterType.put(monsterTypeID, t != null ? t.exp : 0);
}
@@ -135,20 +140,15 @@ public final class GameStatistics {
}
public int getNumberOfUsedItems() {
int result = 0;
for (int v : usedItems.values()) result += v;
return result;
return HashMapHelper.sumIntegerValues(usedItems);
}
public int getNumberOfTimesItemHasBeenUsed(String itemId) {
if (!usedItems.containsKey(itemId)) return 0;
return usedItems.get(itemId);
return HashMapHelper.getOrDefault(usedItems, itemId, 0);
}
public int getNumberOfKilledMonsters() {
int result = 0;
for (int v : killedMonsters.values()) result += v;
return result;
return HashMapHelper.sumIntegerValues(killedMonstersByTypeID);
}
private static final Comparator<Entry<String, Integer>> descendingValueComparator = new Comparator<Entry<String, Integer>>() {
@@ -172,8 +172,14 @@ public final class GameStatistics {
if (type == null) continue;
id = type.id;
}
this.killedMonsters.put(id, value);
this.killedMonstersByTypeID.put(id, value);
// Also track by name, for statistics display (multiple IDs w/same name don't matter to player)
MonsterType t = world.monsterTypes.getMonsterType(id);
if (t != null) killedMonstersByName.put(t.name, getNumberOfKillsForMonsterName(t.name) + value);
}
if (fileversion <= 17) return;
final int numItems = src.readInt();
@@ -192,7 +198,7 @@ public final class GameStatistics {
public void writeToParcel(DataOutputStream dest) throws IOException {
dest.writeInt(deaths);
Set<Entry<String, Integer> > set = killedMonsters.entrySet();
Set<Entry<String, Integer> > set = killedMonstersByTypeID.entrySet();
dest.writeInt(set.size());
for (Entry<String, Integer> e : set) {
dest.writeUTF(e.getKey());

View File

@@ -7,9 +7,6 @@ import java.io.IOException;
import com.gpl.rpg.AndorsTrail.context.ControllerContext;
import com.gpl.rpg.AndorsTrail.context.WorldContext;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
public final class ModelContainer {

View File

@@ -4,8 +4,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import android.util.SparseArray;
import com.gpl.rpg.AndorsTrail.controller.Constants;
import com.gpl.rpg.AndorsTrail.model.ability.SkillInfo.SkillLevelRequirement;
import com.gpl.rpg.AndorsTrail.model.actor.Player;
@@ -56,6 +54,7 @@ public final class SkillCollection {
,specializationWeaponShield
,weaponProficiencyPole
,fightstyleUnarmedUnarmored
,sporeImmunity
}
// should be in the same number &U order as in arrays.xml
@@ -84,7 +83,7 @@ public final class SkillCollection {
public static final int PER_SKILLPOINT_INCREASE_COINFINDER_CHANCE_PERCENT = 30;
public static final int PER_SKILLPOINT_INCREASE_MAGICFINDER_CHANCE_PERCENT = 50;
public static final int PER_SKILLPOINT_INCREASE_COINFINDER_QUANTITY_PERCENT = 50;
public static final int PER_SKILLPOINT_INCREASE_MORE_EXP_PERCENT = 5;
public static final int PER_SKILLPOINT_INCREASE_MORE_EXP_PERCENT = 10;
public static final int PER_SKILLPOINT_INCREASE_CLEAVE_AP = 3;
public static final int PER_SKILLPOINT_INCREASE_EATER_HEALTH = 1;
public static final int PER_SKILLPOINT_INCREASE_FORTITUDE_HEALTH = 1;
@@ -244,6 +243,7 @@ public final class SkillCollection {
SkillLevelRequirement.requireExperienceLevels(45, 0)
,SkillLevelRequirement.requireOtherSkill(SkillID.fightstyleWeaponShield, 2)
}, position++));
initializeSkill(new SkillInfo(SkillID.sporeImmunity, 1, SkillInfo.LevelUpType.onlyByQuests, SkillCategory.immunity, null, position++));
}
public SkillInfo getSkill(SkillID skillID) {

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