mirror of
https://github.com/OMGeeky/andors-trail.git
synced 2026-02-23 15:38:29 +01:00
Compare commits
702 Commits
no-empty-d
...
hotfix-fre
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e2983f527 | ||
|
|
3faf696f46 | ||
|
|
e3b03fa3e5 | ||
|
|
d25d7916b0 | ||
|
|
1a43fad4bb | ||
|
|
c5e1806b9f | ||
|
|
dee12635a1 | ||
|
|
5fac187f80 | ||
|
|
4d18951e94 | ||
|
|
48ac678c9c | ||
|
|
3a343b12ee | ||
|
|
1174495f67 | ||
|
|
e0b62484f4 | ||
|
|
a2c41fd470 | ||
|
|
6633bf15e6 | ||
|
|
64644ca5be | ||
|
|
31d83b0f44 | ||
|
|
98ceed6ea6 | ||
|
|
85c71fb49f | ||
|
|
b91388c085 | ||
|
|
6faf448a29 | ||
|
|
d6fe78132a | ||
|
|
7359e55047 | ||
|
|
a5a97bedba | ||
|
|
bcb317d799 | ||
|
|
521358a8b8 | ||
|
|
901bc3ba43 | ||
|
|
3ea543213a | ||
|
|
e54ddf5d6c | ||
|
|
349baa17d3 | ||
|
|
00b84109c8 | ||
|
|
01f2bcc8c6 | ||
|
|
78308b5d98 | ||
|
|
891664c8ff | ||
|
|
07dd3d81ff | ||
|
|
9196b56a3d | ||
|
|
fa70ba8fb6 | ||
|
|
6e4e60a713 | ||
|
|
2caff38db9 | ||
|
|
1b6d1ce5f1 | ||
|
|
8fcd6c73b6 | ||
|
|
b5eb47aff8 | ||
|
|
87ddae5571 | ||
|
|
e06de09e15 | ||
|
|
9ca3833117 | ||
|
|
bd4efa9434 | ||
|
|
c07bbb8ef6 | ||
|
|
503a0725b9 | ||
|
|
2760e081ac | ||
|
|
8e2bea1f35 | ||
|
|
4369a3dfb3 | ||
|
|
a844e05946 | ||
|
|
401b79fcf3 | ||
|
|
0cf139035a | ||
|
|
a332b06266 | ||
|
|
0eb4a1512f | ||
|
|
0ecda7eb62 | ||
|
|
4cacf8de1e | ||
|
|
6086a54f0f | ||
|
|
f376bd3445 | ||
|
|
e722852f93 | ||
|
|
9e9102fdc0 | ||
|
|
491e95e4a1 | ||
|
|
31755b480a | ||
|
|
d89aed8dc5 | ||
|
|
931597abcb | ||
|
|
77ab35da91 | ||
|
|
0684fd8e25 | ||
|
|
97cabf62b8 | ||
|
|
53a1b513fb | ||
|
|
053336faca | ||
|
|
dbe096a8d5 | ||
|
|
f78d1a6d84 | ||
|
|
01d1cb6212 | ||
|
|
c606e7c296 | ||
|
|
5ac2f44d52 | ||
|
|
9b7b79ac9f | ||
|
|
99deee6a14 | ||
|
|
196302ed3e | ||
|
|
f40589a461 | ||
|
|
ef2e01085a | ||
|
|
8f939fd4af | ||
|
|
4a546d9ff1 | ||
|
|
d75c99f7ee | ||
|
|
f10a3d99c5 | ||
|
|
fb23e577e8 | ||
|
|
6861451f8f | ||
|
|
770082a811 | ||
|
|
43cf2b1105 | ||
|
|
88e2a65b5d | ||
|
|
1333610ef0 | ||
|
|
731411cdfa | ||
|
|
10da65860a | ||
|
|
6f637e01b6 | ||
|
|
a356a456d5 | ||
|
|
55f4141157 | ||
|
|
b2a3c926c5 | ||
|
|
e79c26e234 | ||
|
|
cb293885e2 | ||
|
|
92db832044 | ||
|
|
42f20efe3b | ||
|
|
14866a1432 | ||
|
|
7d61704575 | ||
|
|
c8e8d0b7b9 | ||
|
|
dda03b21d7 | ||
|
|
64e8bf3abb | ||
|
|
da671b00cf | ||
|
|
6d918bd3d5 | ||
|
|
dbf4e05d59 | ||
|
|
9224cf8b99 | ||
|
|
00051ec7fe | ||
|
|
44686c6459 | ||
|
|
09f3a7f27e | ||
|
|
51a09a7a99 | ||
|
|
ebdea1e9b1 | ||
|
|
f3d3adac2e | ||
|
|
b55f90efde | ||
|
|
c5e6e09071 | ||
|
|
9895847f8b | ||
|
|
992f265292 | ||
|
|
f4a4a7c124 | ||
|
|
129d037379 | ||
|
|
f0e438044f | ||
|
|
9ef0e56aa8 | ||
|
|
6b74350edf | ||
|
|
5f6e38de30 | ||
|
|
1ee940c40c | ||
|
|
2ca5dd9b31 | ||
|
|
08a4c18c8f | ||
|
|
e4cc3bb89c | ||
|
|
6f56e1fb3d | ||
|
|
c49b63b50e | ||
|
|
0fcb5aa2c6 | ||
|
|
d8c055dbb4 | ||
|
|
280c636823 | ||
|
|
bce6cdb618 | ||
|
|
3486f95a81 | ||
|
|
ea427419ef | ||
|
|
38467803b8 | ||
|
|
6a25253698 | ||
|
|
31b15baf90 | ||
|
|
b906e4dd99 | ||
|
|
5022c94a13 | ||
|
|
f6f3c2041b | ||
|
|
5c3bdf40f9 | ||
|
|
db3335513a | ||
|
|
a815562f82 | ||
|
|
36d4cb716e | ||
|
|
2a62f69623 | ||
|
|
6d1ffdedc8 | ||
|
|
7f67ff266c | ||
|
|
5afdbd82bb | ||
|
|
21763301ca | ||
|
|
0268f4e707 | ||
|
|
b66e75027d | ||
|
|
934755cf4e | ||
|
|
148280d29e | ||
|
|
0cc89d6e86 | ||
|
|
395bb7b213 | ||
|
|
af5a992cfc | ||
|
|
c76ae59ae2 | ||
|
|
2a884b7c7c | ||
|
|
3a87e6159b | ||
|
|
6ec5273d21 | ||
|
|
bff5215bb9 | ||
|
|
f609d4132a | ||
|
|
6cc3e428d3 | ||
|
|
28eb643f49 | ||
|
|
b7d9dc08ec | ||
|
|
2ca9a78280 | ||
|
|
2df651f342 | ||
|
|
b16129abfa | ||
|
|
787b739fa3 | ||
|
|
f4d62d1590 | ||
|
|
03ca432a36 | ||
|
|
28804f9034 | ||
|
|
7b276046ed | ||
|
|
c538088760 | ||
|
|
1074bbb09e | ||
|
|
2c503bdf88 | ||
|
|
2f242e6607 | ||
|
|
0cee97e5f6 | ||
|
|
90f12a94a8 | ||
|
|
91fb604806 | ||
|
|
a54df11cc7 | ||
|
|
b8e903af3e | ||
|
|
2c4491c707 | ||
|
|
d13865f599 | ||
|
|
a0bfee0c6a | ||
|
|
69eb9eda25 | ||
|
|
ba3b37a0a3 | ||
|
|
bf13c485bd | ||
|
|
c537e7554a | ||
|
|
7b030434b9 | ||
|
|
03c45bf7f4 | ||
|
|
daed8ccfa7 | ||
|
|
32b19fbb33 | ||
|
|
b1c2a4ef8c | ||
|
|
af3109b9d9 | ||
|
|
130c694c8d | ||
|
|
c6801505c2 | ||
|
|
bac004ae33 | ||
|
|
abb8998117 | ||
|
|
9ca1188baa | ||
|
|
61267a502a | ||
|
|
9dd287f16e | ||
|
|
55989a4d55 | ||
|
|
0b0d433043 | ||
|
|
a6480db012 | ||
|
|
7c5b89766a | ||
|
|
1c8145116f | ||
|
|
fdbf58dfa3 | ||
|
|
8730ebf67a | ||
|
|
4c1e1d68b5 | ||
|
|
e5acb89f1b | ||
|
|
b8c3119481 | ||
|
|
15f3fd1206 | ||
|
|
950310906e | ||
|
|
7853718f29 | ||
|
|
4f2733324f | ||
|
|
7379277b1d | ||
|
|
6387b87ced | ||
|
|
f01c5ff237 | ||
|
|
5843be57c0 | ||
|
|
4a62613375 | ||
|
|
bec17c65e4 | ||
|
|
315e34185a | ||
|
|
5510d88988 | ||
|
|
803e9a33e0 | ||
|
|
b346f32e77 | ||
|
|
585852ecb1 | ||
|
|
6fcc65acd7 | ||
|
|
19c67b23f1 | ||
|
|
bd59044951 | ||
|
|
6255808ed0 | ||
|
|
77476364cc | ||
|
|
25a6f050ef | ||
|
|
990dd40414 | ||
|
|
0d2574d31b | ||
|
|
01dac76b85 | ||
|
|
d9602a5e41 | ||
|
|
5a0a90ca60 | ||
|
|
10284e801f | ||
|
|
a060552907 | ||
|
|
01a2cadcd3 | ||
|
|
d87e584601 | ||
|
|
fdf8a71acb | ||
|
|
9d46fa2583 | ||
|
|
bfeab1abfa | ||
|
|
7c30577374 | ||
|
|
e164e50f93 | ||
|
|
f6d3cd59c0 | ||
|
|
11196ce1d4 | ||
|
|
db0cfd430c | ||
|
|
7353f44265 | ||
|
|
3b19458c3d | ||
|
|
f2d1f8144c | ||
|
|
f39de931c8 | ||
|
|
b1a25b485f | ||
|
|
98830faed4 | ||
|
|
198ab0c927 | ||
|
|
6e8f45b32b | ||
|
|
5d534c9b0a | ||
|
|
15ba35fbb2 | ||
|
|
5258ffebbe | ||
|
|
2733ccdf8a | ||
|
|
52ec176455 | ||
|
|
a24aaeb7e8 | ||
|
|
837dbf8393 | ||
|
|
da97a0857b | ||
|
|
df30d586e2 | ||
|
|
49d7b2fbff | ||
|
|
beec49c9e5 | ||
|
|
3cdc6ae8c1 | ||
|
|
0dcb04e46b | ||
|
|
60fe0f38bf | ||
|
|
0cf8cdd4c1 | ||
|
|
2d7c1ed049 | ||
|
|
49f816be4e | ||
|
|
433230dc19 | ||
|
|
59399e7819 | ||
|
|
8342f05fb4 | ||
|
|
881f556c29 | ||
|
|
09808990ee | ||
|
|
80d54af2a0 | ||
|
|
282fc90f98 | ||
|
|
f093b2d3ac | ||
|
|
87ba301091 | ||
|
|
58eb2066f5 | ||
|
|
e43cead809 | ||
|
|
7f90039de7 | ||
|
|
8bafff9855 | ||
|
|
dc28c9787d | ||
|
|
4bc9e3e2bf | ||
|
|
dd71112dc6 | ||
|
|
29411ae0e8 | ||
|
|
ceb85adcd6 | ||
|
|
960525bb40 | ||
|
|
f9f46e38b4 | ||
|
|
64220c320b | ||
|
|
28262aeedf | ||
|
|
4b5af87739 | ||
|
|
0d901b2472 | ||
|
|
a98c621931 | ||
|
|
83360aebc7 | ||
|
|
f47112c52e | ||
|
|
19bf9b0c3d | ||
|
|
a4f1cb7cfd | ||
|
|
aed7a92340 | ||
|
|
3f6397a2a9 | ||
|
|
326a518630 | ||
|
|
84fa8e5547 | ||
|
|
1d5c1edad9 | ||
|
|
5b0e8d1d25 | ||
|
|
c9b4da0823 | ||
|
|
4c55c5c2a7 | ||
|
|
ced33a4cda | ||
|
|
50606e8424 | ||
|
|
3a75b08962 | ||
|
|
5c0aa7acbb | ||
|
|
845ea0926e | ||
|
|
b89cd7abc0 | ||
|
|
77659f6539 | ||
|
|
48343162f9 | ||
|
|
d1be8b88d4 | ||
|
|
2aeea3aa13 | ||
|
|
f7ff8949c4 | ||
|
|
565b69489a | ||
|
|
d5142d7f0a | ||
|
|
c83dbccdb7 | ||
|
|
d60c6b3aa8 | ||
|
|
c8d30efc63 | ||
|
|
274ae1d826 | ||
|
|
085c66b7a4 | ||
|
|
07ebbbd682 | ||
|
|
8e4f5a6ae7 | ||
|
|
cac8cf9d38 | ||
|
|
4861557cdb | ||
|
|
1f71f60bf9 | ||
|
|
9547e10def | ||
|
|
d51dfec557 | ||
|
|
89f46e67bf | ||
|
|
d180e233c5 | ||
|
|
e0f7318ef3 | ||
|
|
29be76dcd5 | ||
|
|
32a9480fc0 | ||
|
|
e4c14dc6bb | ||
|
|
4ef8e254c3 | ||
|
|
53d1cbc4a9 | ||
|
|
b2c345d052 | ||
|
|
383118f8ef | ||
|
|
8953854bb3 | ||
|
|
d378681461 | ||
|
|
039bbe5308 | ||
|
|
d4a8ab316e | ||
|
|
ffa6a0d7d9 | ||
|
|
8e9ceeb61a | ||
|
|
dccba37195 | ||
|
|
7fc785c0a2 | ||
|
|
c5826dac0c | ||
|
|
a4986a87a3 | ||
|
|
e26b7ae6dd | ||
|
|
190ea5dfe2 | ||
|
|
984892ea85 | ||
|
|
e52177fe5c | ||
|
|
7e24bfc9d1 | ||
|
|
a52c01087e | ||
|
|
a300a8f426 | ||
|
|
ed4ed55854 | ||
|
|
5889f57731 | ||
|
|
44e4de191e | ||
|
|
16f10facc3 | ||
|
|
efa8547c2a | ||
|
|
7037f0574b | ||
|
|
e59108291b | ||
|
|
55c671cc4b | ||
|
|
d8b6530e69 | ||
|
|
5d46a0419b | ||
|
|
d012f79822 | ||
|
|
818883a98a | ||
|
|
79669cb581 | ||
|
|
47f436e288 | ||
|
|
71ac706449 | ||
|
|
128c753057 | ||
|
|
b6a8074657 | ||
|
|
c2a347fb00 | ||
|
|
70709e0bf8 | ||
|
|
16992d9d43 | ||
|
|
aa819d7737 | ||
|
|
790749df12 | ||
|
|
a2cb909b52 | ||
|
|
4058450016 | ||
|
|
6233bad209 | ||
|
|
e52887b074 | ||
|
|
f9f53d18fb | ||
|
|
d4b30ecb15 | ||
|
|
1c0bafba6e | ||
|
|
67fd45ea54 | ||
|
|
12cefe3d84 | ||
|
|
3d24e79b9a | ||
|
|
43bbd1d95c | ||
|
|
2065a29d04 | ||
|
|
c45fae6ab1 | ||
|
|
0d3ee38d0e | ||
|
|
7de1fe0f75 | ||
|
|
f499ee52a9 | ||
|
|
0b9dd43505 | ||
|
|
09a856944d | ||
|
|
ef6e997665 | ||
|
|
f62ab4ca00 | ||
|
|
bd084d6a44 | ||
|
|
0462d8c85d | ||
|
|
b5444303b9 | ||
|
|
5ea73d795d | ||
|
|
5c7d4db3a7 | ||
|
|
d0df9b88e8 | ||
|
|
9adb719b13 | ||
|
|
ba101cf562 | ||
|
|
d6fe5c9fb8 | ||
|
|
cbdc47335c | ||
|
|
1d5c3efd83 | ||
|
|
64f7b3ff26 | ||
|
|
da604679de | ||
|
|
8a057b66a0 | ||
|
|
d3ad383d83 | ||
|
|
ff003eff27 | ||
|
|
56ec8e02b5 | ||
|
|
ca9aba5ec1 | ||
|
|
d88832677f | ||
|
|
570d9da321 | ||
|
|
99f4ab5e6b | ||
|
|
1f1e4302ae | ||
|
|
e8ea1e391c | ||
|
|
1b80638e78 | ||
|
|
b3a5564585 | ||
|
|
675ff6f979 | ||
|
|
995ee74fce | ||
|
|
bf13ac460d | ||
|
|
c4eb2b2d3a | ||
|
|
f1afbb6b1c | ||
|
|
3cf383a0d1 | ||
|
|
39f5100c50 | ||
|
|
21ae554f42 | ||
|
|
f77bb731bf | ||
|
|
e879aeea24 | ||
|
|
aa41356aa7 | ||
|
|
05e51309ba | ||
|
|
82212cbb13 | ||
|
|
42d68399d8 | ||
|
|
19c5957601 | ||
|
|
8a16efa9f6 | ||
|
|
ba6d541682 | ||
|
|
ccc3bc0b0d | ||
|
|
9778aabaed | ||
|
|
d7db07529e | ||
|
|
f7ff05e6e9 | ||
|
|
b1497a3f79 | ||
|
|
8640cf5f28 | ||
|
|
86be492cee | ||
|
|
e105dc68dd | ||
|
|
e17197d518 | ||
|
|
0b2dbe53e3 | ||
|
|
a64c45586f | ||
|
|
106b43b7fd | ||
|
|
e4aa742882 | ||
|
|
a4f67e6feb | ||
|
|
794303eacd | ||
|
|
2b53d200f0 | ||
|
|
d288c23e53 | ||
|
|
1e0ee6fc7f | ||
|
|
86af20dcc4 | ||
|
|
d0eb30ad02 | ||
|
|
d39fb1d6e8 | ||
|
|
c41a40894e | ||
|
|
e5a98bc252 | ||
|
|
45f770dcc1 | ||
|
|
5e79b15320 | ||
|
|
34ab4601e4 | ||
|
|
39303c0381 | ||
|
|
e4a2c925ef | ||
|
|
5e6e233a84 | ||
|
|
4a118451dd | ||
|
|
53de86e4f9 | ||
|
|
4c18ff2615 | ||
|
|
db9821956c | ||
|
|
90da983317 | ||
|
|
342441aa36 | ||
|
|
9250db38be | ||
|
|
8782190bdf | ||
|
|
7d58901811 | ||
|
|
9e885c6d7a | ||
|
|
ef1fc76f3c | ||
|
|
3e8fe3426d | ||
|
|
cb445ec643 | ||
|
|
6609a7b84a | ||
|
|
d6732bbe2e | ||
|
|
2a188aa05d | ||
|
|
bebe59537c | ||
|
|
cb7628c859 | ||
|
|
6cc167d9d4 | ||
|
|
62f5eb00ba | ||
|
|
762fbe5191 | ||
|
|
afe758fddb | ||
|
|
c05d9082f6 | ||
|
|
1f12c08ca3 | ||
|
|
dc6b17b77b | ||
|
|
38d8f205fc | ||
|
|
f6660ec7b0 | ||
|
|
851e9e1b40 | ||
|
|
b890c9b8f8 | ||
|
|
4d3606fe49 | ||
|
|
b51772e207 | ||
|
|
3ccf5eb3e1 | ||
|
|
5a6eb9b0fb | ||
|
|
1c3b3e5841 | ||
|
|
fe5de9c6d7 | ||
|
|
866ee65964 | ||
|
|
1b32b1f9b5 | ||
|
|
5708f1111a | ||
|
|
ae0bbb4b0b | ||
|
|
ada8ed6583 | ||
|
|
a67edc6f2b | ||
|
|
dbf3eda49b | ||
|
|
abee648344 | ||
|
|
4f77bbb69e | ||
|
|
9383efdb9d | ||
|
|
32ab09aa36 | ||
|
|
b81d381fc4 | ||
|
|
4dec9dc7db | ||
|
|
a08bf5ed49 | ||
|
|
321085d3e9 | ||
|
|
98fbdce95e | ||
|
|
5bd15e489b | ||
|
|
5531241ca4 | ||
|
|
3bf9eca3a9 | ||
|
|
90bdb77beb | ||
|
|
73ff117ddd | ||
|
|
0c36d1b045 | ||
|
|
2408171c9d | ||
|
|
35ba477cd4 | ||
|
|
219acf7618 | ||
|
|
b619137ae3 | ||
|
|
1516381ec6 | ||
|
|
40c816b4e9 | ||
|
|
1a0c36e179 | ||
|
|
399cd68643 | ||
|
|
aa5872b022 | ||
|
|
c38357ff7f | ||
|
|
feac4292af | ||
|
|
11a9d15df0 | ||
|
|
879a57e06d | ||
|
|
2b3759151d | ||
|
|
33487fe4c0 | ||
|
|
7004d31aa9 | ||
|
|
b3cbe50138 | ||
|
|
0fd7ef32ad | ||
|
|
aff84a8054 | ||
|
|
c3c74e9e56 | ||
|
|
0113a57311 | ||
|
|
e03cd77f81 | ||
|
|
82be86bffb | ||
|
|
f9cab276fb | ||
|
|
5979cb4773 | ||
|
|
0df8568f37 | ||
|
|
88439ed08b | ||
|
|
5b109cd5b9 | ||
|
|
5ae9d9e009 | ||
|
|
df093ba457 | ||
|
|
57c598227e | ||
|
|
e70580fcb1 | ||
|
|
8a8ad9b82b | ||
|
|
2c395ca5e1 | ||
|
|
51cd079680 | ||
|
|
4c97b65acf | ||
|
|
13134ae67d | ||
|
|
3a446af265 | ||
|
|
ae1f9b6015 | ||
|
|
313514ebe5 | ||
|
|
b0caaeda1e | ||
|
|
c3924e7193 | ||
|
|
5f42305af7 | ||
|
|
9513c8a790 | ||
|
|
9b59b018f1 | ||
|
|
fe7eb87f6d | ||
|
|
e0093c31af | ||
|
|
00beaf68e8 | ||
|
|
2594c9d096 | ||
|
|
23a122c093 | ||
|
|
810a1e810c | ||
|
|
a382008e9b | ||
|
|
bdd383c430 | ||
|
|
2672fa5e89 | ||
|
|
22f46c593e | ||
|
|
698f108262 | ||
|
|
37f71811ba | ||
|
|
1b60247c23 | ||
|
|
193a57de05 | ||
|
|
e8dfb0e658 | ||
|
|
0a2ceea8fa | ||
|
|
6f16729c53 | ||
|
|
26f0e174f6 | ||
|
|
11a1720900 | ||
|
|
9721cca1e4 | ||
|
|
6f20d1a164 | ||
|
|
5dfe12b527 | ||
|
|
bef533556a | ||
|
|
18618d527f | ||
|
|
676b661e9e | ||
|
|
3748668c11 | ||
|
|
caf699874a | ||
|
|
67d214e8e7 | ||
|
|
2a63cb8e70 | ||
|
|
2d5ff980df | ||
|
|
5c8effb45b | ||
|
|
113af685dc | ||
|
|
6008e2d55f | ||
|
|
c451da4300 | ||
|
|
2a8f2a0f26 | ||
|
|
46e396b74b | ||
|
|
93f2e6d563 | ||
|
|
f38920e719 | ||
|
|
b8c07be5bd | ||
|
|
e0aa9f76a6 | ||
|
|
bca41adbf4 | ||
|
|
86eb8775b2 | ||
|
|
7b759fb71d | ||
|
|
241b2d244d | ||
|
|
252b42b1ee | ||
|
|
792b9896b3 | ||
|
|
13021da2d8 | ||
|
|
ee0ff7de44 | ||
|
|
e08ce9950d | ||
|
|
8c65f8cbf1 | ||
|
|
30f4ea1d44 | ||
|
|
5561a8f7a1 | ||
|
|
0d26a532e3 | ||
|
|
5b5fc4f782 | ||
|
|
d23be31719 | ||
|
|
f4b81760fb | ||
|
|
211c89d6ef | ||
|
|
d8a69fd700 | ||
|
|
1165cf3f98 | ||
|
|
40b04d8bb2 | ||
|
|
ef43997c0d | ||
|
|
75bddf5ab3 | ||
|
|
220e46d9f7 | ||
|
|
07de076b26 | ||
|
|
79d72a1e93 | ||
|
|
adea17d749 | ||
|
|
e912e452d8 | ||
|
|
b4c490f648 | ||
|
|
e6ef6728ac | ||
|
|
53744b1897 | ||
|
|
678737441a | ||
|
|
cb1801b486 | ||
|
|
2ffa9f5f0b | ||
|
|
bde0339a80 | ||
|
|
b81ec6883f | ||
|
|
8e8c02b038 | ||
|
|
37f17cddf6 | ||
|
|
5bbe529230 | ||
|
|
856fdfcfba | ||
|
|
e78f16c342 | ||
|
|
2776c33876 | ||
|
|
cc6de21dc1 | ||
|
|
511017a1de | ||
|
|
28ed52b263 | ||
|
|
a63e8ad034 | ||
|
|
bda9556cd1 | ||
|
|
aaae2a3b51 | ||
|
|
3e9032de0d | ||
|
|
b778ed1207 | ||
|
|
439e0fcbd8 | ||
|
|
34416c5548 | ||
|
|
070cb5bafd | ||
|
|
7f50c4f444 | ||
|
|
821ff0982e | ||
|
|
73eff8c748 | ||
|
|
15246d5270 | ||
|
|
a0564c05ed | ||
|
|
bea41af484 | ||
|
|
d7948ff076 | ||
|
|
60e9df3141 | ||
|
|
7be2256672 | ||
|
|
af8cc33bff | ||
|
|
64e3009269 | ||
|
|
ff456c2565 | ||
|
|
bc308df775 | ||
|
|
b87a514187 | ||
|
|
b28f4f4c42 | ||
|
|
3dcc1028c1 | ||
|
|
beb8ae4a11 | ||
|
|
ac7303a7f2 | ||
|
|
b8a6073e3d | ||
|
|
27909b4b49 | ||
|
|
6cd268b969 | ||
|
|
657297ca4c | ||
|
|
46d26478ca | ||
|
|
16bd9dc17a | ||
|
|
26e9bda24b | ||
|
|
1821fffc3b | ||
|
|
1a3a5842dc |
@@ -1,8 +1,8 @@
|
||||
apply plugin: 'com.android.application'
|
||||
|
||||
android {
|
||||
|
||||
compileSdkVersion 34
|
||||
buildToolsVersion "30.0.3"
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.gpl.rpg.AndorsTrail"
|
||||
@@ -63,11 +63,18 @@ task cleanup(type: Delete) {
|
||||
afterEvaluate {
|
||||
project.tasks.copyRes.dependsOn project.tasks.copyResValuesIn
|
||||
|
||||
mapReleaseSourceSetPaths.dependsOn project.tasks.copyRes
|
||||
generateReleaseResources.dependsOn project.tasks.copyRes
|
||||
|
||||
generateDebugResources.dependsOn project.tasks.copyRes
|
||||
mapDebugSourceSetPaths.dependsOn project.tasks.copyRes
|
||||
mergeDebugResources.dependsOn project.tasks.copyRes
|
||||
extractDeepLinksDebug.dependsOn project.tasks.copyRes
|
||||
mergeReleaseResources.dependsOn project.tasks.copyRes
|
||||
extractDeepLinksRelease.dependsOn project.tasks.copyRes
|
||||
|
||||
generateDebugResources.dependsOn project.tasks.copyTranslation
|
||||
mapDebugSourceSetPaths.dependsOn project.tasks.copyTranslation
|
||||
mergeDebugAssets.dependsOn project.tasks.copyTranslation
|
||||
mergeReleaseAssets.dependsOn project.tasks.copyTranslation
|
||||
extractDeepLinksDebug.dependsOn project.tasks.copyTranslation
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
<manifest
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.gpl.rpg.AndorsTrail"
|
||||
android:versionCode="76"
|
||||
android:versionName="0.8.10dev"
|
||||
android:versionCode="78"
|
||||
android:versionName="0.8.12"
|
||||
android:installLocation="auto"
|
||||
>
|
||||
|
||||
|
||||
@@ -24,15 +24,15 @@ 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 = true;
|
||||
public static final boolean DEVELOPMENT_DEBUGBUTTONS = false;
|
||||
public static final boolean DEVELOPMENT_FASTSPEED = false;
|
||||
public static final boolean DEVELOPMENT_VALIDATEDATA = true;
|
||||
public static final boolean DEVELOPMENT_DEBUGMESSAGES = true;
|
||||
public static final String CURRENT_VERSION_DISPLAY = "0.8.10dev";
|
||||
public static final boolean DEVELOPMENT_VALIDATEDATA = false;
|
||||
public static final boolean DEVELOPMENT_DEBUGMESSAGES = false;
|
||||
public static final String CURRENT_VERSION_DISPLAY = "0.8.12";
|
||||
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 : 76;
|
||||
public static final int CURRENT_VERSION = DEVELOPMENT_INCOMPATIBLE_SAVEGAMES ? DEVELOPMENT_INCOMPATIBLE_SAVEGAME_VERSION : 78;
|
||||
|
||||
private final AndorsTrailPreferences preferences = new AndorsTrailPreferences();
|
||||
private WorldContext world = new WorldContext();
|
||||
|
||||
@@ -152,6 +152,12 @@ public final class DebugInterface {
|
||||
public void onClick(View arg0) {
|
||||
showToast(mainActivity, "DEBUG: map=" + world.model.currentMaps.map.name , Toast.LENGTH_SHORT);
|
||||
}
|
||||
})
|
||||
,new DebugButton("tim", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
world.model.worldData.tickWorldTime(10);
|
||||
}
|
||||
})
|
||||
}));
|
||||
|
||||
@@ -182,7 +188,7 @@ public final class DebugInterface {
|
||||
,new DebugButton("cr", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "houseatcrossroads4", "down", 0, 0);
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "crossroads", "middle", 0, 0);
|
||||
}
|
||||
})
|
||||
,new DebugButton("lf", new OnClickListener() {
|
||||
@@ -313,6 +319,13 @@ public final class DebugInterface {
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("wx", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "wexlow_village", "north", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("fey", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
@@ -345,14 +358,14 @@ public final class DebugInterface {
|
||||
,new DebugButton("#1", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "waterway11_east", "west", 0, 0);
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "swamp3", "north", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#2", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "laerothtomb1", "north", 0, 0);
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "beekeeper1", "south", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -360,7 +373,7 @@ public final class DebugInterface {
|
||||
,new DebugButton("#3", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "mountainlake8", "north", 0, 0);
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "guynmart", "west2", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -370,7 +383,7 @@ public final class DebugInterface {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "waterway5", "south", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
,new DebugButton("#5", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
@@ -378,6 +391,41 @@ public final class DebugInterface {
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#6", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "laerothmanor1", "down2", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#7", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "final_cave1", "up", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#8", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "bwmfill3", "north2", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#9", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "island2", "down", 0, 0);
|
||||
}
|
||||
})
|
||||
|
||||
,new DebugButton("#10", new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View arg0) {
|
||||
controllerContext.movementController.placePlayerAsyncAt(MapObject.MapObjectType.newmap, "laerothprison3", "south", 2, 0);
|
||||
}
|
||||
})
|
||||
|
||||
}));
|
||||
buttonList.addAll(tpButtons3);
|
||||
|
||||
|
||||
@@ -196,7 +196,7 @@ public final class SkillInfoActivity extends AndorsTrailBaseActivity {
|
||||
case armorProficiencyShield: return res.getString(R.string.skill_longdescription_armor_prof_shield, SkillCollection.PER_SKILLPOINT_INCREASE_SHIELD_PROF_DR);
|
||||
case armorProficiencyUnarmored: return res.getString(R.string.skill_longdescription_armor_prof_unarmored, SkillCollection.PER_SKILLPOINT_INCREASE_UNARMORED_BC);
|
||||
case armorProficiencyLight: return res.getString(R.string.skill_longdescription_armor_prof_light, SkillCollection.PER_SKILLPOINT_INCREASE_LIGHT_ARMOR_BC_PERCENT);
|
||||
case armorProficiencyHeavy: return res.getString(R.string.skill_longdescription_armor_prof_heavy, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT);
|
||||
case armorProficiencyHeavy: return res.getString(R.string.skill_longdescription_armor_prof_heavy, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT);
|
||||
case fightstyleDualWield: return res.getString(R.string.skill_longdescription_fightstyle_dualwield, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL0, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL1, SkillCollection.DUALWIELD_LEVEL1_OFFHAND_AP_COST_PERCENT, SkillCollection.DUALWIELD_EFFICIENCY_LEVEL2);
|
||||
case fightstyle2hand: return res.getString(R.string.skill_longdescription_fightstyle_2hand, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_2HAND_DMG_PERCENT);
|
||||
case fightstyleWeaponShield: return res.getString(R.string.skill_longdescription_fightstyle_weapon_shield, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_WEAPON_AC_PERCENT, SkillCollection.PER_SKILLPOINT_INCREASE_FIGHTSTYLE_SHIELD_BC_PERCENT);
|
||||
|
||||
@@ -76,8 +76,7 @@ public final class ActorStatsController {
|
||||
c.magnitude -= magnitude;
|
||||
actorConditionListeners.onActorConditionMagnitudeChanged(actor, c);
|
||||
} else {
|
||||
actor.conditions.remove(i);
|
||||
actorConditionListeners.onActorConditionRemoved(actor, c);
|
||||
actorConditionsRemove(actor, c, i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -232,9 +231,9 @@ public final class ActorStatsController {
|
||||
public void removeAllTemporaryConditions(final Actor actor) {
|
||||
for(int i = actor.conditions.size() - 1; i >= 0; --i) {
|
||||
ActorCondition c = actor.conditions.get(i);
|
||||
if (!c.isTemporaryEffect()) continue;
|
||||
actor.conditions.remove(i);
|
||||
actorConditionListeners.onActorConditionRemoved(actor, c);
|
||||
if (c.isTemporaryEffect() || c.isDurationForeverUntilSleep()) {
|
||||
actorConditionsRemove(actor, c, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -242,8 +241,7 @@ public final class ActorStatsController {
|
||||
for(int i = actor.conditions.size() - 1; i >= 0; --i) {
|
||||
ActorCondition c = actor.conditions.get(i);
|
||||
if (!c.conditionType.conditionTypeID.equals(conditionTypeID)) continue;
|
||||
actor.conditions.remove(i);
|
||||
actorConditionListeners.onActorConditionRemoved(actor, c);
|
||||
actorConditionsRemove(actor, c, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -406,14 +404,14 @@ public final class ActorStatsController {
|
||||
ActorCondition c = actor.conditions.get(i);
|
||||
if (!c.isTemporaryEffect()) continue;
|
||||
if (c.duration <= 1) {
|
||||
actor.conditions.remove(i);
|
||||
actorConditionListeners.onActorConditionRemoved(actor, c);
|
||||
actorConditionsRemove(actor, c, i);
|
||||
removedAnyConditions = true;
|
||||
} else {
|
||||
c.duration -= 1;
|
||||
actorConditionListeners.onActorConditionDurationChanged(actor, c);
|
||||
}
|
||||
}
|
||||
// Immunities
|
||||
for(int i = actor.immunities.size() - 1; i >= 0; --i) {
|
||||
ActorCondition c = actor.immunities.get(i);
|
||||
if (!c.isTemporaryEffect()) continue;
|
||||
@@ -457,6 +455,50 @@ public final class ActorStatsController {
|
||||
}
|
||||
}
|
||||
|
||||
int actorConditionsRemove(Actor actor, ActorCondition c, int i) {
|
||||
int magnitude = 0; //default: No condition from worn items
|
||||
|
||||
if (actor instanceof Player) {
|
||||
Player player = (Player) actor;
|
||||
magnitude = gotConditionFromWornItem(player, c);
|
||||
if (magnitude > 0) { //condition from worn items?
|
||||
c.magnitude = magnitude; // -> readd condition
|
||||
actorConditionListeners.onActorConditionMagnitudeChanged(actor, c);
|
||||
c.duration = ActorCondition.DURATION_FOREVER;
|
||||
actorConditionListeners.onActorConditionDurationChanged(actor, c);
|
||||
}
|
||||
}
|
||||
if (magnitude == 0) {
|
||||
actor.conditions.remove(i);
|
||||
actorConditionListeners.onActorConditionRemoved(actor, c);
|
||||
}
|
||||
|
||||
return magnitude;
|
||||
}
|
||||
|
||||
int gotConditionFromWornItem(Player player, ActorCondition c) {
|
||||
int magnitude = 0; //Default: No worn item with this condition
|
||||
|
||||
for (Inventory.WearSlot slot : Inventory.WearSlot.values()) {
|
||||
ItemType t = player.inventory.getItemTypeInWearSlot(slot);
|
||||
if (t == null) continue;
|
||||
ItemTraits_OnEquip equipEffects = t.effects_equip;
|
||||
if (equipEffects == null) continue;
|
||||
if (equipEffects.addedConditions == null) continue;
|
||||
for (ActorConditionEffect e : equipEffects.addedConditions) {
|
||||
if (e.conditionType.conditionTypeID.equals(c.conditionType.conditionTypeID)) {
|
||||
if (e.magnitude == ActorCondition.MAGNITUDE_REMOVE_ALL) {
|
||||
return 0; //On an item-based immunity the result is always 0
|
||||
}
|
||||
if (magnitude < e.magnitude) {
|
||||
magnitude = e.magnitude;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return magnitude;
|
||||
}
|
||||
|
||||
public void applyUseEffect(Actor source, Actor target, ItemTraits_OnUse effect) {
|
||||
if (effect == null) return;
|
||||
|
||||
|
||||
@@ -250,7 +250,8 @@ public final class CombatController implements VisualEffectCompletedCallback {
|
||||
if (!loot.hasItemsOrGold()) {
|
||||
world.model.currentMaps.map.removeGroundLoot(loot);
|
||||
} else if (world.model.uiSelections.isInCombat) {
|
||||
killedMonsterBags.add(loot);
|
||||
if(!killedMonsterBags.contains(loot))
|
||||
killedMonsterBags.add(loot);
|
||||
}
|
||||
|
||||
combatActionListeners.onPlayerKilledMonster(killedMonster);
|
||||
|
||||
@@ -253,6 +253,7 @@ public final class SkillController {
|
||||
addPercentBlockChance(player, itemType, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT * skillLevelHeavyArmor, 0);
|
||||
playerTraits.moveCost -= getPercentage(itemType.effects_equip.stats.increaseMoveCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT * skillLevelHeavyArmor, 0);
|
||||
playerTraits.attackCost -= getPercentage(itemType.effects_equip.stats.increaseAttackCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT * skillLevelHeavyArmor, 0);
|
||||
playerTraits.useItemCost -= getPercentage(itemType.effects_equip.stats.increaseUseItemCost, SkillCollection.PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT * skillLevelHeavyArmor, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,14 +21,21 @@ import com.gpl.rpg.AndorsTrail.util.Coord;
|
||||
import com.gpl.rpg.AndorsTrail.util.CoordRect;
|
||||
import com.gpl.rpg.AndorsTrail.util.Size;
|
||||
|
||||
public final class VisualEffectController {
|
||||
private int effectCount = 0;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public final class VisualEffectController {
|
||||
private static final long EFFECT_UPDATE_INTERVAL = 25;
|
||||
private final ControllerContext controllers;
|
||||
private final WorldContext world;
|
||||
private final VisualEffectCollection effectTypes;
|
||||
private final Handler animationHandler = new Handler();
|
||||
private final List<VisualEffectAnimation> activeAnimations = new ArrayList<>();
|
||||
|
||||
public final VisualEffectFrameListeners visualEffectFrameListeners = new VisualEffectFrameListeners();
|
||||
private long getEffectUpdateInterval() {
|
||||
return EFFECT_UPDATE_INTERVAL * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS;
|
||||
}
|
||||
|
||||
public VisualEffectController(ControllerContext controllers, WorldContext world) {
|
||||
this.controllers = controllers;
|
||||
@@ -37,11 +44,41 @@ public final class VisualEffectController {
|
||||
}
|
||||
|
||||
public void startEffect(Coord position, VisualEffectCollection.VisualEffectID effectID, String displayValue, VisualEffectCompletedCallback callback, int callbackValue) {
|
||||
++effectCount;
|
||||
(new VisualEffectAnimation(effectTypes.getVisualEffect(effectID), position, displayValue, callback, callbackValue))
|
||||
.start();
|
||||
VisualEffectAnimation animation = new VisualEffectAnimation(effectTypes.getVisualEffect(effectID), position, displayValue, callback, callbackValue);
|
||||
animation.start();
|
||||
}
|
||||
|
||||
private void startAnimation(VisualEffectAnimation animation) {
|
||||
activeAnimations.add(animation);
|
||||
animation.update();
|
||||
if (activeAnimations.size() == 1) {
|
||||
animationHandler.postDelayed(animationRunnable, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private final Runnable animationRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if(!activeAnimations.isEmpty()) {
|
||||
long updateInterval = getEffectUpdateInterval();
|
||||
if(updateInterval > 0) animationHandler.postDelayed(this, updateInterval);
|
||||
|
||||
for (int i = 0; i < activeAnimations.size(); i++) {
|
||||
VisualEffectAnimation animation = activeAnimations.get(i);
|
||||
animation.durationPassed += updateInterval;
|
||||
animation.updateFrame();
|
||||
animation.update();
|
||||
if (controllers.preferences.attackspeed_milliseconds <= 0 || animation.currentFrame >= animation.effect.lastFrame) {
|
||||
animation.onCompleted();
|
||||
activeAnimations.remove(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
visualEffectFrameListeners.onNewAnimationFrames(activeAnimations);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private VisualEffectCollection.VisualEffectID enqueuedEffectID = null;
|
||||
private int enqueuedEffectValue = 0;
|
||||
public void enqueueEffect(VisualEffectCollection.VisualEffectID effectID, int displayValue) {
|
||||
@@ -60,15 +97,13 @@ public final class VisualEffectController {
|
||||
}
|
||||
|
||||
public void startActorMoveEffect(Actor actor, PredefinedMap map, Coord origin, Coord destination, int duration, VisualEffectCompletedCallback callback, int callbackValue) {
|
||||
++effectCount;
|
||||
(new SpriteMoveAnimation(origin, destination, duration, actor, map, callback, callbackValue))
|
||||
.start();
|
||||
}
|
||||
|
||||
public final class SpriteMoveAnimation extends Handler implements Runnable {
|
||||
|
||||
// private static final int millisecondsPerFrame=25;
|
||||
|
||||
public final class SpriteMoveAnimation implements Runnable {
|
||||
private final Handler handler = new Handler();
|
||||
|
||||
private final VisualEffectCompletedCallback callback;
|
||||
private final int callbackValue;
|
||||
|
||||
@@ -82,11 +117,6 @@ public final class VisualEffectController {
|
||||
@Override
|
||||
public void run() {
|
||||
onCompleted();
|
||||
// update();
|
||||
// if (System.currentTimeMillis() - actor.vfxStartTime >= duration) {
|
||||
// } else {
|
||||
// postDelayed(this, millisecondsPerFrame);
|
||||
// }
|
||||
}
|
||||
|
||||
public SpriteMoveAnimation(Coord origin, Coord destination, int duration, Actor actor, PredefinedMap map, VisualEffectCompletedCallback callback, int callbackValue) {
|
||||
@@ -99,19 +129,12 @@ public final class VisualEffectController {
|
||||
this.destination = destination;
|
||||
|
||||
}
|
||||
|
||||
// private void update() {
|
||||
//
|
||||
// visualEffectFrameListeners.onNewSpriteMoveFrame(this);
|
||||
// }
|
||||
|
||||
private void onCompleted() {
|
||||
--effectCount;
|
||||
actor.hasVFXRunning = false;
|
||||
if (callback != null) callback.onVisualEffectCompleted(callbackValue);
|
||||
visualEffectFrameListeners.onSpriteMoveCompleted(this);
|
||||
}
|
||||
|
||||
|
||||
public void start() {
|
||||
actor.hasVFXRunning = true;
|
||||
@@ -120,12 +143,9 @@ public final class VisualEffectController {
|
||||
visualEffectFrameListeners.onSpriteMoveStarted(this);
|
||||
if (duration == 0 || !controllers.preferences.enableUiAnimations) onCompleted();
|
||||
else {
|
||||
postDelayed(this, duration);
|
||||
handler.postDelayed(this, duration);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static final Paint textPaint = new Paint();
|
||||
@@ -134,41 +154,45 @@ public final class VisualEffectController {
|
||||
textPaint.setAlpha(255);
|
||||
textPaint.setTextAlign(Align.CENTER);
|
||||
}
|
||||
|
||||
public final class VisualEffectAnimation extends Handler implements Runnable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (currentFrame >= effect.lastFrame) {
|
||||
onCompleted();
|
||||
} else {
|
||||
postDelayed(this, effect.millisecondPerFrame * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS);
|
||||
update();
|
||||
/// only for combat effects, movement & blood splatters etc. are handled elsewhere.
|
||||
public final class VisualEffectAnimation {
|
||||
public int tileID;
|
||||
public int textYOffset;
|
||||
public long durationPassed = 0;
|
||||
|
||||
private void updateFrame() {
|
||||
long frameDuration = (long) effect.millisecondPerFrame * controllers.preferences.attackspeed_milliseconds / AndorsTrailPreferences.ATTACKSPEED_DEFAULT_MILLISECONDS;
|
||||
while (frameDuration > 0 && durationPassed > frameDuration) {
|
||||
currentFrame++;
|
||||
durationPassed -= frameDuration;
|
||||
}
|
||||
}
|
||||
|
||||
private void update() {
|
||||
++currentFrame;
|
||||
int frame = currentFrame;
|
||||
|
||||
int tileID = effect.frameIconIDs[frame];
|
||||
int textYOffset = -2 * (frame);
|
||||
if (frame >= beginFadeAtFrame && displayText != null) {
|
||||
textPaint.setAlpha(255 * (effect.lastFrame - frame) / (effect.lastFrame - beginFadeAtFrame));
|
||||
if (currentFrame >= effect.lastFrame) {
|
||||
return;
|
||||
}
|
||||
|
||||
tileID = effect.frameIconIDs[currentFrame];
|
||||
textYOffset = -2 * (currentFrame);
|
||||
|
||||
if (currentFrame >= beginFadeAtFrame && displayText != null) {
|
||||
textPaint.setAlpha(255 * (effect.lastFrame - currentFrame) / (effect.lastFrame - beginFadeAtFrame));
|
||||
}
|
||||
|
||||
area.topLeft.y = position.y - 1;
|
||||
visualEffectFrameListeners.onNewAnimationFrame(this, tileID, textYOffset);
|
||||
}
|
||||
|
||||
private void onCompleted() {
|
||||
--effectCount;
|
||||
visualEffectFrameListeners.onAnimationCompleted(this);
|
||||
if (callback != null) callback.onVisualEffectCompleted(callbackValue);
|
||||
}
|
||||
|
||||
public void start() {
|
||||
if (!controllers.preferences.enableUiAnimations) onCompleted();
|
||||
else postDelayed(this, 0);
|
||||
if (!controllers.preferences.enableUiAnimations
|
||||
|| effect.duration == 0
|
||||
|| controllers.preferences.attackspeed_milliseconds <= 0) onCompleted();
|
||||
else startAnimation(this);
|
||||
}
|
||||
|
||||
private int currentFrame = 0;
|
||||
@@ -197,7 +221,7 @@ public final class VisualEffectController {
|
||||
this.area = new CoordRect(new Coord(position.x - (widthNeededInTiles / 2), position.y - 1), new Size(widthNeededInTiles, 2));
|
||||
this.beginFadeAtFrame = effect.lastFrame / 2;
|
||||
}
|
||||
|
||||
|
||||
public Paint getTextPaint(){
|
||||
return textPaint;
|
||||
}
|
||||
@@ -208,7 +232,7 @@ public final class VisualEffectController {
|
||||
}
|
||||
|
||||
public boolean isRunningVisualEffect() {
|
||||
return effectCount > 0;
|
||||
return !activeAnimations.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@@ -268,10 +292,10 @@ public final class VisualEffectController {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void asyncUpdateArea(CoordRect area) {
|
||||
visualEffectFrameListeners.onAsyncAreaUpdate(area);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ 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.TMXMapTranslator;
|
||||
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;
|
||||
@@ -314,4 +315,32 @@ public final class WorldMapController {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void populateWorldMap(Context context, WorldContext world, Resources res) throws IOException {
|
||||
ensureWorldmapDirectoryExists(context);
|
||||
File dir = getWorldmapDirectory(context);
|
||||
|
||||
File idFile = new File(dir, world.model.player.id);
|
||||
if (idFile.exists()) return;
|
||||
idFile.createNewFile();
|
||||
|
||||
for (PredefinedMap map : world.maps.getAllMaps()) {
|
||||
if (!map.visited) continue;
|
||||
|
||||
String worldMapSegmentName = world.maps.getWorldMapSegmentNameForMap(map.name);
|
||||
if (worldMapSegmentName == null) continue;
|
||||
|
||||
boolean mapFileExists = fileForMapExists(context, map);
|
||||
File worldMapFile = getCombinedWorldMapFile(context, worldMapSegmentName);
|
||||
if (mapFileExists && worldMapFile.exists()) continue;
|
||||
|
||||
LayeredTileMap mapTiles = TMXMapTranslator.readLayeredTileMap(res, world.tileManager.tileCache, map);
|
||||
mapTiles.changeColorFilter(map.currentColorFilter);
|
||||
TileCollection cachedTiles = world.tileManager.loadTilesFor(map, mapTiles, world, res);
|
||||
|
||||
MapRenderer renderer = new MapRenderer(world, map, mapTiles, cachedTiles);
|
||||
updateCachedBitmap(context, map, renderer);
|
||||
updateWorldMapSegment(context, res, world, worldMapSegmentName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,10 @@ import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.SpriteMoveAnima
|
||||
import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAnimation;
|
||||
import com.gpl.rpg.AndorsTrail.util.CoordRect;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface VisualEffectFrameListener {
|
||||
void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset);
|
||||
void onNewAnimationFrames(List<VisualEffectAnimation> effects);
|
||||
void onAnimationCompleted(VisualEffectAnimation animation);
|
||||
void onSpriteMoveStarted(SpriteMoveAnimation animation);
|
||||
void onNewSpriteMoveFrame(SpriteMoveAnimation animation);
|
||||
|
||||
@@ -5,10 +5,12 @@ import com.gpl.rpg.AndorsTrail.controller.VisualEffectController.VisualEffectAni
|
||||
import com.gpl.rpg.AndorsTrail.util.CoordRect;
|
||||
import com.gpl.rpg.AndorsTrail.util.ListOfListeners;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class VisualEffectFrameListeners extends ListOfListeners<VisualEffectFrameListener> implements VisualEffectFrameListener {
|
||||
|
||||
private final Function3<VisualEffectFrameListener, VisualEffectAnimation, Integer, Integer> onNewAnimationFrame = new Function3<VisualEffectFrameListener, VisualEffectAnimation, Integer, Integer>() {
|
||||
@Override public void call(VisualEffectFrameListener listener, VisualEffectAnimation animation, Integer tileID, Integer textYOffset) { listener.onNewAnimationFrame(animation, tileID, textYOffset); }
|
||||
private final Function1<VisualEffectFrameListener, List<VisualEffectAnimation>> onNewAnimationFrames = new Function1<VisualEffectFrameListener, List<VisualEffectAnimation>>() {
|
||||
@Override public void call(VisualEffectFrameListener listener, List<VisualEffectAnimation> effects) { listener.onNewAnimationFrames(effects); }
|
||||
};
|
||||
|
||||
private final Function1<VisualEffectFrameListener, VisualEffectAnimation> onAnimationCompleted = new Function1<VisualEffectFrameListener, VisualEffectAnimation>() {
|
||||
@@ -30,10 +32,10 @@ public final class VisualEffectFrameListeners extends ListOfListeners<VisualEffe
|
||||
private final Function1<VisualEffectFrameListener, CoordRect> onAsyncAreaUpdate = new Function1<VisualEffectFrameListener, CoordRect>() {
|
||||
@Override public void call(VisualEffectFrameListener listener, CoordRect area) { listener.onAsyncAreaUpdate(area); }
|
||||
};
|
||||
|
||||
|
||||
@Override
|
||||
public void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset) {
|
||||
callAllListeners(this.onNewAnimationFrame, animation, tileID, textYOffset);
|
||||
public void onNewAnimationFrames(List<VisualEffectAnimation> effects) {
|
||||
callAllListeners(this.onNewAnimationFrames, effects);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.gpl.rpg.AndorsTrail.context.WorldContext;
|
||||
public final class ActorCondition {
|
||||
public static final int MAGNITUDE_REMOVE_ALL = -99;
|
||||
public static final int DURATION_FOREVER = 999;
|
||||
public static final int DURATION_FOREVER_UNTIL_SLEEP = 998;
|
||||
public static final int DURATION_NONE = 0;
|
||||
|
||||
public final ActorConditionType conditionType;
|
||||
@@ -27,7 +28,12 @@ public final class ActorCondition {
|
||||
|
||||
public boolean isTemporaryEffect() { return isTemporaryEffect(duration); }
|
||||
public static boolean isTemporaryEffect(int duration) {
|
||||
return duration != DURATION_FOREVER;
|
||||
return ( duration != DURATION_FOREVER && duration != DURATION_FOREVER_UNTIL_SLEEP );
|
||||
}
|
||||
|
||||
public boolean isDurationForeverUntilSleep() { return isDurationForeverUntilSleep(duration); }
|
||||
public static boolean isDurationForeverUntilSleep(int duration) {
|
||||
return ( duration == DURATION_FOREVER_UNTIL_SLEEP );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@ public final class SkillCollection {
|
||||
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_BC_PERCENT = 20;
|
||||
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_MOVECOST_PERCENT = 25;
|
||||
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_ATKCOST_PERCENT = 25;
|
||||
public static final int PER_SKILLPOINT_INCREASE_HEAVY_ARMOR_USECOST_PERCENT = 25;
|
||||
public static final int PER_SKILLPOINT_INCREASE_FIGHTSTYLE_2HAND_DMG_PERCENT = 30;
|
||||
public static final int PER_SKILLPOINT_INCREASE_SPECIALIZATION_2HAND_DMG_PERCENT = 50;
|
||||
public static final int PER_SKILLPOINT_INCREASE_SPECIALIZATION_2HAND_AC_PERCENT = 20;
|
||||
|
||||
@@ -256,9 +256,11 @@ public final class ResourceLoader {
|
||||
final Size sz2x2 = new Size(2, 2);
|
||||
final Size sz2x3 = new Size(2, 3);
|
||||
final Size sz3x1 = new Size(3, 1);
|
||||
final Size sz4x1 = new Size(4, 1);
|
||||
final Size sz5x1 = new Size(5, 1);
|
||||
final Size sz6x1 = new Size(6, 1);
|
||||
final Size sz7x1 = new Size(7, 1);
|
||||
final Size sz7x4 = new Size(7, 4);
|
||||
final Size sz8x3 = new Size(8, 3);
|
||||
final Size sz16x8 = new Size(16, 8);
|
||||
final Size sz20x12 = new Size(20, 12);
|
||||
@@ -321,7 +323,7 @@ public final class ResourceLoader {
|
||||
loader.prepareTileset(R.drawable.monsters_cyclops, "monsters_cyclops", sz1x1, sz2x3, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_demon1, "monsters_demon1", sz1x1, sz2x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_demon2, "monsters_demon2", sz1x1, sz2x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_dogs, "monsters_dogs", sz7x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_dogs, "monsters_dogs", sz7x4, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_eye1, "monsters_eye1", sz1x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_eye2, "monsters_eye2", sz1x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_eye3, "monsters_eye3", sz1x1, sz1x1, mTileSize);
|
||||
@@ -341,9 +343,9 @@ public final class ResourceLoader {
|
||||
loader.prepareTileset(R.drawable.monsters_men2, "monsters_men2", new Size(10, 1), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_misc, "monsters_misc", new Size(13, 1), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_1, "monsters_newb_1", new Size(40, 34), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_2, "monsters_newb_2", new Size(16, 2), sz1x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_3, "monsters_newb_3", new Size(20, 4), sz2x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_4, "monsters_newb_4", new Size(4, 2), sz2x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_2, "monsters_newb_2", new Size(8, 2), sz1x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_3, "monsters_newb_3", new Size(10, 2), sz2x2, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_newb_4, "monsters_newb_4", new Size(4, 1), sz2x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_rats, "monsters_rats", new Size(5, 1), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_redshrike1, "monsters_redshrike1", sz7x1, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.monsters_rltiles1, "monsters_rltiles1", new Size(20, 8), sz1x1, mTileSize);
|
||||
@@ -383,10 +385,11 @@ public final class ResourceLoader {
|
||||
/*INSERT_NPCS_TILESETS_HERE*/
|
||||
|
||||
loader.prepareTileset(R.drawable.map_bed_1, "map_bed_1", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_boats_1, "map_boats_1", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_boats_1, "map_boats_1", new Size(16, 9), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_border_1, "map_border_1", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_bridge_1, "map_bridge_1", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_bridge_2, "map_bridge_2", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_brightport, "map_brightport", new Size(16, 7), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_broken_1, "map_broken_1", mapTileSize, sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_cavewall_1, "map_cavewall_1", new Size(18, 6), sz1x1, mTileSize);
|
||||
loader.prepareTileset(R.drawable.map_cavewall_2, "map_cavewall_2", new Size(18, 6), sz1x1, mTileSize);
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.xmlpull.v1.XmlPullParserException;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.XmlResourceParser;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.MapCollection;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment;
|
||||
import com.gpl.rpg.AndorsTrail.model.map.WorldMapSegment.NamedWorldMapArea;
|
||||
@@ -24,11 +25,13 @@ public final class WorldMapParser {
|
||||
}
|
||||
|
||||
private static void read(XmlResourceParser xrp, final MapCollection maps, final TranslationLoader translationLoader) {
|
||||
String s = "";
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("WorldMapParser:");
|
||||
try {
|
||||
int eventType;
|
||||
while ((eventType = xrp.next()) != XmlResourceParser.END_DOCUMENT) {
|
||||
if (eventType == XmlResourceParser.START_TAG) {
|
||||
String s = xrp.getName();
|
||||
s = xrp.getName();
|
||||
if (s.equals("segment")) {
|
||||
WorldMapSegment segment = parseSegment(xrp, maps, translationLoader);
|
||||
maps.worldMapSegments.put(segment.name, segment);
|
||||
@@ -37,7 +40,7 @@ public final class WorldMapParser {
|
||||
}
|
||||
xrp.close();
|
||||
} catch (Exception e) {
|
||||
L.log("Error reading worldmap: " + e.toString());
|
||||
L.log("Error reading worldmap: " + s + " " + e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,11 +49,13 @@ public final class WorldMapParser {
|
||||
final WorldMapSegment segment = new WorldMapSegment(segmentName);
|
||||
|
||||
final ArrayList<Pair<String, String>> mapsInNamedAreas = new ArrayList<Pair<String,String>>();
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("segment: " + segmentName);
|
||||
XmlResourceParserUtils.readCurrentTagUntilEnd(xrp, new XmlResourceParserUtils.TagHandler() {
|
||||
@Override
|
||||
public void handleTag(XmlResourceParser xrp, String tagName) throws XmlPullParserException, IOException {
|
||||
if (tagName.equals("map")) {
|
||||
String mapName = xrp.getAttributeValue(null, "id");
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log(" map: " + mapName);
|
||||
if (maps.findPredefinedMap(mapName) == null) return;
|
||||
Coord mapPosition = new Coord(
|
||||
xrp.getAttributeIntValue(null, "x", -1),
|
||||
@@ -65,6 +70,7 @@ public final class WorldMapParser {
|
||||
String id = xrp.getAttributeValue(null, "id");
|
||||
String name = translationLoader.translateWorldmapLocation(xrp.getAttributeValue(null, "name"));
|
||||
String type = xrp.getAttributeValue(null, "type");
|
||||
if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log(" namedarea: id=" + id + " name=" + name + " type=" + type);
|
||||
segment.namedAreas.put(id, new NamedWorldMapArea(id, name, type));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,14 +76,17 @@ public final class TileCache {
|
||||
ResourceFileTile tile = resourceTiles[tileID];
|
||||
if(tile == null && AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES){
|
||||
L.log("could not find resourceTiles for id: " + tileID);
|
||||
L.log("iconIDs: " + iconIDs);
|
||||
}
|
||||
SparseArray<ResourceFileTile> tiles = tilesToLoadPerSourceFile.get(tile.tileset);
|
||||
if (tiles == null) {
|
||||
tiles = new SparseArray<TileCache.ResourceFileTile>();
|
||||
tilesToLoadPerSourceFile.put(tile.tileset, tiles);
|
||||
if(tile != null || AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA){
|
||||
SparseArray<ResourceFileTile> tiles = tilesToLoadPerSourceFile.get(tile.tileset);
|
||||
if (tiles == null) {
|
||||
tiles = new SparseArray<TileCache.ResourceFileTile>();
|
||||
tilesToLoadPerSourceFile.put(tile.tileset, tiles);
|
||||
}
|
||||
tiles.put(tileID, tile);
|
||||
maxTileID = Math.max(maxTileID, tileID);
|
||||
}
|
||||
tiles.put(tileID, tile);
|
||||
maxTileID = Math.max(maxTileID, tileID);
|
||||
}
|
||||
|
||||
boolean hasLoadedTiles = false;
|
||||
|
||||
@@ -27,6 +27,7 @@ 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.controller.WorldMapController;
|
||||
import com.gpl.rpg.AndorsTrail.model.ModelContainer;
|
||||
import com.gpl.rpg.AndorsTrail.resource.tiles.TileManager;
|
||||
import com.gpl.rpg.AndorsTrail.util.AndroidStorage;
|
||||
@@ -104,7 +105,7 @@ public final class Savegames {
|
||||
}
|
||||
|
||||
FileInputStream fos = getInputFile(androidContext, slot);
|
||||
LoadSavegameResult result = loadWorld(androidContext.getResources(), world, controllers, fos, fh);
|
||||
LoadSavegameResult result = loadWorld(androidContext.getResources(), world, controllers, androidContext, fos, fh);
|
||||
fos.close();
|
||||
if (result == LoadSavegameResult.success && slot != SLOT_QUICKSAVE && !world.model.statistics.hasUnlimitedSaves()) {
|
||||
// save to the quicksave slot before deleting the file
|
||||
@@ -223,7 +224,7 @@ public final class Savegames {
|
||||
dest.close();
|
||||
}
|
||||
|
||||
public static LoadSavegameResult loadWorld(Resources res, WorldContext world, ControllerContext controllers, InputStream inState, FileHeader fh) throws IOException {
|
||||
public static LoadSavegameResult loadWorld(Resources res, WorldContext world, ControllerContext controllers, Context androidContext, InputStream inState, FileHeader fh) throws IOException {
|
||||
DataInputStream src = new DataInputStream(inState);
|
||||
final FileHeader header = new FileHeader(src, fh.skipIcon);
|
||||
if (header.fileversion > AndorsTrailApplication.CURRENT_VERSION)
|
||||
@@ -231,6 +232,7 @@ public final class Savegames {
|
||||
|
||||
world.maps.readFromParcel(src, world, controllers, header.fileversion);
|
||||
world.model = new ModelContainer(src, world, controllers, header.fileversion);
|
||||
WorldMapController.populateWorldMap(androidContext, world, controllers.getResources());
|
||||
src.close();
|
||||
|
||||
if (header.fileversion < 45) {
|
||||
|
||||
@@ -30,6 +30,18 @@ public final class CoordRect {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static CoordRect union(CoordRect r1, CoordRect r2) {
|
||||
int left = Math.min(r1.topLeft.x, r2.topLeft.x);
|
||||
int top = Math.min(r1.topLeft.y, r2.topLeft.y);
|
||||
int right = Math.max(r1.topLeft.x + r1.size.width, r2.topLeft.x + r2.size.width);
|
||||
int bottom = Math.max(r1.topLeft.y + r1.size.height, r2.topLeft.y + r2.size.height);
|
||||
|
||||
int width = right - left;
|
||||
int height = bottom - top;
|
||||
|
||||
return new CoordRect(new Coord(left, top), new Size(width, height));
|
||||
}
|
||||
|
||||
/*
|
||||
public static boolean contains(final int x, final int y, final Size size, final Coord p) {
|
||||
if (p.x < x) return false;
|
||||
|
||||
@@ -292,6 +292,8 @@ public final class DisplayActiveActorConditionIcons implements ActorConditionLis
|
||||
}
|
||||
if (condition.duration == ActorCondition.DURATION_FOREVER || condition.duration == ActorCondition.DURATION_NONE) {
|
||||
duration = "\u221e";
|
||||
} else if (condition.duration == ActorCondition.DURATION_FOREVER_UNTIL_SLEEP) {
|
||||
duration = "";
|
||||
} else {
|
||||
duration = Integer.toString(condition.duration);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.gpl.rpg.AndorsTrail.view;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
|
||||
import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences;
|
||||
@@ -158,8 +159,8 @@ public final class MainView extends SurfaceView
|
||||
// this.surfaceSize = new Size(w, h);
|
||||
this.surfaceSize = new Size((int) (getWidth() / scale), (int) (getHeight() / scale));
|
||||
this.screenSizeTileCount = new Size(
|
||||
(int) Math.floor(getWidth() / scaledTileSize)
|
||||
,(int) Math.floor(getHeight() / scaledTileSize)
|
||||
getWidth() / scaledTileSize
|
||||
,getHeight() / scaledTileSize
|
||||
);
|
||||
|
||||
if (sh.getSurfaceFrame().right != surfaceSize.width || sh.getSurfaceFrame().bottom != surfaceSize.height) {
|
||||
@@ -226,28 +227,28 @@ public final class MainView extends SurfaceView
|
||||
if (scrolling && why != RedrawAllDebugReason.MapScrolling) return;
|
||||
if (!scrolling && movingSprites > 0 && why != RedrawAllDebugReason.SpriteMoved) return;
|
||||
}
|
||||
redrawArea_(mapViewArea, null, 0, 0);
|
||||
redrawArea_(mapViewArea, null);
|
||||
}
|
||||
private void redrawTile(final Coord p, RedrawTileDebugReason why) {
|
||||
if (scrolling) return;
|
||||
p1x1.topLeft.set(p);
|
||||
redrawArea_(p1x1, null, 0, 0);
|
||||
redrawArea_(p1x1, null);
|
||||
}
|
||||
private void redrawArea(final CoordRect area, RedrawAreaDebugReason why) {
|
||||
if (scrolling) return;
|
||||
redrawArea_(area, null, 0, 0);
|
||||
redrawArea_(area, null);
|
||||
}
|
||||
private void redrawArea_(CoordRect area, final VisualEffectAnimation effect, int tileID, int textYOffset) {
|
||||
private void redrawArea_(CoordRect area, final List<VisualEffectAnimation> effects) {
|
||||
if (!hasSurface) return;
|
||||
|
||||
|
||||
|
||||
if (!currentMap.intersects(area)) return;
|
||||
if (!mapViewArea.intersects(area)) return;
|
||||
|
||||
if (shouldRedrawEverything()) {
|
||||
area = mapViewArea;
|
||||
}
|
||||
|
||||
|
||||
calculateRedrawRect(area);
|
||||
redrawRect.intersect(redrawClip);
|
||||
Canvas c = null;
|
||||
@@ -263,7 +264,7 @@ public final class MainView extends SurfaceView
|
||||
if (area == mapViewArea) {
|
||||
area = adaptAreaToScrolling(area);
|
||||
}
|
||||
|
||||
|
||||
synchronized (holder) { synchronized (tiles) {
|
||||
int xScroll = 0;
|
||||
int yScroll = 0;
|
||||
@@ -275,32 +276,25 @@ public final class MainView extends SurfaceView
|
||||
}
|
||||
c.clipRect(redrawClip);
|
||||
c.translate(screenOffset.x + xScroll, screenOffset.y + yScroll);
|
||||
// c.scale(scale, scale);
|
||||
doDrawRect(c, area);
|
||||
if (effect != null) {
|
||||
drawFromMapPosition(c, area, effect.position, tileID);
|
||||
if (effect.displayText != null) {
|
||||
drawEffectText(c, area, effect, textYOffset, effect.getTextPaint());
|
||||
}
|
||||
}
|
||||
|
||||
// c.drawRect(new Rect(
|
||||
// (area.topLeft.x - mapViewArea.topLeft.x) * tileSize,
|
||||
// (area.topLeft.y - mapViewArea.topLeft.y) * tileSize,
|
||||
// (area.topLeft.x - mapViewArea.topLeft.x + area.size.width) * tileSize - 1,
|
||||
// (area.topLeft.y - mapViewArea.topLeft.y + area.size.height) * tileSize - 1),
|
||||
// redrawHighlight);
|
||||
// if (touchedTile != null) c.drawRect(new Rect(
|
||||
// (touchedTile.x - mapViewArea.topLeft.x) * tileSize,
|
||||
// (touchedTile.y - mapViewArea.topLeft.y) * tileSize,
|
||||
// (touchedTile.x - mapViewArea.topLeft.x + 1) * tileSize - 1,
|
||||
// (touchedTile.y - mapViewArea.topLeft.y + 1) * tileSize - 1),
|
||||
// touchHighlight);
|
||||
renderEffects(c, effects);
|
||||
} }
|
||||
} finally {
|
||||
if (c != null) holder.unlockCanvasAndPost(c);
|
||||
}
|
||||
}
|
||||
|
||||
private void renderEffects(Canvas canvas ,List<VisualEffectAnimation> effects) {
|
||||
if(effects == null) return;
|
||||
for (VisualEffectAnimation effect : effects) {
|
||||
int tileID = effect.tileID;
|
||||
int textYOffset = effect.textYOffset;
|
||||
drawFromMapPosition(canvas, effect.area, effect.position, tileID);
|
||||
if (effect.displayText != null) {
|
||||
drawEffectText(canvas, effect.area, effect, textYOffset, effect.getTextPaint());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isRedrawRectWholeScreen(Rect redrawRect) {
|
||||
// if (redrawRect.width() < mapViewArea.size.width * scaledTileSize) return false;
|
||||
@@ -317,11 +311,21 @@ public final class MainView extends SurfaceView
|
||||
return true;
|
||||
}
|
||||
private final Rect redrawRect = new Rect();
|
||||
private void redrawAreaWithEffect(final VisualEffectAnimation effect, int tileID, int textYOffset) {
|
||||
CoordRect area = effect.area;
|
||||
// if (shouldRedrawEverythingForVisualEffect()) area = mapViewArea;
|
||||
redrawArea_(area, effect, tileID, textYOffset);
|
||||
private void redrawAreaWithEffect(List<VisualEffectAnimation> effects) {
|
||||
CoordRect area = null;
|
||||
for (int i = 0; i < effects.size(); i++) {
|
||||
VisualEffectAnimation effect = effects.get(i);
|
||||
if (area == null) {
|
||||
area = effect.area;
|
||||
} else {
|
||||
area = CoordRect.union(area, effect.area);
|
||||
}
|
||||
}
|
||||
if (area != null) {
|
||||
redrawArea_(area, effects);
|
||||
}
|
||||
}
|
||||
|
||||
private void clearCanvas() {
|
||||
if (!hasSurface) return;
|
||||
Canvas c = null;
|
||||
@@ -794,8 +798,8 @@ public final class MainView extends SurfaceView
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewAnimationFrame(VisualEffectAnimation animation, int tileID, int textYOffset) {
|
||||
redrawAreaWithEffect(animation, tileID, textYOffset);
|
||||
public void onNewAnimationFrames(List<VisualEffectAnimation> effects) {
|
||||
redrawAreaWithEffect(effects);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,17 +1,17 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
google()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.4.0'
|
||||
classpath 'com.android.tools.build:gradle:8.3.1'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
google()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,4 @@
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonFinalResIds=false
|
||||
android.nonTransitiveRClass=false
|
||||
android.useAndroidX=true
|
||||
@@ -1,6 +1,6 @@
|
||||
#Mon Jan 30 18:12:43 CET 2023
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
|
||||
distributionPath=wrapper/dists
|
||||
zipStorePath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -1,6 +1,198 @@
|
||||
I put both (release notes + forum announcement) into this source, so it will be easier to maintain them parallel:
|
||||
|
||||
|
||||
APK 78 (0.8.12) Towards Feygard
|
||||
|
||||
Release notes
|
||||
=============
|
||||
APK 78 (0.8.12) "Towards Feygard" or "Of kobolds, fae, witch and troll"
|
||||
|
||||
Release notes
|
||||
=============
|
||||
* 38 new maps mostly around the Guynmart castle area
|
||||
* 5 new quests:
|
||||
"It's Knot Funny" (from Wesley)
|
||||
"Fog in the woods"
|
||||
"Sobby's Trail"
|
||||
"Echoes of Enchantment"
|
||||
"A Feygard delicacy"
|
||||
* Missing Gylew fixed
|
||||
* Missing world map thumbnails are now automatically recreated when loading a savegame (thx to Jasp!).
|
||||
* Removal of unnecessary duplicate spritesheets (thx to OMGeeky).
|
||||
* Fix of flickering animations during combat
|
||||
* Fix of the glitch that made it possible to remove a condition of some items
|
||||
* Many minor map fixes, typos and other little things
|
||||
* Translations
|
||||
---- shortened for Google:
|
||||
* 38 new maps mostly around the Guynmart castle area
|
||||
* 5 new quests:
|
||||
"It's Knot Funny" (from Wesley)
|
||||
"Fog in the woods"
|
||||
"Sobby's Trail"
|
||||
"Echoes of Enchantment"
|
||||
"A Feygard delicacy"
|
||||
* Missing world map thumbnails are now automatically recreated
|
||||
* Fix of flickering animations during combat
|
||||
* Fix of the glitch that made it possible to remove a condition of some items
|
||||
* Minor map fixes, translations
|
||||
|
||||
|
||||
Forum announcement //2024-10-14
|
||||
==================
|
||||
Hello fellow adventurers,
|
||||
|
||||
you won't reach Feygard, but you'll be able to travel quite a bit on the way there. And encounter some unusual creatures:
|
||||
|
||||
Already near Fallhaven you will meet small cheeky Lytwings. They are driving Arensia from Fallhaven crazy.
|
||||
Wesley surprised us with this quest. I would like to emphasize the excellent quality of the development, we were able to adopt it practically without corrections or rework. Thank you, Wesley :)
|
||||
|
||||
You will finally solve the mystery of the fog in the northeast and make an interesting acquaintance in the process.
|
||||
|
||||
What does a boy have to do with kobolds?
|
||||
|
||||
And you will discover an abandoned village and its secret, and get another sweet quest as reward.
|
||||
|
||||
|
||||
[list]38 new maps mostly around the Guynmart castle area[/list]
|
||||
[list]5 new quests:
|
||||
[list]"It's Knot Funny"
|
||||
- A few lytwings are driving Arensia from Fallhaven crazy. (Wesley)[/list]
|
||||
[list]"Fog in the woods"
|
||||
- The great Duleian road is now accessible further northwest.[/list]
|
||||
[list]"Sobby's Trail"
|
||||
- Some things exist twice ...[/list]
|
||||
[list]"Echoes of Enchantment"
|
||||
- A strange village and its secret.[/list]
|
||||
[list]"A Feygard delicacy"
|
||||
- Antison is trying by all means to make Feygard attractive to you... [/list]
|
||||
[/list]
|
||||
[list]Gylew missing - fixed: If you don't find Gylew at his usual place (and before doing his quest), then seek in the bushes north west of his camp.[/list]
|
||||
[list]If for any reason some world maps are incomplete or missing at all, it is no longer necessary to visit these locations individually. Missing world map thumbnails are now automatically recreated when loading a savegame. Thanks to Jasp who had created this useful additions already years ago, it got into the game now.[/list]
|
||||
[list]Many maps had contained duplicate spritesheets unnecessarily. You didn't notice it, but it enlarged the APK size. OMGeeky has built a tool, so that we could merge these duplicates.
|
||||
(If you happen to find missing tiles in any map, please tell us!)[/list]
|
||||
[list]Fix of flickering animations during combat[/list]
|
||||
[list]Fix of the glitch that made it possible to remove a condition of some items[/list]
|
||||
[list]Many other minor map fixes, typos and other little things[/list]
|
||||
[list]And at last thanks to all translators for their work - we have included the current translations.[/list]
|
||||
|
||||
|
||||
Now here is is the link on our server: [url]https://andorstrail.com/static/AndorsTrail_v0.8.12.apk[/url]
|
||||
Google Play, F-Droid and Itch will follow soon.
|
||||
|
||||
Note: The first start might take long, maybe even minutes. Be patient, world map files are generated. This is only on first start.
|
||||
|
||||
And now: Happy playing! :D
|
||||
--------------
|
||||
Are you now eager to dive into the story?
|
||||
As usual, we have prepared a beta for you. Try it out, enjoy the new quests! And pay attention to inconsistencies, errors or other opportunities for improvement.
|
||||
Please post your comments here in this thread or on Discord in the Beta testing channel.
|
||||
This helps us to create a release version in good quality again.
|
||||
|
||||
A separate beta APK will be created so that you are independent of your productive game. Your saved games will remain untouched there.
|
||||
Tip: You can export a saved game and import it into the beta (but never the other way around).
|
||||
|
||||
|
||||
Here is is the link on our server: [url]https://andorstrail.com/static/AndorsTrail_v0.8.12_beta.apk[/url]
|
||||
And don’t forget to give us feedback about mistakes, what is good and what you don’t like.
|
||||
|
||||
Happy playing!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
APK 77 (0.8.11) Lake Laeroth
|
||||
|
||||
Release notes
|
||||
=============
|
||||
* 6 new quests together with 62 new maps around Remgard and in the Lake Laeroth area:
|
||||
"The odd coin collector"
|
||||
"Take care of the caretaker"
|
||||
"The last lord of Laeroth"
|
||||
"Shadow of the torturer"
|
||||
"Not Pony Island"
|
||||
"Brutes"
|
||||
* Minor map fixes, typos and other little things
|
||||
* Translations
|
||||
|
||||
|
||||
Forum announcement //2024-06-16
|
||||
==================
|
||||
Hello fellow adventurers,
|
||||
|
||||
These maps and quests took several years in development as we kept interrupting the work on it to publish other releases.
|
||||
Now it's finally finished!
|
||||
All of this is located near Remgard, filling up the great Lake Laeroth a bit with maps and life.
|
||||
|
||||
There are 6 new quests to find:
|
||||
[list] "The odd coin collector"
|
||||
Starts at Gylew at the waterway[/list]
|
||||
[list] "Take care of the caretaker"
|
||||
Starts in Laeroth Manor[/list]
|
||||
[list] "The last lord of Laeroth"
|
||||
Starts in Laeroth Manor, directly after the caretaker quests[/list]
|
||||
[list] "Shadow of the torturer"
|
||||
Starts in the Manor dungeons[/list]
|
||||
[list] "Not Pony Island"
|
||||
Go through the Remgard church basement[/list]
|
||||
[list] "Brutes"
|
||||
You must have completed "A difference of opinion (sisterfight)". Then walk from Arulir mountain towards Remgard and watch out for a fisherman[/list]
|
||||
|
||||
62 new maps around Remgard and in the Lake Laeroth area are waiting to be discovered by you.
|
||||
|
||||
|
||||
Here is is the link on our server: [url]https://andorstrail.com/static/AndorsTrail_v0.8.11.apk[/url]
|
||||
Google Play, F-Droid and Itch will follow soon.
|
||||
|
||||
Happy playing!
|
||||
|
||||
|
||||
|
||||
|
||||
APK 76 (0.8.10) BWM Fill
|
||||
|
||||
Release notes
|
||||
=============
|
||||
* 9 new maps that helps to cover the hole in the worldmap at Blackwater Mountain
|
||||
* New quest "It makes no fence"
|
||||
* Again a skeleton for "Stoutford's old castle" could have been out of reach. We hope this is the last one
|
||||
* Some minor map fixes
|
||||
* Translations
|
||||
|
||||
|
||||
Forum announcement //2024-04-28
|
||||
==================
|
||||
Hello fellow adventurers,
|
||||
|
||||
|
||||
a few weeks ago Raphi had surprised us with a bunch of maps that helps to cover the hole in the worldmap at Blackwater Mountain 8-)
|
||||
Thank you for the fiddly work in this area of the mountains, lovers of complete maps will appreciate it!
|
||||
Mountains are among the most difficult maps, especially if there already exist maps around them, because the different heights have to match each other exactly.
|
||||
|
||||
Raphi has also placed a new quest there for the early midgame level, involving some of Dhayavar's existing residents.
|
||||
|
||||
We have fine-tuned the project and are publishing it here now:
|
||||
|
||||
[list]Find 9 new maps filling up the Blackwater Mountain area.[/list]
|
||||
|
||||
[list]Help a shepherd in the Mountains above Prim in the new quest "It makes no fence".[/list]
|
||||
|
||||
[list]Again a skeleton for "Stoutford's old castle" could have been out of reach. We hope this is the last one.[/list]
|
||||
|
||||
[list]New translations[/list]
|
||||
|
||||
[list]And as always we've fixed some minor bugs and typos, and have embellished a few little things here and there.[/list]
|
||||
|
||||
|
||||
Here is is the link on our server: [url]https://andorstrail.com/static/AndorsTrail_v0.8.10.apk[/url]
|
||||
Google Play, F-Droid and Itch will follow soon.
|
||||
|
||||
Happy playing!
|
||||
|
||||
|
||||
|
||||
|
||||
APK 75 (0.8.9) Bugfix + translations
|
||||
|
||||
Release notes
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user