Compare commits
1273 Commits
ci/dev-dmg
...
v5.23.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba44ec6a40 | ||
|
|
db2e1ccf4e | ||
|
|
a8d293999e | ||
|
|
3ae526ff72 | ||
|
|
e99e44ee91 | ||
|
|
ea55e0463b | ||
|
|
b6a953cb1d | ||
|
|
38aa0618d0 | ||
|
|
14963a21c4 | ||
|
|
943cf646bf | ||
|
|
693caf6781 | ||
|
|
aed3f29598 | ||
|
|
22a806d699 | ||
|
|
baef3b8868 | ||
|
|
a7197084c5 | ||
|
|
d50f86a9c7 | ||
|
|
2d6eff9cb3 | ||
|
|
d9bd770a4a | ||
|
|
9a3bdf18d9 | ||
|
|
be6d7d7c88 | ||
|
|
1b789ec3c3 | ||
|
|
7b6046b682 | ||
|
|
6877941188 | ||
|
|
364f9886f7 | ||
|
|
692c301dc0 | ||
|
|
b154022100 | ||
|
|
89e71dce76 | ||
|
|
beb561a94f | ||
|
|
59b4ace20b | ||
|
|
95d27786dd | ||
|
|
3bef81c23e | ||
|
|
80fd44728b | ||
|
|
63cfa6e17d | ||
|
|
02d646e9aa | ||
|
|
e0c72a81d4 | ||
|
|
25d2497a47 | ||
|
|
892d46e640 | ||
|
|
e55c22d45a | ||
|
|
3c82f6894e | ||
|
|
b80f2c45df | ||
|
|
6e6ca1ef7d | ||
|
|
3148354640 | ||
|
|
15502a1d6d | ||
|
|
ab312ec9fe | ||
|
|
2b13f21908 | ||
|
|
8ef3e48492 | ||
|
|
df1c6b4fa7 | ||
|
|
37600ac2d9 | ||
|
|
140b041164 | ||
|
|
17f5d9e2b1 | ||
|
|
646424347e | ||
|
|
427f2996e0 | ||
|
|
83f28cb49b | ||
|
|
902a3e9ebe | ||
|
|
ca916c9455 | ||
|
|
16968ee2ef | ||
|
|
89f6330e48 | ||
|
|
597830850b | ||
|
|
e1e57b99c0 | ||
|
|
e7aed3250b | ||
|
|
60eea0e176 | ||
|
|
e1cc30b9db | ||
|
|
24e519bbe6 | ||
|
|
066c735967 | ||
|
|
1e935aeda9 | ||
|
|
755a3b97ee | ||
|
|
0032b6834a | ||
|
|
1f0cf7393c | ||
|
|
fb63fdac56 | ||
|
|
6c5870b146 | ||
|
|
e01e4d2f90 | ||
|
|
b6e3df45c8 | ||
|
|
90570fbad3 | ||
|
|
b26f6be364 | ||
|
|
23469665ea | ||
|
|
1874d187d6 | ||
|
|
f1b3dadc54 | ||
|
|
d5f7c00cdd | ||
|
|
9126d92774 | ||
|
|
5dd8ee8f55 | ||
|
|
4ed4e53f46 | ||
|
|
e6f29ecac6 | ||
|
|
6983c9cab9 | ||
|
|
ed4c7b3a2b | ||
|
|
c00fa86d0b | ||
|
|
baff5b46a7 | ||
|
|
be96b6a160 | ||
|
|
640bdfa72b | ||
|
|
3b4917e9e1 | ||
|
|
3596eb284f | ||
|
|
3ca1d0a16c | ||
|
|
aeb9ebda3c | ||
|
|
fb99df8a9f | ||
|
|
09784802d4 | ||
|
|
96011a2294 | ||
|
|
f83f3c83fa | ||
|
|
b18d57923b | ||
|
|
43a38ff1d8 | ||
|
|
a6bad9b029 | ||
|
|
a13a011580 | ||
|
|
d46066a26d | ||
|
|
8b133ef43f | ||
|
|
5e9ba974b4 | ||
|
|
beb6711b82 | ||
|
|
172f33d093 | ||
|
|
b9f57a4c44 | ||
|
|
6f025d1480 | ||
|
|
6e8ed67dc5 | ||
|
|
f68d8878e9 | ||
|
|
170d02f082 | ||
|
|
612c66b010 | ||
|
|
6f8e8e8ea4 | ||
|
|
8c33554a2e | ||
|
|
99175acc30 | ||
|
|
8137754462 | ||
|
|
fd91375007 | ||
|
|
63a8fe5be4 | ||
|
|
6c3ec3130e | ||
|
|
287d7e6597 | ||
|
|
5321cd9f42 | ||
|
|
8e0519f549 | ||
|
|
d82f230069 | ||
|
|
cafd6d82f1 | ||
|
|
1aad8f7bc4 | ||
|
|
5a75870169 | ||
|
|
f98ff9cc5e | ||
|
|
e3add87dc6 | ||
|
|
50f4f1612c | ||
|
|
3c959a32b8 | ||
|
|
e1ebfb255d | ||
|
|
48cb4ad49d | ||
|
|
ddb840d21f | ||
|
|
09840fc138 | ||
|
|
51d56151e6 | ||
|
|
119e5c9ce5 | ||
|
|
490329fad8 | ||
|
|
852c35c068 | ||
|
|
eff86fb645 | ||
|
|
670d855651 | ||
|
|
0bf28fc7d7 | ||
|
|
2053f14d55 | ||
|
|
40fd94d40d | ||
|
|
a6a4c2c934 | ||
|
|
48189efb4b | ||
|
|
f52658609a | ||
|
|
0b9d0fbcdd | ||
|
|
2d9624bbc6 | ||
|
|
f8c728fed9 | ||
|
|
8db6c3c679 | ||
|
|
c97bed87f6 | ||
|
|
913bef8329 | ||
|
|
e0bd8cf89b | ||
|
|
8868eeea98 | ||
|
|
cf0849aed3 | ||
|
|
89051521c9 | ||
|
|
ff9f4b7207 | ||
|
|
a0b63cc67c | ||
|
|
d3cbb31399 | ||
|
|
7212f160ee | ||
|
|
8e26f6e94a | ||
|
|
d66158482a | ||
|
|
112e5d2ef9 | ||
|
|
b60f8ffd00 | ||
|
|
dd51f70f6e | ||
|
|
2ee9743915 | ||
|
|
ebc149a755 | ||
|
|
bda4900ffc | ||
|
|
456a7aa8d4 | ||
|
|
05275bbc0a | ||
|
|
56a45cec9e | ||
|
|
2495e01e1b | ||
|
|
5bbe6c7427 | ||
|
|
36eda14549 | ||
|
|
63187cfe83 | ||
|
|
577e23d961 | ||
|
|
01fd697276 | ||
|
|
df880a55fa | ||
|
|
3f271f9bb6 | ||
|
|
69478a939c | ||
|
|
ed81d609f6 | ||
|
|
1176822d0e | ||
|
|
abae2b77a2 | ||
|
|
6be474c67f | ||
|
|
95c1138a74 | ||
|
|
bff0c82b1e | ||
|
|
0826607897 | ||
|
|
d7e42b0600 | ||
|
|
52cc4971ff | ||
|
|
35fb0e0f4e | ||
|
|
eebe0a9328 | ||
|
|
b708dd9f98 | ||
|
|
ffa0699f89 | ||
|
|
d0d691043e | ||
|
|
801bb5eb4e | ||
|
|
e792af6d45 | ||
|
|
8f47e000b7 | ||
|
|
812f918311 | ||
|
|
a285c3b518 | ||
|
|
7f625e780d | ||
|
|
8d3e0e2231 | ||
|
|
110eeb98c1 | ||
|
|
6e821d02d4 | ||
|
|
e5f8e3cdfc | ||
|
|
558a03d6ce | ||
|
|
a2593c6d61 | ||
|
|
05b6a6ca07 | ||
|
|
3f64adc6bc | ||
|
|
b2c06dd192 | ||
|
|
ee6877c111 | ||
|
|
44ef5b5ab2 | ||
|
|
d20212dea0 | ||
|
|
788d9293a6 | ||
|
|
1874174a70 | ||
|
|
e2a6b6644b | ||
|
|
e8bb1a97e3 | ||
|
|
e2519114b6 | ||
|
|
0148492916 | ||
|
|
7845dab791 | ||
|
|
0f83706c3f | ||
|
|
d05aae5b1c | ||
|
|
a1025fa2c7 | ||
|
|
40163dacf4 | ||
|
|
f20da513b7 | ||
|
|
041d4f9525 | ||
|
|
6ab772238c | ||
|
|
792abcd180 | ||
|
|
ffa8b4b2d4 | ||
|
|
bcd709265e | ||
|
|
62cbeba7fc | ||
|
|
c6e491eada | ||
|
|
3ac005d75a | ||
|
|
a979b7f33e | ||
|
|
678f076f60 | ||
|
|
8bf856505b | ||
|
|
b7933ef7f2 | ||
|
|
41432ca341 | ||
|
|
5bf78a9cba | ||
|
|
51619da8dd | ||
|
|
1d6b585c07 | ||
|
|
226a45b8ff | ||
|
|
6dba614726 | ||
|
|
3ebc095d37 | ||
|
|
3514651f75 | ||
|
|
94d71b1db4 | ||
|
|
61b968c58f | ||
|
|
e045adc4dc | ||
|
|
53b1032e24 | ||
|
|
b19c836e35 | ||
|
|
107f67c3a7 | ||
|
|
2aa63c77e6 | ||
|
|
d339731987 | ||
|
|
b611b35248 | ||
|
|
aaefd75ef3 | ||
|
|
7aae2318f8 | ||
|
|
906cb5624f | ||
|
|
36d44d7897 | ||
|
|
8cceb5ccd7 | ||
|
|
1ba86d879c | ||
|
|
cf930ef66a | ||
|
|
b1138f5b68 | ||
|
|
da7f9ffbc6 | ||
|
|
5ec8bbf5a0 | ||
|
|
8ffbf4e053 | ||
|
|
f82257d2cb | ||
|
|
695f6425c5 | ||
|
|
57f76ccb20 | ||
|
|
f100a7ba81 | ||
|
|
fbf683480b | ||
|
|
d79bf3724b | ||
|
|
cd2d1c448c | ||
|
|
819014983c | ||
|
|
579e34bd50 | ||
|
|
77ed38127e | ||
|
|
65311bbd6c | ||
|
|
da16cc95ad | ||
|
|
22842034ae | ||
|
|
ffa6724397 | ||
|
|
7b66511566 | ||
|
|
2ca5c83542 | ||
|
|
26703b0014 | ||
|
|
4b6222b118 | ||
|
|
7b765d8fdc | ||
|
|
ec974f8648 | ||
|
|
c79856b81e | ||
|
|
22eb038a9e | ||
|
|
7b40c11df4 | ||
|
|
64ac7f5d64 | ||
|
|
aa8f02aa3e | ||
|
|
e27566deb5 | ||
|
|
53a4e125ca | ||
|
|
fbece132b0 | ||
|
|
dd1328f2c1 | ||
|
|
7b841fca84 | ||
|
|
dd3233ff34 | ||
|
|
d2c159590d | ||
|
|
c85849651f | ||
|
|
dba8f4f3c4 | ||
|
|
ee64c2051b | ||
|
|
0ed14899f9 | ||
|
|
5452ed2a96 | ||
|
|
718026c513 | ||
|
|
c2dab28d51 | ||
|
|
1bd11a988c | ||
|
|
e3d708f4a9 | ||
|
|
9b8c1b4e1e | ||
|
|
97b3f9af38 | ||
|
|
a04760272b | ||
|
|
64c349b75f | ||
|
|
7e8cc2d137 | ||
|
|
084bc5a6cd | ||
|
|
fa90157c36 | ||
|
|
948ad064e3 | ||
|
|
fd71f70d22 | ||
|
|
38bf8af185 | ||
|
|
6c07625302 | ||
|
|
2526f1465f | ||
|
|
299990833f | ||
|
|
a60d6732f0 | ||
|
|
b0a53cd5b0 | ||
|
|
2fb58192a9 | ||
|
|
2fa1b2158c | ||
|
|
4705cd7078 | ||
|
|
643f2070c4 | ||
|
|
8b6da9b8bf | ||
|
|
d9788dba84 | ||
|
|
167ac2d2d5 | ||
|
|
a2e8d82562 | ||
|
|
3538ab525c | ||
|
|
810008d84b | ||
|
|
59aae8a055 | ||
|
|
386264b689 | ||
|
|
fa0f3317f2 | ||
|
|
e8798391d4 | ||
|
|
fbdba4a2c6 | ||
|
|
4e10ff5a38 | ||
|
|
85fe148d92 | ||
|
|
8ee8fc9e6b | ||
|
|
65941ee574 | ||
|
|
8ca03b5dd7 | ||
|
|
00c9b053b1 | ||
|
|
613da05a40 | ||
|
|
3cb5318aa4 | ||
|
|
acf81e46e5 | ||
|
|
e6efc49ddc | ||
|
|
0078564a06 | ||
|
|
b5c7bde5ac | ||
|
|
b8b3f57790 | ||
|
|
ee73e7609c | ||
|
|
5ce0a7ea4e | ||
|
|
a07d3cc7fc | ||
|
|
10f2268b1e | ||
|
|
0c96e22845 | ||
|
|
17ca363515 | ||
|
|
76816c4f8e | ||
|
|
db114a17b1 | ||
|
|
1b14ff8d9a | ||
|
|
b84ba22c8f | ||
|
|
8ca3df6d5c | ||
|
|
bf6be133c5 | ||
|
|
8fcf9e13f7 | ||
|
|
3caa2f8d7c | ||
|
|
7937bbcb21 | ||
|
|
aeb8ad36a7 | ||
|
|
604879eac1 | ||
|
|
7419ed762f | ||
|
|
c0cc7d119f | ||
|
|
4d615dafd4 | ||
|
|
12fd336f8a | ||
|
|
983a511329 | ||
|
|
3b5ebf8f24 | ||
|
|
f41174fd43 | ||
|
|
587c980621 | ||
|
|
78812d47f2 | ||
|
|
b8c4f73da2 | ||
|
|
48412e2c92 | ||
|
|
4a68fac639 | ||
|
|
4739feb8ff | ||
|
|
2eed3b87d4 | ||
|
|
e1caa6ebe8 | ||
|
|
7ca1ed1d4e | ||
|
|
658e141dd5 | ||
|
|
62bd414ed7 | ||
|
|
bbe771dc1b | ||
|
|
68094ee2d9 | ||
|
|
2884cdb808 | ||
|
|
6c405305b9 | ||
|
|
99befd7582 | ||
|
|
45eb731d30 | ||
|
|
37057885b9 | ||
|
|
cc21ce7b9b | ||
|
|
2472363b05 | ||
|
|
3169d5826f | ||
|
|
e14dcc4f48 | ||
|
|
467b32a324 | ||
|
|
f6b019bbff | ||
|
|
b3310992db | ||
|
|
5a0c35d4e7 | ||
|
|
950952e16c | ||
|
|
53f4cd9ead | ||
|
|
7c2e440b4e | ||
|
|
f799924d9b | ||
|
|
72acbd0ecf | ||
|
|
dd26bd55ea | ||
|
|
bb5d155b08 | ||
|
|
a7dbfad774 | ||
|
|
fbc16dc868 | ||
|
|
a93cbdcab6 | ||
|
|
fe5d34c360 | ||
|
|
ee7ca9cd22 | ||
|
|
1380ae172f | ||
|
|
671d72c5bc | ||
|
|
23b06335d7 | ||
|
|
7981c87b0c | ||
|
|
77a7dbf6c0 | ||
|
|
676716494d | ||
|
|
36ceaa34e8 | ||
|
|
7b1e14214a | ||
|
|
5a480f80e1 | ||
|
|
0ddf11c357 | ||
|
|
d39e342b3b | ||
|
|
14479cbee8 | ||
|
|
7b00ccc9d3 | ||
|
|
549f5d19b5 | ||
|
|
6d45acf7fb | ||
|
|
2b9dd49634 | ||
|
|
38cfee1437 | ||
|
|
86c00934d8 | ||
|
|
0c1edc9626 | ||
|
|
f49687fc1c | ||
|
|
711ce7179d | ||
|
|
f161d855a4 | ||
|
|
cd73d929fd | ||
|
|
c18dfa0335 | ||
|
|
2fbf3cc669 | ||
|
|
b4c8a6e1fb | ||
|
|
0f5ff16afe | ||
|
|
8f215d1f5f | ||
|
|
6cf152a151 | ||
|
|
c0846a26cc | ||
|
|
9b61fd611e | ||
|
|
1c10a7b1ff | ||
|
|
0a7d51dcfb | ||
|
|
fd91aebd42 | ||
|
|
37e1477948 | ||
|
|
f443ce6580 | ||
|
|
4a9f39137c | ||
|
|
903d7140f1 | ||
|
|
f3448ff13c | ||
|
|
86aced1930 | ||
|
|
9e9005099c | ||
|
|
55f03641aa | ||
|
|
ed5a5327f9 | ||
|
|
2eb5f55f9f | ||
|
|
546e02f713 | ||
|
|
0a60709ea1 | ||
|
|
523d2d0de3 | ||
|
|
8732cbc131 | ||
|
|
6e59f0cc83 | ||
|
|
d90ed6d198 | ||
|
|
2c997233f4 | ||
|
|
86203e1292 | ||
|
|
845ca36f5b | ||
|
|
663a5beeae | ||
|
|
e926beb206 | ||
|
|
edda79aa6d | ||
|
|
e712053603 | ||
|
|
98e0bb6d1d | ||
|
|
ff553f7c36 | ||
|
|
91d6cdb099 | ||
|
|
9a20625f07 | ||
|
|
8d19836739 | ||
|
|
05fddebb9c | ||
|
|
30f582e908 | ||
|
|
3d026d1b59 | ||
|
|
0b4db32b53 | ||
|
|
4e65ce5635 | ||
|
|
5586c00385 | ||
|
|
937e3777f4 | ||
|
|
21a06e9011 | ||
|
|
7f905d4e61 | ||
|
|
e85813902d | ||
|
|
bc15d09557 | ||
|
|
4703656bf8 | ||
|
|
0508d56c78 | ||
|
|
885ddc7b39 | ||
|
|
5c5867c2c0 | ||
|
|
6747c35e8b | ||
|
|
dbdb98a514 | ||
|
|
af9507e373 | ||
|
|
a36060125e | ||
|
|
1081d3e6e8 | ||
|
|
03842af13d | ||
|
|
4f518b6e52 | ||
|
|
e7a273e9c8 | ||
|
|
e4bee97168 | ||
|
|
782371d2ca | ||
|
|
96b1c05ca0 | ||
|
|
46bb00b8e9 | ||
|
|
6f38008240 | ||
|
|
51fe97b5ac | ||
|
|
3be1dda845 | ||
|
|
b703b95048 | ||
|
|
2fea17d261 | ||
|
|
c21d15dde6 | ||
|
|
2f48781396 | ||
|
|
4f775a04fd | ||
|
|
699273b08a | ||
|
|
460253d5d3 | ||
|
|
9ee0aabf7b | ||
|
|
f5301595cc | ||
|
|
86accdee86 | ||
|
|
9a5b5fdc8d | ||
|
|
60630a8435 | ||
|
|
ce088d8ee4 | ||
|
|
065bd3dde0 | ||
|
|
410c81c36c | ||
|
|
1bd416dcce | ||
|
|
517886234e | ||
|
|
7208f1b352 | ||
|
|
ab85561833 | ||
|
|
1c6ec1b47e | ||
|
|
257d1c02b0 | ||
|
|
036be03459 | ||
|
|
4974ab6535 | ||
|
|
c3f1068edf | ||
|
|
6a4ade5093 | ||
|
|
0ef1501a53 | ||
|
|
ae744d05c8 | ||
|
|
be8eaa57c7 | ||
|
|
1f7d83e5c4 | ||
|
|
7b7875fa24 | ||
|
|
00fa73551c | ||
|
|
144ab609c5 | ||
|
|
55f6620e0f | ||
|
|
f6de7f4298 | ||
|
|
6a706c6f8a | ||
|
|
4ffc987f07 | ||
|
|
7abc4086b0 | ||
|
|
fb241c5cb9 | ||
|
|
28d9cf2a52 | ||
|
|
b4479a2e4f | ||
|
|
02e5c3c9b7 | ||
|
|
ce9e0cfd04 | ||
|
|
b42d7d7d17 | ||
|
|
3273f7ec7a | ||
|
|
991474debd | ||
|
|
cde48162ea | ||
|
|
a63e637b55 | ||
|
|
95d2eb374d | ||
|
|
d1cedf57ad | ||
|
|
e0641d165d | ||
|
|
2d88e43139 | ||
|
|
265aca3724 | ||
|
|
864f824d7b | ||
|
|
ea247333d0 | ||
|
|
6f29ca0d8f | ||
|
|
83dd7b5914 | ||
|
|
3a763fb12b | ||
|
|
d0eedc7faf | ||
|
|
b01cfaf9c4 | ||
|
|
f4864c7e5e | ||
|
|
05387bf915 | ||
|
|
b3a3d88b1d | ||
|
|
fec780e3d8 | ||
|
|
ab92d12108 | ||
|
|
8cfe4fd626 | ||
|
|
fb188b51a2 | ||
|
|
0ec9573bef | ||
|
|
404d11aad4 | ||
|
|
4c4b24e573 | ||
|
|
f8077d6084 | ||
|
|
9b9dc35580 | ||
|
|
927def4ed3 | ||
|
|
0d5d03d580 | ||
|
|
f0219dc7a6 | ||
|
|
a538ed2291 | ||
|
|
54cf5ae7d6 | ||
|
|
2b7f5f5e60 | ||
|
|
913aad2d6b | ||
|
|
7078f1b8a1 | ||
|
|
f2b34b29a3 | ||
|
|
29d66dc202 | ||
|
|
c901ba43c8 | ||
|
|
0273f1a940 | ||
|
|
c52d6d66ce | ||
|
|
e35512bd9d | ||
|
|
64bcc201ee | ||
|
|
319e384239 | ||
|
|
1a41b53a49 | ||
|
|
08997048e0 | ||
|
|
210fb23e57 | ||
|
|
4e2afb23e2 | ||
|
|
9e9fa712ef | ||
|
|
6819e05642 | ||
|
|
9559659d15 | ||
|
|
a8704bb862 | ||
|
|
e00b601f12 | ||
|
|
c0516089db | ||
|
|
8a751e4a2e | ||
|
|
6821899c84 | ||
|
|
dd08f96419 | ||
|
|
53a7deff9a | ||
|
|
74bb69b69d | ||
|
|
f5a747527e | ||
|
|
5aa369cdad | ||
|
|
5bc90917a6 | ||
|
|
232367afca | ||
|
|
87dd61b269 | ||
|
|
81e9bfa848 | ||
|
|
627ffed461 | ||
|
|
6721a575e7 | ||
|
|
13c7d43920 | ||
|
|
dbd9f16627 | ||
|
|
7037991d56 | ||
|
|
45465d8ad2 | ||
|
|
aa07356b07 | ||
|
|
e0b2b580b7 | ||
|
|
35b060bb7a | ||
|
|
d267bbc213 | ||
|
|
bb7a03e1e9 | ||
|
|
46c6392b82 | ||
|
|
3e374232f2 | ||
|
|
59b6a4050a | ||
|
|
116b953085 | ||
|
|
3c85e0b745 | ||
|
|
008b194cee | ||
|
|
4e1d5982b1 | ||
|
|
d222a6df83 | ||
|
|
7f3cac14bc | ||
|
|
ef600c09c9 | ||
|
|
688d036b34 | ||
|
|
aa948748e9 | ||
|
|
40981a8063 | ||
|
|
f3c491c01b | ||
|
|
b5753af639 | ||
|
|
4d780df455 | ||
|
|
c71fd90868 | ||
|
|
0db63172c6 | ||
|
|
295782cfb8 | ||
|
|
ccc1dd65cc | ||
|
|
a541da064a | ||
|
|
a2de7ac376 | ||
|
|
8cff328e92 | ||
|
|
7c2072ee1f | ||
|
|
8052b16ca1 | ||
|
|
10765dfddb | ||
|
|
13fc438a62 | ||
|
|
0b7f8186ed | ||
|
|
e57df86a00 | ||
|
|
878100ef1b | ||
|
|
64d92dc3b3 | ||
|
|
ec5c0afa29 | ||
|
|
2b0109127f | ||
|
|
462bf51dce | ||
|
|
bf0943066a | ||
|
|
0153486afb | ||
|
|
c8e8b3949e | ||
|
|
6eda663bcf | ||
|
|
ef0864c084 | ||
|
|
12b8f46bd8 | ||
|
|
ab0c9eb5bd | ||
|
|
d2ff015c1c | ||
|
|
5bb12ce6e8 | ||
|
|
5135028df4 | ||
|
|
1728a2bd8f | ||
|
|
263f6edd05 | ||
|
|
c4fd6449fc | ||
|
|
5fa5b97399 | ||
|
|
b6896898ec | ||
|
|
6bde9b97af | ||
|
|
ecf0d4e732 | ||
|
|
b1fc706a6a | ||
|
|
24718ec243 | ||
|
|
c876874cf5 | ||
|
|
a3cdc98031 | ||
|
|
cc995da6af | ||
|
|
a41d4f7885 | ||
|
|
a6e90ac65e | ||
|
|
59e31663c4 | ||
|
|
bf759da599 | ||
|
|
49753de8b8 | ||
|
|
763e5605cf | ||
|
|
7555119b03 | ||
|
|
8b5a60d79e | ||
|
|
bb329afea0 | ||
|
|
62984d1026 | ||
|
|
034ecff647 | ||
|
|
58b8e167ca | ||
|
|
653fed53bb | ||
|
|
8e05cdaecb | ||
|
|
1e8d8ce91a | ||
|
|
3f310ecede | ||
|
|
f14bf295c7 | ||
|
|
7a8586a6d7 | ||
|
|
8acf9ececb | ||
|
|
4ea3900941 | ||
|
|
ca81ddc4d9 | ||
|
|
5a55b4d4dc | ||
|
|
4e3c75b17b | ||
|
|
0478306149 | ||
|
|
3b40e07088 | ||
|
|
e38e8cf01a | ||
|
|
b0462076ea | ||
|
|
53e5c9b53d | ||
|
|
f19d4631b0 | ||
|
|
96f8d25e47 | ||
|
|
e3f01f83da | ||
|
|
ff18028781 | ||
|
|
9c0c4e6da0 | ||
|
|
cfc7bfd02e | ||
|
|
ce96cef6ec | ||
|
|
c3c69c7e1f | ||
|
|
7dd977f525 | ||
|
|
7fb2d0686e | ||
|
|
8c8be278ea | ||
|
|
f4b71bd0be | ||
|
|
d8515b15a2 | ||
|
|
049f244a95 | ||
|
|
0dc6af17a3 | ||
|
|
078ce0860d | ||
|
|
184bdd3dd1 | ||
|
|
5e165319e5 | ||
|
|
47357b2baa | ||
|
|
f5301faafb | ||
|
|
f1d05cd70e | ||
|
|
edca2ea538 | ||
|
|
6778ad4f6e | ||
|
|
eb096e257c | ||
|
|
6df743041f | ||
|
|
38cf01b66e | ||
|
|
4cb6744e01 | ||
|
|
9ee3520634 | ||
|
|
b16942cb2e | ||
|
|
72d1956643 | ||
|
|
8293bcf978 | ||
|
|
c6e1e039bb | ||
|
|
bc998e4902 | ||
|
|
9bbde2199f | ||
|
|
9c991631f0 | ||
|
|
52f534cf43 | ||
|
|
270cfc19bc | ||
|
|
9bed2f4bcc | ||
|
|
e3736bb4e4 | ||
|
|
4a8ace53cc | ||
|
|
d0374037fa | ||
|
|
4850da4acb | ||
|
|
ba161b98eb | ||
|
|
d1ff5c2400 | ||
|
|
442d7d5b70 | ||
|
|
29f93616ff | ||
|
|
aa7b5aeb77 | ||
|
|
ec4f3f98f5 | ||
|
|
38ca800031 | ||
|
|
650a48b8a5 | ||
|
|
b16231698b | ||
|
|
13bef6c4b6 | ||
|
|
f6b0ca7754 | ||
|
|
f4489f4afb | ||
|
|
209da3da03 | ||
|
|
773a26fb1b | ||
|
|
bf2d6dcb5f | ||
|
|
b5adf5b949 | ||
|
|
cd4b28cc59 | ||
|
|
ff2fc2e888 | ||
|
|
f7f9d709b5 | ||
|
|
a63bd7ffbf | ||
|
|
401cd76c2d | ||
|
|
4cef1b1a24 | ||
|
|
7775e3889d | ||
|
|
1f132c7adc | ||
|
|
af9eab239d | ||
|
|
43a5802652 | ||
|
|
23743558ad | ||
|
|
cd6bd95445 | ||
|
|
5ecec67bf2 | ||
|
|
e8bcf55546 | ||
|
|
83bc2649a0 | ||
|
|
6102d7bf43 | ||
|
|
c1b9a158a0 | ||
|
|
a79980daf2 | ||
|
|
b7d8577023 | ||
|
|
874db89c8a | ||
|
|
f41356f683 | ||
|
|
c285d53404 | ||
|
|
b82081769f | ||
|
|
89969d2101 | ||
|
|
73f53e1f9c | ||
|
|
5aff0583f7 | ||
|
|
a4efe0aa3c | ||
|
|
313e46153f | ||
|
|
e76e21d986 | ||
|
|
0d19298f4b | ||
|
|
4bc67b33f5 | ||
|
|
5ee2b96938 | ||
|
|
f6ee7f6ab4 | ||
|
|
4f3300fa17 | ||
|
|
db9a402bd8 | ||
|
|
6ce5c5ca7d | ||
|
|
8805d1a3f1 | ||
|
|
d2bc88896c | ||
|
|
3e56b73283 | ||
|
|
dc2754bf39 | ||
|
|
9f9f0270a8 | ||
|
|
a0dbca0816 | ||
|
|
323d991308 | ||
|
|
94f58586b7 | ||
|
|
9c05d6e18b | ||
|
|
fdeae7b28f | ||
|
|
399eb27360 | ||
|
|
39a8e0c766 | ||
|
|
e098c55223 | ||
|
|
bf80696a80 | ||
|
|
bc560cf9af | ||
|
|
e73635339d | ||
|
|
d341d95372 | ||
|
|
e1ff78240e | ||
|
|
ae38ad904b | ||
|
|
3f07bfc52d | ||
|
|
a1c11bdb32 | ||
|
|
4a4b3fae3b | ||
|
|
5e435f2cd7 | ||
|
|
eac28232a9 | ||
|
|
6af04f4232 | ||
|
|
96c007274d | ||
|
|
fd4bdb6f4a | ||
|
|
be18f7304b | ||
|
|
eebcf78aaf | ||
|
|
1328545320 | ||
|
|
303c7bca17 | ||
|
|
56875aec85 | ||
|
|
1e3afd8c12 | ||
|
|
c1fcf95a49 | ||
|
|
02964cd38e | ||
|
|
ff3a06cf71 | ||
|
|
17c98f18e4 | ||
|
|
0f25adfd83 | ||
|
|
5dcfd8ce2a | ||
|
|
cd3b0d9e08 | ||
|
|
e0724ed92c | ||
|
|
cf7c8e66bb | ||
|
|
cafb520b29 | ||
|
|
2e21799cc8 | ||
|
|
911f910990 | ||
|
|
0b91daba21 | ||
|
|
eed13a6869 | ||
|
|
b5798a8096 | ||
|
|
b30f2eadc1 | ||
|
|
14a3455ee8 | ||
|
|
3e06cece23 | ||
|
|
264a27e82b | ||
|
|
32a627d980 | ||
|
|
17c93f91d4 | ||
|
|
70e6261a98 | ||
|
|
bd8a2ee886 | ||
|
|
5af96ea1ce | ||
|
|
09432c2247 | ||
|
|
d85c049ee3 | ||
|
|
40ae3a2866 | ||
|
|
12fa8eba2c | ||
|
|
8476d5bebe | ||
|
|
4f9dcbbd42 | ||
|
|
2db6c4a459 | ||
|
|
7c3ac7066e | ||
|
|
3355bf13b3 | ||
|
|
f2fabb392e | ||
|
|
e209727448 | ||
|
|
27762ce24d | ||
|
|
335bf74e89 | ||
|
|
fece54bfb4 | ||
|
|
7994bc2384 | ||
|
|
a10e3be350 | ||
|
|
7af5574bf9 | ||
|
|
9cf913dc3a | ||
|
|
14360ed869 | ||
|
|
02156ebb0c | ||
|
|
a16e399ae1 | ||
|
|
7a658d4712 | ||
|
|
0b6c1ef843 | ||
|
|
54ed65fb9d | ||
|
|
3289bbabb8 | ||
|
|
219ec7278a | ||
|
|
2b7b020b51 | ||
|
|
28a768a8f5 | ||
|
|
66d2614d82 | ||
|
|
2b5857a955 | ||
|
|
4de3bf3fef | ||
|
|
852a7da8eb | ||
|
|
7bc25bc952 | ||
|
|
268ee6ba0f | ||
|
|
117cbb4561 | ||
|
|
7b550516cc | ||
|
|
eec8880bd5 | ||
|
|
69ae0eaa1b | ||
|
|
4c4b2e8510 | ||
|
|
649ca6452e | ||
|
|
fe13df4806 | ||
|
|
46f7ee6e33 | ||
|
|
948f38b2ac | ||
|
|
ac9a339d47 | ||
|
|
371f4e814a | ||
|
|
e8e9d7a38a | ||
|
|
907947a02e | ||
|
|
b40a18f591 | ||
|
|
007b04eaf0 | ||
|
|
09a4931ba1 | ||
|
|
0da24487c9 | ||
|
|
7ff2bbdbbf | ||
|
|
13ef0ca3fe | ||
|
|
801afef4e5 | ||
|
|
124df0612c | ||
|
|
f2eb22be4c | ||
|
|
256feb33c7 | ||
|
|
5b39e69317 | ||
|
|
87ed43301c | ||
|
|
3c628e95dd | ||
|
|
21a40cc685 | ||
|
|
cbe1c991cc | ||
|
|
f68d1dd308 | ||
|
|
bbe22ea5a2 | ||
|
|
8d29464ed3 | ||
|
|
c97c525d74 | ||
|
|
c6536af73d | ||
|
|
a903486c71 | ||
|
|
725a178708 | ||
|
|
12cbc7d47b | ||
|
|
620c63c6b0 | ||
|
|
bcd61de277 | ||
|
|
53cb5cc3e8 | ||
|
|
839835fcba | ||
|
|
466cd719d7 | ||
|
|
ee9a44b957 | ||
|
|
1b2df5ff5d | ||
|
|
3db8613a43 | ||
|
|
499564694c | ||
|
|
88eb57d63d | ||
|
|
4aeeac2e65 | ||
|
|
ce2031704f | ||
|
|
f2558002f0 | ||
|
|
99958533ef | ||
|
|
b6e6080f36 | ||
|
|
96df05800c | ||
|
|
625db77e00 | ||
|
|
96d9cad344 | ||
|
|
12f165e08d | ||
|
|
d96143eab2 | ||
|
|
673b1b082f | ||
|
|
3a15195178 | ||
|
|
59c632f628 | ||
|
|
1d54b13f6d | ||
|
|
2e9408efa9 | ||
|
|
02ec0426f0 | ||
|
|
5bc4a68a71 | ||
|
|
3682278967 | ||
|
|
ff40ff6e91 | ||
|
|
f329411768 | ||
|
|
7988229cba | ||
|
|
67eb0aa7ca | ||
|
|
cd25bb9fa9 | ||
|
|
503029581a | ||
|
|
5b3d638048 | ||
|
|
edf4905733 | ||
|
|
09de23dd26 | ||
|
|
b96bcc2e2b | ||
|
|
14d740afe3 | ||
|
|
7ac4fc6ccc | ||
|
|
af3e4b144f | ||
|
|
5aed8be27e | ||
|
|
27516baf54 | ||
|
|
2609f159ab | ||
|
|
d06535bf92 | ||
|
|
bb930cd341 | ||
|
|
c27a03623b | ||
|
|
33f850b0f7 | ||
|
|
8a2a93c543 | ||
|
|
235f83acfb | ||
|
|
ab36ae88d6 | ||
|
|
56c95f6891 | ||
|
|
21435c8850 | ||
|
|
93a5392028 | ||
|
|
7464b5fce3 | ||
|
|
521ec62b4d | ||
|
|
4fa9639802 | ||
|
|
eef39ba079 | ||
|
|
dcf816118f | ||
|
|
1056ad043c | ||
|
|
3864b54b0f | ||
|
|
dd21ff29db | ||
|
|
daaf9dc02e | ||
|
|
89d16721df | ||
|
|
90b752fb81 | ||
|
|
8d6b16b200 | ||
|
|
fd0dafcbd2 | ||
|
|
8141c9f197 | ||
|
|
58450ea856 | ||
|
|
4a22870377 | ||
|
|
75f4c8d01e | ||
|
|
5a235f92d0 | ||
|
|
dfa722d6a9 | ||
|
|
532acde4c3 | ||
|
|
b4cdd15901 | ||
|
|
12c70a0fda | ||
|
|
916ad56431 | ||
|
|
bea6f015a4 | ||
|
|
f616d89f5c | ||
|
|
63502600aa | ||
|
|
b56ed10424 | ||
|
|
6b0ba2afed | ||
|
|
bd779697b7 | ||
|
|
094f76f5e5 | ||
|
|
e7601b1fb7 | ||
|
|
9b2c051758 | ||
|
|
59ec169a9d | ||
|
|
59dd27f209 | ||
|
|
505823afbb | ||
|
|
6f98f3600d | ||
|
|
950532604e | ||
|
|
2d20c4e465 | ||
|
|
2e63cbfb56 | ||
|
|
a78d875434 | ||
|
|
3acbf33046 | ||
|
|
cd560f1ae1 | ||
|
|
baf25450ed | ||
|
|
6965c7190a | ||
|
|
ff3d416664 | ||
|
|
2bb47a5c55 | ||
|
|
943f2bdea3 | ||
|
|
b91bc9dfe8 | ||
|
|
8f096c4aa6 | ||
|
|
8e5709fa90 | ||
|
|
6e68b488d0 | ||
|
|
34a1e8266b | ||
|
|
b814961559 | ||
|
|
87642f513d | ||
|
|
586c87233f | ||
|
|
1d7832c152 | ||
|
|
78a81f34c3 | ||
|
|
0a8f78858f | ||
|
|
2c3d0fd8ec | ||
|
|
79174381b3 | ||
|
|
bb8a890194 | ||
|
|
c609433c8f | ||
|
|
b1c9102a8f | ||
|
|
ee66844d9c | ||
|
|
eca2e41c99 | ||
|
|
70fc130f4a | ||
|
|
68d7f4ab41 | ||
|
|
45765a3932 | ||
|
|
4de88035be | ||
|
|
e1fea2032a | ||
|
|
a0ef939648 | ||
|
|
9ea2c8c8e5 | ||
|
|
4285132852 | ||
|
|
9c79a8d09c | ||
|
|
fcf026104c | ||
|
|
7baad81b84 | ||
|
|
f72b834d12 | ||
|
|
2c8efbbcb9 | ||
|
|
d20b539f06 | ||
|
|
66d7659e9a | ||
|
|
8995b04a22 | ||
|
|
4d74da147a | ||
|
|
4a6f357b73 | ||
|
|
e2a9ed7bb0 | ||
|
|
ecd1153238 | ||
|
|
2f5d5774be | ||
|
|
8752da1c06 | ||
|
|
a6de3f83ba | ||
|
|
4f2e9c6409 | ||
|
|
09bbf1a2ed | ||
|
|
25ecadf0d5 | ||
|
|
ca2dfda207 | ||
|
|
6e3f402dec | ||
|
|
7944608267 | ||
|
|
1663df1263 | ||
|
|
3fbc8655de | ||
|
|
81bc7a3a39 | ||
|
|
1d530522b0 | ||
|
|
a33535e073 | ||
|
|
7e9806e697 | ||
|
|
b814c76135 | ||
|
|
4b9098769e | ||
|
|
f8725f5cd2 | ||
|
|
ad54d797d1 | ||
|
|
8fe23adba0 | ||
|
|
21fa83b749 | ||
|
|
5458ae642a | ||
|
|
df7cdf6608 | ||
|
|
d25ac0990f | ||
|
|
498736ec22 | ||
|
|
d42944e3b5 | ||
|
|
1ab6f93358 | ||
|
|
3f3262a82b | ||
|
|
75464abd73 | ||
|
|
a017fe9a9f | ||
|
|
3cfc853d10 | ||
|
|
b516bbf7fd | ||
|
|
2b7ea316d1 | ||
|
|
a59219ea66 | ||
|
|
4fec94f580 | ||
|
|
d50c4a4f82 | ||
|
|
ca65482ca8 | ||
|
|
4bac9f6c71 | ||
|
|
332f890b11 | ||
|
|
38a7f78dd7 | ||
|
|
38b0742a4a | ||
|
|
03a966d66d | ||
|
|
e1d81e40cb | ||
|
|
ef1da986b5 | ||
|
|
8b144fe4de | ||
|
|
db18965bff | ||
|
|
59ba947489 | ||
|
|
d0abdde209 | ||
|
|
81c27e1a0a | ||
|
|
d7d438e067 | ||
|
|
bc9afbd20c | ||
|
|
b9032ccf2e | ||
|
|
5bab8053b2 | ||
|
|
b1e064a5db | ||
|
|
8eb09c9992 | ||
|
|
1f583c3cbe | ||
|
|
99ea5dc070 | ||
|
|
07d2decb11 | ||
|
|
e23c362cf3 | ||
|
|
4c9a19b81a | ||
|
|
17fe445d50 | ||
|
|
87bbd07ecf | ||
|
|
1803f77325 | ||
|
|
4b6c7319bd | ||
|
|
1c49ccaf23 | ||
|
|
15d921e21d | ||
|
|
515f8b2c5f | ||
|
|
295a6f8753 | ||
|
|
3799d6cfd0 | ||
|
|
13e69e09e9 | ||
|
|
c58f525155 | ||
|
|
f96e41da1d | ||
|
|
6a697a7142 | ||
|
|
023499b2ba | ||
|
|
c921eafe48 | ||
|
|
3c547ebc7a | ||
|
|
4abecee9c7 | ||
|
|
c9d4a1bbac | ||
|
|
efe817d45a | ||
|
|
1679cea5c5 | ||
|
|
75012b2252 | ||
|
|
bc6059b33c | ||
|
|
a7f78b5650 | ||
|
|
1d7efcd07b | ||
|
|
ec6c219673 | ||
|
|
7a86355a96 | ||
|
|
ac4a1c6b4b | ||
|
|
025c7fa72b | ||
|
|
937ce54362 | ||
|
|
7a86697006 | ||
|
|
4bf790ab3e | ||
|
|
63fc00a077 | ||
|
|
549e244605 | ||
|
|
99d5cf63f8 | ||
|
|
604ab8f603 | ||
|
|
6840318470 | ||
|
|
b6a9c5e671 | ||
|
|
27f471fa07 | ||
|
|
f3686ebbd3 | ||
|
|
aa0eaea4dd | ||
|
|
566ff62cb0 | ||
|
|
739110255b | ||
|
|
f6c6fca5ca | ||
|
|
cb9eae7bed | ||
|
|
913c4b1f8a | ||
|
|
4fe35cbb81 | ||
|
|
b9eea18342 | ||
|
|
0552f8690b | ||
|
|
f06657867a | ||
|
|
0ab8bf1b7a | ||
|
|
b259f13202 | ||
|
|
4d554f413e | ||
|
|
01d187a943 | ||
|
|
e898eee450 | ||
|
|
aeed5b4fa0 | ||
|
|
162908dfdf | ||
|
|
ee97a4528f | ||
|
|
0228156cde | ||
|
|
04a95fb27b | ||
|
|
b5d372ab52 | ||
|
|
32986f40c8 | ||
|
|
e4aa0b7a11 | ||
|
|
c7cd335a2e | ||
|
|
81a98638b0 | ||
|
|
c92502aed1 | ||
|
|
49d4dc78b1 | ||
|
|
9d85c3c3b4 | ||
|
|
d96c26471b | ||
|
|
bdc3630b7a | ||
|
|
f76db36364 | ||
|
|
7f4a95280c | ||
|
|
711041f190 | ||
|
|
21086dcf68 | ||
|
|
2c3b6ac50a | ||
|
|
743c51a4b5 | ||
|
|
61ce039b12 | ||
|
|
f6788e6029 | ||
|
|
a7ed964cb0 | ||
|
|
a91fc84942 | ||
|
|
66ef1f0836 | ||
|
|
f0a3bbf16a | ||
|
|
529fedd95e | ||
|
|
434932d39a | ||
|
|
6601c6621c | ||
|
|
7a65be5fa5 | ||
|
|
0ca0de9663 | ||
|
|
c69ce8ca7a | ||
|
|
9bccb24654 | ||
|
|
0d4ffca813 | ||
|
|
b13e4d022b | ||
|
|
110847e005 | ||
|
|
772424e920 | ||
|
|
57888f783e | ||
|
|
f4ee5356d1 | ||
|
|
035fdaa6ca | ||
|
|
2d4c556bc6 | ||
|
|
58a3157bb3 | ||
|
|
848ebeb747 | ||
|
|
989ba7ee52 | ||
|
|
53e3ec8273 | ||
|
|
dbc1f1f6da | ||
|
|
0d57e73bb4 | ||
|
|
cf4553fa0a | ||
|
|
0af71a9f32 | ||
|
|
6ab3b6cc56 | ||
|
|
ec1de48e42 | ||
|
|
87e43d91f0 | ||
|
|
6104d0602b | ||
|
|
f04b9a6409 | ||
|
|
4fbb831c44 | ||
|
|
9301ea44b1 | ||
|
|
7e7beabb35 | ||
|
|
eb5803fef7 | ||
|
|
24f2cb5cbf | ||
|
|
fb8f3b78ad | ||
|
|
abcaf2ee06 | ||
|
|
03188824f7 | ||
|
|
340e2798a0 | ||
|
|
f9d468f557 | ||
|
|
e71eb3985d | ||
|
|
5adb76e377 | ||
|
|
be0ff90b8a | ||
|
|
cd723f2210 | ||
|
|
93ab1cc811 | ||
|
|
92421d464c | ||
|
|
260ab6e839 | ||
|
|
7e3e43e81a | ||
|
|
3b3056a65f | ||
|
|
5aa1d74b96 | ||
|
|
b9f196c3a1 | ||
|
|
c7a8191e03 | ||
|
|
3a87307bda | ||
|
|
f0ff035546 | ||
|
|
81504417c7 | ||
|
|
771c3e53b7 | ||
|
|
5cc7861d5c | ||
|
|
61f25c94e5 | ||
|
|
8da46bf991 | ||
|
|
26f421418e | ||
|
|
82dbe28b5e | ||
|
|
cc7c740921 | ||
|
|
4396c71802 | ||
|
|
351529d4cf | ||
|
|
eeeca5aa0f | ||
|
|
37c712637c | ||
|
|
3c995514a6 | ||
|
|
5038576b75 | ||
|
|
43952444bb | ||
|
|
1848caf82a |
18
.github/ISSUE_TEMPLATE/cn-bug-report.yaml
vendored
@@ -5,16 +5,18 @@ body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: 请确认自己完成了下列要求之后再进行勾选,若未完成但勾选将被直接关闭 Issue
|
||||
label: 请确认自己完成了下列必选项之后再进行勾选,若未完成必选项或勾选了"我未仔细阅读"选项将视为自愿接受被直接关闭 Issue
|
||||
options:
|
||||
- label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决
|
||||
required: true
|
||||
required: false
|
||||
- label: 我未仔细阅读这些内容,只是一键已读[所有内容](/MaaAssistantArknights/MaaAssistantArknights/issues),并相信这不会影响问题的处理
|
||||
required: false
|
||||
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
|
||||
required: true
|
||||
- label: 我使用的是当前更新版本的最新版,且已查看版本发布至今的 [更新内容](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) 和 [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) 中尚未发布的更新内容,并未提及该 Bug 已被修复的情况
|
||||
required: true
|
||||
- label: 我已检查了[常见问题](https://maa.plus/docs/zh-cn/manual/faq.html)、[公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的问题未被提及
|
||||
required: true
|
||||
required: false
|
||||
- label: 我使用的是当前更新版本的最新版, 并已查看版本发布至今的 [更新内容](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/), [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) 中尚未发布的更新内容并未提及该 Bug 已被修复的情况
|
||||
required: false
|
||||
- label: 我已检查了 [常见问题](https://maa.plus/docs/zh-cn/manual/faq.html), [公告](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) 确认我的问题未被提及
|
||||
required: false
|
||||
- type: textarea
|
||||
id: describe
|
||||
attributes:
|
||||
@@ -54,7 +56,7 @@ body:
|
||||
label: 配置信息
|
||||
description: |
|
||||
请说明操作系统及版本、模拟器品牌、模拟器分辨率、DPI、帧率;
|
||||
若正在使用 MuMu 12 或雷电 9,请说明截图增强是否开启;
|
||||
若正在使用 MuMu 或雷电 9,请说明截图增强是否开启;
|
||||
最后请说明 GPU 加速推理是否开启,若开启请提供 GPU 型号。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
18
.github/ISSUE_TEMPLATE/cn-feature-request.yaml
vendored
@@ -5,16 +5,18 @@ body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: 在提问之前...
|
||||
label: 请确认自己完成了下列必选项之后再进行勾选,若未完成必选项或勾选了"我未仔细阅读"选项将视为自愿接受被直接关闭 Issue
|
||||
options:
|
||||
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
|
||||
required: true
|
||||
- label: 我基本确定这是一个新功能/建议,而不是遇到了 Bug(不确定的话请附上日志)
|
||||
required: true
|
||||
- label: 我使用的是当前更新版本的最新版,且已查看版本发布至今的 [更新内容](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) 和 [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) 中尚未发布的更新内容,确认我的建议未被提及
|
||||
required: true
|
||||
- label: 我已检查了 [公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的建议未被提及
|
||||
required: true
|
||||
required: false
|
||||
- label: 我未仔细阅读这些内容,只是一键已读[所有内容](/MaaAssistantArknights/MaaAssistantArknights/issues),并相信这不会影响问题的处理
|
||||
required: false
|
||||
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
|
||||
required: false
|
||||
- label: 我使用的是当前更新版本的最新版, 并已查看版本发布至今的 [更新内容](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/), [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) 中尚未发布的更新内容,确认我的建议未被提及
|
||||
required: false
|
||||
- label: 我已检查了 [常见问题](https://maa.plus/docs/zh-cn/manual/faq.html), [公告](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) 确认我的建议未被提及
|
||||
required: false
|
||||
- type: textarea
|
||||
id: describe
|
||||
attributes:
|
||||
|
||||
12
.github/ISSUE_TEMPLATE/cn-ld-report.yaml
vendored
@@ -8,15 +8,17 @@ body:
|
||||
label: 在提问之前...
|
||||
options:
|
||||
- label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决
|
||||
required: true
|
||||
required: false
|
||||
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
|
||||
required: true
|
||||
required: false
|
||||
- label: 我已检查了[公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的问题未被提及
|
||||
required: true
|
||||
required: false
|
||||
- label: 我未仔细阅读这些内容,只是一键已读[所有内容](/MaaAssistantArknights/MaaAssistantArknights/issues),并相信这不会影响问题的处理
|
||||
required: false
|
||||
- label: 我正在使用最新的 MAA 公测版本和最新的官版雷电 9 模拟器
|
||||
required: true
|
||||
required: false
|
||||
- label: 我已参考文档确定安装路径、实例编号填写正确,并确认在关闭截图增强模式后问题消失
|
||||
required: true
|
||||
required: false
|
||||
- label: 我未开启高帧率,且模拟器帧数设置为 60
|
||||
required: false
|
||||
- type: textarea
|
||||
|
||||
14
.github/ISSUE_TEMPLATE/cn-mumu-report.yaml
vendored
@@ -8,16 +8,18 @@ body:
|
||||
label: 在提问之前...
|
||||
options:
|
||||
- label: 我理解 Issue 是用于反馈和解决问题的,而非吐槽评论区,将尽可能提供更多信息帮助问题解决
|
||||
required: true
|
||||
required: false
|
||||
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
|
||||
required: true
|
||||
required: false
|
||||
- label: 我已检查了[公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的问题未被提及
|
||||
required: true
|
||||
required: false
|
||||
- label: 我未仔细阅读这些内容,只是一键已读[所有内容](/MaaAssistantArknights/MaaAssistantArknights/issues),并相信这不会影响问题的处理
|
||||
required: false
|
||||
- label: 我正在使用最新的 MAA 公测版本和最新的官版或方舟专版 MuMu 模拟器
|
||||
required: true
|
||||
required: false
|
||||
- label: 我已参考文档确定安装路径、实例编号、屏幕编号填写正确,并确认在关闭截图增强模式后问题消失
|
||||
required: true
|
||||
- label: 我未开启后台保活,模拟器帧数为 60,显存使用策略为“画面表现更好”
|
||||
required: false
|
||||
- label: 我未开启动态帧率及后台保活,模拟器帧数为 60,显存使用策略为“画面表现更好”
|
||||
required: false
|
||||
- type: textarea
|
||||
id: describe
|
||||
|
||||
28
.github/ISSUE_TEMPLATE/en-bug-report.yaml
vendored
@@ -1,24 +1,23 @@
|
||||
name: Bug Report (in English)
|
||||
description: >-
|
||||
Recognition errors, operation abnormalities,
|
||||
connection errors, etc.
|
||||
description: Recognition errors, operation abnormalities, connection errors, etc.
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Before raising the issue...
|
||||
description: |
|
||||
Please ensure that you have completed the requirements before checking the box.
|
||||
Issues with the checkbox checked but not completed will be directly closed.
|
||||
label: |
|
||||
Please ensure that you have completed the required items before checking the boxes.
|
||||
Issues with incomplete required items or with the 'I did not read carefully' option checked will be considered voluntary acceptance of direct closure.
|
||||
options:
|
||||
- label: I understand that Issues are for feedback and problem solving, not trolling the comments section, and will provide as much information as possible to help solve the problem.
|
||||
required: true
|
||||
- label: I filled in a short, clear title so that developers could quickly identify the general problem when going through the issue list. Instead of "Some suggestions", "Stuck", etc.
|
||||
required: true
|
||||
- label: I am using the latest version of the current update version and have reviewed both the [Unreleased changes](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) and there is no mention of the bug being fixed.
|
||||
- label: I am using the latest version of the current update version, and have reviewed the [update content](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) released to date, [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) unreleased update content and there is no mention of the bug being fixed.
|
||||
required: true
|
||||
- label: I have reviewed the [FAQs](https://maa.plus/docs/en-us/manual/faq.html), [Announcement](/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [Open Issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [Closed Issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) to ensure that my issue/bug has not been mentioned.
|
||||
- label: I have checked all the options without carefully reading the content and believe this will not affect issue resolution.
|
||||
required: false
|
||||
- label: I have reviewed the [FAQs](https://maa.plus/docs/en-us/manual/faq.html), [Announcement](/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [Open Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [Closed Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) to ensure that my issue has not been mentioned.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: describe
|
||||
@@ -43,7 +42,7 @@ body:
|
||||
id: logs
|
||||
attributes:
|
||||
label: Log and config files
|
||||
description: >-
|
||||
description: |
|
||||
**Please locate the Generate Support Payload button under MAA Settings -> Issue Report, click the button, and upload the generated zip file**
|
||||
|
||||
**Please drag and drop the full file in, not your own cuttings or copies; compress it before uploading if too large.**
|
||||
@@ -59,7 +58,7 @@ body:
|
||||
label: Configuration information
|
||||
description: |
|
||||
Please specify the operating system and version, emulator brand, emulator resolution, DPI, and frame rate;
|
||||
If you are using MuMu 12 or LDPlayer 9, please specify whether Screenshot Enhancement is enabled;
|
||||
If you are using MuMu or LDPlayer 9, please specify whether Screenshot Enhancement is enabled;
|
||||
Finally, please specify whether GPU accelerated inference is enabled, and if so, provide the GPU model.
|
||||
validations:
|
||||
required: true
|
||||
@@ -67,7 +66,7 @@ body:
|
||||
id: screenshots
|
||||
attributes:
|
||||
label: Screenshots or recordings
|
||||
description: >-
|
||||
description: |
|
||||
In the `debug` directory, within the functionally categorized folders,
|
||||
there are some error images captured automatically.
|
||||
If related to this issue, please upload them together.
|
||||
@@ -84,14 +83,13 @@ body:
|
||||
and their aspect ratio and resolution are inconsistent,
|
||||
which makes it harder for us to debug.
|
||||
|
||||
If the file siz is too large, you may compress it before uploading.
|
||||
|
||||
If the file size is too large, you may compress it before uploading.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: others
|
||||
attributes:
|
||||
label: Anthing else?
|
||||
label: Anything else?
|
||||
description: |
|
||||
Anything that will give us more insight into the problem you are having.
|
||||
validations:
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/en-feature-request.yaml
vendored
@@ -5,21 +5,19 @@ body:
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Before raising the issue...
|
||||
label: |
|
||||
Please ensure that you have completed the required items before checking the boxes.
|
||||
Issues with incomplete required items or with the 'I did not read carefully' option checked will be considered voluntary acceptance of direct closure.
|
||||
options:
|
||||
- label: |
|
||||
I filled in a short, clear title so that developers could quickly identify the general problem when going through the issue list.
|
||||
Instead of "Some suggestions", "Stuck", etc.
|
||||
- label: I'm probably sure this is a new feature/suggestion and not a bug encountered (please attach logs if you're not sure).
|
||||
required: true
|
||||
- label: |
|
||||
I'm probably sure this is a new feature/suggestion and not a bug encountered (please attach logs if you're not sure).
|
||||
- label: I filled in a short, clear title so that developers could quickly identify the general problem when going through the issue list. Instead of "Some suggestions", "Stuck", etc.
|
||||
required: true
|
||||
- label: |
|
||||
I am using the latest version of the current update version and have reviewed both the [Unreleased changes](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) and the [Pull requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls),
|
||||
but there is no mention of this feature/suggestion being added.
|
||||
- label: I am using the latest version of the current update version, and have reviewed the [update content](https://github.com/MaaAssistantArknights/MaaAssistantArknights/commits/dev/) released to date, [Pull Requests](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pulls) unreleased update content and there is no mention of this feature/suggestion being added.
|
||||
required: true
|
||||
- label: |
|
||||
I have reviewed the [Announcement](/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [Open Issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [Closed Issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) to ensure that my feature/suggestion has not been mentioned.
|
||||
- label: I have checked all the options without carefully reading the content and believe this will not affect issue resolution.
|
||||
required: false
|
||||
- label: I have reviewed the [FAQs](https://maa.plus/docs/en-us/manual/faq.html), [Announcement](/MaaAssistantArknights/MaaAssistantArknights/issues/7732), [Open Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues), [Closed Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed) to ensure that my feature/suggestion has not been mentioned.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: describe
|
||||
|
||||
2
.github/dependabot.yaml
vendored
@@ -7,8 +7,8 @@ updates:
|
||||
commit-message:
|
||||
prefix: ci
|
||||
assignees:
|
||||
- constrat
|
||||
- AnnAngela
|
||||
- Constrat
|
||||
groups:
|
||||
github-actions:
|
||||
patterns:
|
||||
|
||||
2
.github/issue-checker.yml
vendored
@@ -552,7 +552,7 @@ comments:
|
||||
Your log did not upload successfully, please re-upload it."
|
||||
mode: add
|
||||
- name: Upload failed
|
||||
regexes: "^[^`]*(`[^`]+`[^`]*)*\\[Uploading[^\\]]*…\\]\\(\\)"
|
||||
regexes: "^[^`]*(`[^`]+`[^`]*)*(\\[Uploading[^\\]]*…\\]\\(\\)|<!-- Failed to upload|<!-- Uploading)"
|
||||
content: "你有一些文件没有上传成功,请重新上传。\n\n\
|
||||
You have some files that did not upload successfully, please re-upload them."
|
||||
mode: add
|
||||
|
||||
6
.github/workflows/ci.yml
vendored
@@ -90,7 +90,7 @@ jobs:
|
||||
echo >> CHANGELOG.md
|
||||
echo "**Full Changelog**: [$last_tag -> $this_tag](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/${last_tag}...${this_tag})" >> CHANGELOG.md
|
||||
echo >> CHANGELOG.md
|
||||
echo "[已有 Mirror酱 CDK?前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=MAA)" >> CHANGELOG.md
|
||||
echo "[已有 Mirror酱 CDK?前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=MAA&source=maagh-release)" >> CHANGELOG.md
|
||||
|
||||
- name: Upload changelog to Github
|
||||
uses: actions/upload-artifact@v4
|
||||
@@ -308,7 +308,7 @@ jobs:
|
||||
ln -sv usr/share/maa/maa Maa.AppDir/AppRun
|
||||
mkdir -pv Maa.AppDir/usr/share/metainfo/
|
||||
cp -v tools/AppImage/io.github.maaassistantarknights.maaassistantarknights.metainfo.xml Maa.AppDir/usr/share/metainfo/
|
||||
wget "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
|
||||
# appimagetool with embedded runtime does not support cross build, till AppImage/appimagetool 7a10b8
|
||||
wget "https://github.com/AppImage/type2-runtime/releases/download/old/runtime-fuse3-${{ matrix.arch }}"
|
||||
chmod a+x appimagetool-x86_64.AppImage
|
||||
@@ -560,7 +560,7 @@ jobs:
|
||||
find . -type f | while read f; do mv -fvt . $f; done
|
||||
|
||||
- name: Release to Github
|
||||
uses: softprops/action-gh-release@v2
|
||||
uses: softprops/action-gh-release@v2.3.2
|
||||
with:
|
||||
body_path: CHANGELOG.md
|
||||
files: |
|
||||
|
||||
91
.github/workflows/codeql.yml
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
name: "CodeQL Advanced"
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["dev"]
|
||||
schedule:
|
||||
- cron: "45 11 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
actions: write
|
||||
contents: read
|
||||
packages: read
|
||||
security-events: write
|
||||
|
||||
jobs:
|
||||
analyze-none:
|
||||
name: Analyze CI and MaaWebsite
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: javascript-typescript,actions
|
||||
build-mode: none
|
||||
|
||||
- name: Run CodeQL
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:multi-none"
|
||||
|
||||
analyze-manual:
|
||||
name: Analyze MaaCore and MaaWpfGui
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
show-progress: false
|
||||
|
||||
- name: Setup build environments
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
git submodule update --init --depth 1 3rdparty/EmulatorExtras
|
||||
dotnet restore
|
||||
python3 maadeps-download.py x64-windows
|
||||
|
||||
- name: Create fake event file
|
||||
shell: bash
|
||||
run: cp -v "$GITHUB_EVENT_PATH" ./event.json
|
||||
|
||||
- name: Setup CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: c-cpp,csharp
|
||||
build-mode: manual
|
||||
|
||||
- name: Build MAA
|
||||
shell: pwsh
|
||||
run: |
|
||||
$env:GITHUB_WORKFLOW = 'dev-build-win'
|
||||
$env:GITHUB_EVENT_PATH = "$pwd\\event.json"
|
||||
$env:GITHUB_REF = "refs/heads/not_master"
|
||||
$env:MAA_BUILDER_MAA_VERSION = 'v0.0.1'
|
||||
./build.cmd DevBuild
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Run CodeQL
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:multi-manual"
|
||||
|
||||
- name: Delete old caches
|
||||
shell: pwsh
|
||||
run: |
|
||||
$oldCaches = gh cache list --key codeql --order asc --json key | ConvertFrom-Json | Select-Object -SkipLast 1
|
||||
foreach ($cache in $oldCaches) {
|
||||
if ($cache.key) {
|
||||
Write-Host "Deleting cache: $($cache.key)"
|
||||
gh cache delete $cache.key
|
||||
}
|
||||
}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
152
.github/workflows/issue-checkbox-checker.yml
vendored
Normal file
@@ -0,0 +1,152 @@
|
||||
name: Auto Close not reading issues or Fold checkboxes
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
check-then-close-or-fold:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Check for duplicate issues in last hour
|
||||
id: duplicate-check
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
||||
const currentIssueCreatedAt = new Date(context.payload.issue.created_at);
|
||||
const issueAuthor = context.payload.issue.user.login;
|
||||
|
||||
// 重新获取该用户最近的 issues
|
||||
const { data: userIssues } = await github.rest.issues.listForRepo({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
creator: issueAuthor,
|
||||
state: 'all',
|
||||
since: oneHourAgo.toISOString(),
|
||||
per_page: 30
|
||||
});
|
||||
|
||||
// 过滤出1小时内创建的其他 issues(排除当前 issue)
|
||||
const recentIssues = userIssues.filter(issue => {
|
||||
const issueCreatedAt = new Date(issue.created_at);
|
||||
return issue.number !== context.issue.number &&
|
||||
issueCreatedAt >= oneHourAgo &&
|
||||
issueCreatedAt < currentIssueCreatedAt;
|
||||
});
|
||||
|
||||
if (recentIssues.length > 0) {
|
||||
// 给当前 issue 添加标签
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels: ['rapid-submission']
|
||||
});
|
||||
|
||||
// 给1小时内的其他 issues 也添加标签
|
||||
for (const issue of recentIssues) {
|
||||
try {
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
labels: ['rapid-submission']
|
||||
});
|
||||
console.log(`Added rapid-submission label to issue #${issue.number}`);
|
||||
} catch (error) {
|
||||
console.log(`Failed to add label to issue #${issue.number}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- name: Check checkbox status
|
||||
id: unread-checkbox-check
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
// 找不到###就算了
|
||||
if (!/###([^#]+)###/.test(context.payload.issue.body)) {
|
||||
return false;
|
||||
}
|
||||
var checkList = /###([^#]+)###/.exec(context.payload.issue.body)[1];
|
||||
const UnreadRegexCn = /- \[x\]\s*.*?我.*未仔细阅读/i;
|
||||
const UnreadRegexCn_ = /- \[ \]\s*.*?我.*未仔细阅读/i;
|
||||
if (/- \[(x| )\]\s*.*?[\u4e00-\u9fa5]+/i.test(checkList)) { // 中英区分
|
||||
if (UnreadRegexCn.test(checkList)) {
|
||||
return true;
|
||||
}
|
||||
checkList = checkList.replace(UnreadRegexCn_, "");
|
||||
return /- \[ \]\s*.*?[\u4e00-\u9fa5]+/i.test(checkList);
|
||||
}
|
||||
const texts = [
|
||||
'I have checked all the options without carefully reading the content and believe this will not affect issue resolution.'];
|
||||
return texts.some(text => new RegExp(`- \\[x\\]\\s*${text}`).test(context.payload.issue.body));
|
||||
|
||||
- name: Close and lock issue
|
||||
if: steps.unread-checkbox-check.outputs.result == 'true'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
await github.rest.issues.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
state: 'closed',
|
||||
state_reason: 'not_planned'
|
||||
});
|
||||
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
labels: ['low-quality-report']
|
||||
});
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
body: '因为未阅读模板提示并正确提交,触发了自动关闭规则\n\nBecause the template prompt was not read and submitted correctly, the automatic closing rule was triggered'
|
||||
});
|
||||
|
||||
- name: Fold checkboxes
|
||||
if: steps.unread-checkbox-check.outputs.result == 'false'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const originalBody = context.payload.issue.body;
|
||||
if (originalBody.includes('<details><summary>Checkboxes</summary>\n\n')) {
|
||||
return;
|
||||
}
|
||||
const checkboxSectionRegex_cn_bug = /([\s\S]*?)(### 问题描述\n\n)/;
|
||||
const checkboxSectionRegex_cn_feat = /([\s\S]*?)(### 说说你遇到的问题?\n\n)/;
|
||||
const checkboxSectionRegex_en_bug = /([\s\S]*?)(### Description\n\n)/;
|
||||
const checkboxSectionRegex_en_feat = /([\s\S]*?)(### The problems you have encountered?\n\n)/;
|
||||
|
||||
const foldedBody_cn_bug = originalBody.replace(
|
||||
checkboxSectionRegex_cn_bug,
|
||||
`<details><summary>Checkboxes</summary>\n\n$1\n\n</details>\n\n$2`
|
||||
);
|
||||
const foldedBody_cn_feat = foldedBody_cn_bug.replace(
|
||||
checkboxSectionRegex_cn_feat,
|
||||
`<details><summary>Checkboxes</summary>\n\n$1\n\n</details>\n\n$2`
|
||||
);
|
||||
const foldedBody_en_bug = foldedBody_cn_feat.replace(
|
||||
checkboxSectionRegex_en_bug,
|
||||
`<details><summary>Checkboxes</summary>\n\n$1\n\n</details>\n\n$2`
|
||||
);
|
||||
const foldedBody = foldedBody_en_bug.replace(
|
||||
checkboxSectionRegex_en_feat,
|
||||
`<details><summary>Checkboxes</summary>\n\n$1\n\n</details>\n\n$2`
|
||||
);
|
||||
|
||||
await github.rest.issues.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.issue.number,
|
||||
body: foldedBody
|
||||
});
|
||||
5
.github/workflows/markdown-checker.yml
vendored
@@ -45,14 +45,11 @@ jobs:
|
||||
- name: Check dead links
|
||||
uses: lycheeverse/lychee-action@v2
|
||||
with:
|
||||
# 仅检查内部链接和 Github 相关链接
|
||||
# 仅检查内部链接,排除所有外部链接
|
||||
args: >
|
||||
--verbose --no-progress
|
||||
--cache --max-cache-age 1d --cache-exclude-status '429, 500..599'
|
||||
--exclude 'https?://.*'
|
||||
--include 'https?://github\.com/.*'
|
||||
--include 'https?://raw\.githubusercontent\.com/.*'
|
||||
--include 'https?://user-images\.githubusercontent\.com/.*'
|
||||
--exclude-path 'docs/zh-tw/manual/introduction/introduction_old.md'
|
||||
--exclude-path 'docs/ja-jp/manual/introduction/introduction_old.md'
|
||||
--exclude 'files/MAA_Runtime_Fix_Pwsh.ps1$'
|
||||
|
||||
17
.github/workflows/optimize-templates.yml
vendored
@@ -55,16 +55,17 @@ jobs:
|
||||
with:
|
||||
python-version: "3.11"
|
||||
|
||||
- name: Cache Python packages
|
||||
id: cache_python
|
||||
if: steps.check_push.outputs.is_pr != 'True' && always()
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.pythonLocation }}/lib/python3.11/site-packages
|
||||
key: ${{ runner.os }}-pip-optimize-templates-${{ hashFiles('./tools/OptimizeTemplates/requirements.txt') }}
|
||||
# - name: Cache Python packages
|
||||
# id: cache_python
|
||||
# if: steps.check_push.outputs.is_pr != 'True' && always()
|
||||
# uses: actions/cache@v4
|
||||
# with:
|
||||
# path: ${{ env.pythonLocation }}/lib/python3.11/site-packages
|
||||
# key: ${{ runner.os }}-pip-optimize-templates-${{ hashFiles('./tools/OptimizeTemplates/requirements.txt') }}
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.check_push.outputs.is_pr != 'True' && steps.cache_python.outputs.cache-hit != 'true'
|
||||
# if: steps.check_push.outputs.is_pr != 'True' && steps.cache_python.outputs.cache-hit != 'true'
|
||||
if: steps.check_push.outputs.is_pr != 'True'
|
||||
run: |
|
||||
pip install -r tools/OptimizeTemplates/requirements.txt
|
||||
|
||||
|
||||
19
.github/workflows/release-nightly-ota.yml
vendored
@@ -16,12 +16,12 @@ on:
|
||||
limit_maa:
|
||||
description: "Number of releases to fetch from MaaAssistantArknights"
|
||||
required: true
|
||||
default: 10
|
||||
default: "10"
|
||||
type: number
|
||||
limit_maarelease:
|
||||
limit_mr:
|
||||
description: "Number of releases to fetch from MaaRelease"
|
||||
required: true
|
||||
default: 10
|
||||
default: "10"
|
||||
type: number
|
||||
|
||||
jobs:
|
||||
@@ -298,8 +298,17 @@ jobs:
|
||||
run: |
|
||||
mkdir -pv build-ota && cd build-ota
|
||||
|
||||
gh release list --repo 'MaaAssistantArknights/MaaAssistantArknights' --limit ${{ inputs.limit_maa }} | tee ./release_maa.txt
|
||||
gh release list --repo "${{ github.repository_owner }}/MaaRelease" --limit ${{ inputs.limit_maarelease }} | tee ./release_mr.txt
|
||||
# Convert inputs to integers
|
||||
limit_maa=${{ inputs.limit_maa || 10 }}
|
||||
limit_maa=${limit_maa%.*}
|
||||
echo "Parsed limit_maa: $limit_maa"
|
||||
|
||||
limit_mr=${{ inputs.limit_mr || 10 }}
|
||||
limit_mr=${limit_mr%.*}
|
||||
echo "Parsed limit_mr: $limit_mr"
|
||||
|
||||
gh release list --repo 'MaaAssistantArknights/MaaAssistantArknights' --limit $limit_maa | tee ./release_maa.txt
|
||||
gh release list --repo "${{ github.repository_owner }}/MaaRelease" --limit $limit_mr | tee ./release_mr.txt
|
||||
echo ${{ needs.build-win-nightly.outputs.tag }} > ./config
|
||||
|
||||
cat ./release_maa.txt | awk '{ print $1 }' > ./tags_maa.txt
|
||||
|
||||
16
.github/workflows/res-update-game.yml
vendored
@@ -323,20 +323,12 @@ jobs:
|
||||
branch: ${{ github.ref }}
|
||||
github_token: ${{ secrets.MAA_RESOURCE_SYNC }}
|
||||
|
||||
- name: Update OTA resource
|
||||
if: steps.update_version.outputs.update_resources == 'True'
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
|
||||
run: |
|
||||
gh workflow --repo MaaAssistantArknights/MaaRelease run update-resource.yml
|
||||
|
||||
# - name: Delete cache
|
||||
# if: always()
|
||||
# - name: Update OTA resource
|
||||
# if: steps.update_version.outputs.update_resources == 'True'
|
||||
# env:
|
||||
# GH_TOKEN: ${{ github.token }}
|
||||
# GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
|
||||
# run: |
|
||||
# echo "Deleting the cache..."
|
||||
# gh cache delete
|
||||
# gh workflow --repo MaaAssistantArknights/MaaRelease run update-resource.yml
|
||||
|
||||
- name: Add cancelled status
|
||||
if: steps.update_version.outputs.changes != 'True' || steps.add_files.outputs.have_commits != 'True'
|
||||
|
||||
1
.github/workflows/sync-resource.yml
vendored
@@ -49,4 +49,3 @@ jobs:
|
||||
git status
|
||||
git commit -m "$commit_msg" || exit 0
|
||||
git push
|
||||
|
||||
|
||||
8
.github/workflows/website-workflow.yml
vendored
@@ -79,6 +79,14 @@ jobs:
|
||||
- name: Show environment
|
||||
run: echo ${{ env.AZURE_TARGET_ENV }}
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
if: env.AZURE_TARGET_ENV == 'prod'
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: "."
|
||||
publish_branch: gh-pages
|
||||
|
||||
- name: Deploy to Azure (prod)
|
||||
id: deploy-prod
|
||||
uses: Azure/static-web-apps-deploy@v1
|
||||
|
||||
7
.gitignore
vendored
@@ -467,3 +467,10 @@ Thumbs.db
|
||||
|
||||
# macOS Finder Shit
|
||||
.DS_Store
|
||||
|
||||
# MaaSupportExtension config
|
||||
/config/maa_pi_config.json
|
||||
|
||||
# MaaBuilder
|
||||
.github/workflows/release-maa-win.yml
|
||||
.github/workflows/dev-build-win.yml
|
||||
|
||||
@@ -1,127 +1,123 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"title": "Build Schema",
|
||||
"$ref": "#/definitions/build",
|
||||
"definitions": {
|
||||
"build": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"Continue": {
|
||||
"type": "boolean",
|
||||
"description": "Indicates to continue a previously failed build attempt"
|
||||
},
|
||||
"Help": {
|
||||
"type": "boolean",
|
||||
"description": "Shows the help text for this build assembly"
|
||||
},
|
||||
"Host": {
|
||||
"type": "string",
|
||||
"description": "Host for execution. Default is 'automatic'",
|
||||
"enum": [
|
||||
"AppVeyor",
|
||||
"AzurePipelines",
|
||||
"Bamboo",
|
||||
"Bitbucket",
|
||||
"Bitrise",
|
||||
"GitHubActions",
|
||||
"GitLab",
|
||||
"Jenkins",
|
||||
"Rider",
|
||||
"SpaceAutomation",
|
||||
"TeamCity",
|
||||
"Terminal",
|
||||
"TravisCI",
|
||||
"VisualStudio",
|
||||
"VSCode"
|
||||
]
|
||||
},
|
||||
"NoLogo": {
|
||||
"type": "boolean",
|
||||
"description": "Disables displaying the NUKE logo"
|
||||
},
|
||||
"Partition": {
|
||||
"type": "string",
|
||||
"description": "Partition to use on CI"
|
||||
},
|
||||
"Plan": {
|
||||
"type": "boolean",
|
||||
"description": "Shows the execution plan (HTML)"
|
||||
},
|
||||
"Profile": {
|
||||
"type": "array",
|
||||
"description": "Defines the profiles to load",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"Root": {
|
||||
"type": "string",
|
||||
"description": "Root directory during build execution"
|
||||
},
|
||||
"Skip": {
|
||||
"type": "array",
|
||||
"description": "List of targets to be skipped. Empty list skips all dependencies",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Default",
|
||||
"DevBuild",
|
||||
"DevBuildDefault",
|
||||
"DevBuildReleaseSimulation",
|
||||
"ReleaseMaa",
|
||||
"SetMaaChangeLog",
|
||||
"SetPackageBundled",
|
||||
"SetVersion",
|
||||
"UseClean",
|
||||
"UseCommitVersion",
|
||||
"UseMaaChangeLog",
|
||||
"UseMaaDevBundle",
|
||||
"UseMaaRelease",
|
||||
"UsePublishArtifact",
|
||||
"UsePublishRelease",
|
||||
"UseRsVersion",
|
||||
"UseTagVersion",
|
||||
"WithCompileCoreRelease",
|
||||
"WithCompileWpfRelease",
|
||||
"WithSyncRes"
|
||||
]
|
||||
}
|
||||
},
|
||||
"Target": {
|
||||
"type": "array",
|
||||
"description": "List of targets to be invoked. Default is '{default_target}'",
|
||||
"items": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Default",
|
||||
"DevBuild",
|
||||
"DevBuildDefault",
|
||||
"DevBuildReleaseSimulation",
|
||||
"ReleaseMaa",
|
||||
"SetMaaChangeLog",
|
||||
"SetPackageBundled",
|
||||
"SetVersion",
|
||||
"UseClean",
|
||||
"UseCommitVersion",
|
||||
"UseMaaChangeLog",
|
||||
"UseMaaDevBundle",
|
||||
"UseMaaRelease",
|
||||
"UsePublishArtifact",
|
||||
"UsePublishRelease",
|
||||
"UseRsVersion",
|
||||
"UseTagVersion",
|
||||
"WithCompileCoreRelease",
|
||||
"WithCompileWpfRelease",
|
||||
"WithSyncRes"
|
||||
]
|
||||
}
|
||||
},
|
||||
"Verbosity": {
|
||||
"type": "string",
|
||||
"description": "Logging verbosity during build execution. Default is 'Normal'",
|
||||
"enum": ["Minimal", "Normal", "Quiet", "Verbose"]
|
||||
}
|
||||
}
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"definitions": {
|
||||
"Host": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"AppVeyor",
|
||||
"AzurePipelines",
|
||||
"Bamboo",
|
||||
"Bitbucket",
|
||||
"Bitrise",
|
||||
"GitHubActions",
|
||||
"GitLab",
|
||||
"Jenkins",
|
||||
"Rider",
|
||||
"SpaceAutomation",
|
||||
"TeamCity",
|
||||
"Terminal",
|
||||
"TravisCI",
|
||||
"VisualStudio",
|
||||
"VSCode"
|
||||
]
|
||||
},
|
||||
"ExecutableTarget": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"Default",
|
||||
"DevBuild",
|
||||
"DevBuildDefault",
|
||||
"DevBuildReleaseSimulation",
|
||||
"ReleaseMaa",
|
||||
"SetMaaChangeLog",
|
||||
"SetPackageBundled",
|
||||
"SetVersion",
|
||||
"UseClean",
|
||||
"UseCommitVersion",
|
||||
"UseMaaChangeLog",
|
||||
"UseMaaDevBundle",
|
||||
"UseMaaRelease",
|
||||
"UsePublishArtifact",
|
||||
"UsePublishRelease",
|
||||
"UseRsVersion",
|
||||
"UseTagVersion",
|
||||
"WithCompileCoreRelease",
|
||||
"WithCompileWpfRelease",
|
||||
"WithSyncRes"
|
||||
]
|
||||
},
|
||||
"Verbosity": {
|
||||
"type": "string",
|
||||
"description": "",
|
||||
"enum": [
|
||||
"Verbose",
|
||||
"Normal",
|
||||
"Minimal",
|
||||
"Quiet"
|
||||
]
|
||||
},
|
||||
"NukeBuild": {
|
||||
"properties": {
|
||||
"Continue": {
|
||||
"type": "boolean",
|
||||
"description": "Indicates to continue a previously failed build attempt"
|
||||
},
|
||||
"Help": {
|
||||
"type": "boolean",
|
||||
"description": "Shows the help text for this build assembly"
|
||||
},
|
||||
"Host": {
|
||||
"description": "Host for execution. Default is 'automatic'",
|
||||
"$ref": "#/definitions/Host"
|
||||
},
|
||||
"NoLogo": {
|
||||
"type": "boolean",
|
||||
"description": "Disables displaying the NUKE logo"
|
||||
},
|
||||
"Partition": {
|
||||
"type": "string",
|
||||
"description": "Partition to use on CI"
|
||||
},
|
||||
"Plan": {
|
||||
"type": "boolean",
|
||||
"description": "Shows the execution plan (HTML)"
|
||||
},
|
||||
"Profile": {
|
||||
"type": "array",
|
||||
"description": "Defines the profiles to load",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"Root": {
|
||||
"type": "string",
|
||||
"description": "Root directory during build execution"
|
||||
},
|
||||
"Skip": {
|
||||
"type": "array",
|
||||
"description": "List of targets to be skipped. Empty list skips all dependencies",
|
||||
"items": {
|
||||
"$ref": "#/definitions/ExecutableTarget"
|
||||
}
|
||||
},
|
||||
"Target": {
|
||||
"type": "array",
|
||||
"description": "List of targets to be invoked. Default is '{default_target}'",
|
||||
"items": {
|
||||
"$ref": "#/definitions/ExecutableTarget"
|
||||
}
|
||||
},
|
||||
"Verbosity": {
|
||||
"description": "Logging verbosity during build execution. Default is 'Normal'",
|
||||
"$ref": "#/definitions/Verbosity"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{},
|
||||
{
|
||||
"$ref": "#/definitions/NukeBuild"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ src/maa-cli
|
||||
src/MaaMacGui
|
||||
|
||||
website/
|
||||
docs/
|
||||
# docs/
|
||||
|
||||
resource/Arknights-Tile-Pos/
|
||||
tools/OptimizeTemplates/optimize_templates.json
|
||||
|
||||
@@ -12,6 +12,12 @@
|
||||
"parser": "yaml",
|
||||
"tabWidth": 2
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": ["**/*.md"],
|
||||
"options": {
|
||||
"tabWidth": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
6
.vscode/settings.json
vendored
@@ -2,7 +2,8 @@
|
||||
"json.schemas": [
|
||||
{
|
||||
"fileMatch": [
|
||||
"resource/tasks.json"
|
||||
"resource/tasks/**/*.json",
|
||||
"resource/global/**/resource/tasks/**/*.json",
|
||||
],
|
||||
"url": "./docs/maa_tasks_schema.json"
|
||||
}
|
||||
@@ -11,5 +12,8 @@
|
||||
"MaaDeps/vcpkg/buildtrees": true,
|
||||
"MaaDeps/vcpkg/packages": true
|
||||
},
|
||||
"files.associations": {
|
||||
"**/resource/tasks/**/*.json": "jsonc"
|
||||
},
|
||||
"C_Cpp.exclusionPolicy": "checkFilesAndFolders"
|
||||
}
|
||||
|
||||
8
3rdparty/include/meojson/json5.hpp
vendored
@@ -1,8 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// IWYU pragma: begin_exports
|
||||
|
||||
#include "common/types.hpp"
|
||||
#include "parser5/parser5.hpp"
|
||||
|
||||
// IWYU pragma: end_exports
|
||||
175
3rdparty/include/meojson/parser/parser.hpp
vendored
@@ -19,6 +19,7 @@ namespace json
|
||||
// ****************************
|
||||
|
||||
template <
|
||||
bool accept_jsonc = false,
|
||||
typename string_t = default_string_t,
|
||||
typename parsing_t = void,
|
||||
typename accel_traits = _packed_bytes::packed_bytes_trait_max>
|
||||
@@ -56,6 +57,7 @@ private:
|
||||
|
||||
bool skip_string_literal_with_accel();
|
||||
bool skip_whitespace() noexcept;
|
||||
bool skip_comment() noexcept;
|
||||
bool skip_digit();
|
||||
bool skip_unicode_escape(uint16_t& pair_high, string_t& result);
|
||||
|
||||
@@ -74,14 +76,20 @@ auto parse(const parsing_t& content);
|
||||
template <typename char_t>
|
||||
auto parse(char_t* content);
|
||||
|
||||
template <typename parsing_t>
|
||||
auto parsec(const parsing_t& content);
|
||||
|
||||
template <typename char_t>
|
||||
auto parsec(char_t* content);
|
||||
|
||||
template <
|
||||
typename istream_t,
|
||||
typename = std::enable_if_t<
|
||||
std::is_base_of_v<std::basic_istream<typename istream_t::char_type>, istream_t>>>
|
||||
auto parse(istream_t& istream, bool check_bom);
|
||||
auto parse(istream_t& istream, bool check_bom = false, bool with_commets = false);
|
||||
|
||||
template <typename ifstream_t = std::ifstream, typename path_t = void>
|
||||
auto open(const path_t& path, bool check_bom = false);
|
||||
auto open(const path_t& path, bool check_bom = false, bool with_commets = false);
|
||||
|
||||
namespace literals
|
||||
{
|
||||
@@ -105,15 +113,17 @@ const basic_value<string_t> invalid_value();
|
||||
// * parser impl *
|
||||
// *************************
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline std::optional<basic_value<string_t>>
|
||||
parser<string_t, parsing_t, accel_traits>::parse(const parsing_t& content)
|
||||
parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse(const parsing_t& content)
|
||||
{
|
||||
return parser<string_t, parsing_t, accel_traits>(content.cbegin(), content.cend()).parse();
|
||||
return parser<accept_jsonc, string_t, parsing_t, accel_traits>(content.cbegin(), content.cend())
|
||||
.parse();
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline std::optional<basic_value<string_t>> parser<string_t, parsing_t, accel_traits>::parse()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline std::optional<basic_value<string_t>>
|
||||
parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse()
|
||||
{
|
||||
if (!skip_whitespace()) {
|
||||
return std::nullopt;
|
||||
@@ -135,8 +145,7 @@ inline std::optional<basic_value<string_t>> parser<string_t, parsing_t, accel_tr
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
// After the parsing is complete, there should be no more content other than
|
||||
// spaces behind
|
||||
// After the parsing is complete, there should be no more content other than spaces behind
|
||||
if (skip_whitespace()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
@@ -144,8 +153,8 @@ inline std::optional<basic_value<string_t>> parser<string_t, parsing_t, accel_tr
|
||||
return result_value;
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_value()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_value()
|
||||
{
|
||||
switch (*_cur) {
|
||||
case 'n':
|
||||
@@ -176,8 +185,8 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_va
|
||||
}
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_null()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_null()
|
||||
{
|
||||
for (const auto& ch : _utils::null_string<string_t>()) {
|
||||
if (_cur != _end && *_cur == ch) {
|
||||
@@ -191,8 +200,9 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_nu
|
||||
return basic_value<string_t>();
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_boolean()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t>
|
||||
parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_boolean()
|
||||
{
|
||||
switch (*_cur) {
|
||||
case 't':
|
||||
@@ -220,8 +230,8 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_bo
|
||||
}
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_number()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_number()
|
||||
{
|
||||
const auto first = _cur;
|
||||
if (*_cur == '-') {
|
||||
@@ -259,8 +269,8 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_nu
|
||||
return basic_value<string_t>(basic_value<string_t>::value_type::number, string_t(first, _cur));
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_string()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_string()
|
||||
{
|
||||
auto string_opt = parse_stdstring();
|
||||
if (!string_opt) {
|
||||
@@ -271,8 +281,8 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_st
|
||||
std::move(string_opt).value());
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_array()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_array()
|
||||
{
|
||||
if (*_cur == '[') {
|
||||
++_cur;
|
||||
@@ -296,6 +306,12 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_ar
|
||||
return invalid_value<string_t>();
|
||||
}
|
||||
|
||||
if constexpr (accept_jsonc) {
|
||||
if (*_cur == ']') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
basic_value<string_t> val = parse_value();
|
||||
|
||||
if (!val.valid() || !skip_whitespace()) {
|
||||
@@ -322,8 +338,8 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_ar
|
||||
return basic_array<string_t>(std::move(result));
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_object()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline basic_value<string_t> parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_object()
|
||||
{
|
||||
if (*_cur == '{') {
|
||||
++_cur;
|
||||
@@ -347,6 +363,12 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_ob
|
||||
return invalid_value<string_t>();
|
||||
}
|
||||
|
||||
if constexpr (accept_jsonc) {
|
||||
if (*_cur == '}') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto key_opt = parse_stdstring();
|
||||
|
||||
if (key_opt && skip_whitespace() && *_cur == ':') {
|
||||
@@ -389,8 +411,9 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_ob
|
||||
return basic_object<string_t>(std::move(result));
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_stdstring()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline std::optional<string_t>
|
||||
parser<accept_jsonc, string_t, parsing_t, accel_traits>::parse_stdstring()
|
||||
{
|
||||
if (*_cur == '"') {
|
||||
++_cur;
|
||||
@@ -477,8 +500,8 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<string_t, parsing_t, accel_traits>::skip_unicode_escape(
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<accept_jsonc, string_t, parsing_t, accel_traits>::skip_unicode_escape(
|
||||
uint16_t& pair_high,
|
||||
string_t& result)
|
||||
{
|
||||
@@ -574,8 +597,9 @@ inline bool parser<string_t, parsing_t, accel_traits>::skip_unicode_escape(
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<string_t, parsing_t, accel_traits>::skip_string_literal_with_accel()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool
|
||||
parser<accept_jsonc, string_t, parsing_t, accel_traits>::skip_string_literal_with_accel()
|
||||
{
|
||||
if constexpr (sizeof(*_cur) != 1) {
|
||||
return false;
|
||||
@@ -602,8 +626,8 @@ inline bool parser<string_t, parsing_t, accel_traits>::skip_string_literal_with_
|
||||
return _cur != _end;
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<string_t, parsing_t, accel_traits>::skip_whitespace() noexcept
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<accept_jsonc, string_t, parsing_t, accel_traits>::skip_whitespace() noexcept
|
||||
{
|
||||
while (_cur != _end) {
|
||||
switch (*_cur) {
|
||||
@@ -613,6 +637,17 @@ inline bool parser<string_t, parsing_t, accel_traits>::skip_whitespace() noexcep
|
||||
case '\n':
|
||||
++_cur;
|
||||
break;
|
||||
case '/':
|
||||
if constexpr (accept_jsonc) {
|
||||
if (!skip_comment()) {
|
||||
return false;
|
||||
}
|
||||
// else continue;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case '\0':
|
||||
return false;
|
||||
default:
|
||||
@@ -622,8 +657,59 @@ inline bool parser<string_t, parsing_t, accel_traits>::skip_whitespace() noexcep
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<string_t, parsing_t, accel_traits>::skip_digit()
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
bool json::parser<accept_jsonc, string_t, parsing_t, accel_traits>::skip_comment() noexcept
|
||||
{
|
||||
if (_cur == _end || *_cur != '/') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (++_cur == _end) {
|
||||
return false;
|
||||
}
|
||||
|
||||
enum class comment_type
|
||||
{
|
||||
invalid,
|
||||
line,
|
||||
block,
|
||||
} t = comment_type::invalid;
|
||||
|
||||
switch (*_cur++) {
|
||||
case '/':
|
||||
t = comment_type::line;
|
||||
break;
|
||||
case '*':
|
||||
t = comment_type::block;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
while (_cur != _end) {
|
||||
switch (*_cur++) {
|
||||
case '\n':
|
||||
if (t == comment_type::line) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
if (t == comment_type::block && _cur != _end && *_cur == '/') {
|
||||
++_cur;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// _cur == _end
|
||||
return t == comment_type::line;
|
||||
}
|
||||
|
||||
template <bool accept_jsonc, typename string_t, typename parsing_t, typename accel_traits>
|
||||
inline bool parser<accept_jsonc, string_t, parsing_t, accel_traits>::skip_digit()
|
||||
{
|
||||
// At least one digit
|
||||
if (_cur != _end && std::isdigit(*_cur)) {
|
||||
@@ -653,7 +739,7 @@ template <typename parsing_t>
|
||||
auto parse(const parsing_t& content)
|
||||
{
|
||||
using string_t = std::basic_string<typename parsing_t::value_type>;
|
||||
return parser<string_t, parsing_t>::parse(content);
|
||||
return parser<false, string_t, parsing_t>::parse(content);
|
||||
}
|
||||
|
||||
template <typename char_t>
|
||||
@@ -663,7 +749,7 @@ auto parse(char_t* content)
|
||||
}
|
||||
|
||||
template <typename istream_t, typename _>
|
||||
auto parse(istream_t& ifs, bool check_bom)
|
||||
auto parse(istream_t& ifs, bool check_bom, bool with_commets)
|
||||
{
|
||||
using string_t = std::basic_string<typename istream_t::char_type>;
|
||||
|
||||
@@ -686,11 +772,11 @@ auto parse(istream_t& ifs, bool check_bom)
|
||||
str.assign(str.begin() + 3, str.end());
|
||||
}
|
||||
}
|
||||
return parse(str);
|
||||
return with_commets ? parsec(str) : parse(str);
|
||||
}
|
||||
|
||||
template <typename ifstream_t, typename path_t>
|
||||
auto open(const path_t& filepath, bool check_bom)
|
||||
auto open(const path_t& filepath, bool check_bom, bool with_commets)
|
||||
{
|
||||
using char_t = typename ifstream_t::char_type;
|
||||
using string_t = std::basic_string<char_t>;
|
||||
@@ -701,11 +787,24 @@ auto open(const path_t& filepath, bool check_bom)
|
||||
if (!ifs.is_open()) {
|
||||
return return_t(std::nullopt);
|
||||
}
|
||||
auto opt = parse(ifs, check_bom);
|
||||
auto opt = parse(ifs, check_bom, with_commets);
|
||||
ifs.close();
|
||||
return opt;
|
||||
}
|
||||
|
||||
template <typename parsing_t>
|
||||
auto parsec(const parsing_t& content)
|
||||
{
|
||||
using string_t = std::basic_string<typename parsing_t::value_type>;
|
||||
return parser<true, string_t, parsing_t>::parse(content);
|
||||
}
|
||||
|
||||
template <typename char_t>
|
||||
auto parsec(char_t* content)
|
||||
{
|
||||
return parsec(std::basic_string_view<std::decay_t<char_t>> { content });
|
||||
}
|
||||
|
||||
namespace literals
|
||||
{
|
||||
inline value operator""_json(const char* str, size_t len)
|
||||
|
||||
1539
3rdparty/include/meojson/parser5/parser5.hpp
vendored
18
3rdparty/include/meojson/parser5/unicode.h
vendored
183
CHANGELOG.md
@@ -1,108 +1,141 @@
|
||||
## v5.16.4
|
||||
## v5.23.0
|
||||
|
||||
### 修复 | Fix
|
||||
### 夏活第二弹 | Highlight
|
||||
|
||||
* 修复台服基建干员列表回正错误 (#12652) @status102
|
||||
本次更新带来了大家期盼已久的多项适配,一起来看看吧:
|
||||
|
||||
## v5.16.3
|
||||
#### 集成战略 #6「岁的界园志异」
|
||||
|
||||
在这个版本,我们优化了自适应调整连战次数功能,每次开始前均调整为可用的最大次数,避免了理智溢出的风险.
|
||||
本次更新我们对界园肉鸽做了多项适配:
|
||||
|
||||
> 典型流程示例:
|
||||
> 当前20理智, 上限150, 关卡消耗21理智 (6连战需126理智)
|
||||
>
|
||||
> 情况1: 有2瓶80理智药, 设置吃2瓶, 吃完两瓶理智药超出上限 (20 + 160 = 180) → 先吃一瓶 (20 + 80 = 100) 并调整次数为4连战 (4 × 21 = 84), 完成后再吃一瓶并消耗完剩下的理智
|
||||
> 情况2: 有2瓶80理智药, 设置只吃1瓶吃1瓶 (+80) 达到吃药上限,关闭窗口触发调整 → 自动调整为4连战
|
||||
> 情况3: 有1瓶80理智药, 自动吃掉1瓶 (+80) 无药可吃触发调整 → 自动调整为4连战
|
||||
1. 现在牛牛支持刷开局策略了,博士可以用来自动刷热水壶等等~
|
||||
2. 刷等级策略下,牛牛支持进入道中的树洞层,而不是直接跳过。
|
||||
|
||||
并且指定次数将联动连战次数
|
||||
#### 其他方面
|
||||
|
||||
> 示例: 假设当前 100 理智, 关卡消耗 6 理智
|
||||
>
|
||||
> 旧版本: 指定次数设为 3, 连战次数设为 5, 将作战 5 * 3 = 15 次, 消耗 15 x 6 = 90 理智
|
||||
> 新版本: 指定次数设为 10, 连战次数设为 4, 将作战 4 * floor(10 / 4) = 8 次, 消耗 8 x 6 = 48 理智
|
||||
> 新版本: 指定次数设为 10, 连战次数设为 AUTO, 将作战 6 * floor(10 / 6) + (10 % 6) = 10 次, 消耗 10 x 6 = 60 理智
|
||||
本次更新,牛牛支持对新的动态主题「梦乡」进行识别,博士们可以尽情享受两年前的那个夏天啦~
|
||||
|
||||
如果您遇到任何意外行为,请通过【设置】→【问题反馈】生成日志并提交给我们~
|
||||
以及~~虽然不知道有什么作用,但~~支持对设置的各个小节进行手动排序,拖动设置页左侧目录即可。
|
||||
|
||||
----
|
||||
|
||||
In this version, we've optimized the adaptive Serie count adjustment feature. Before each operation, the system will now automatically adjust to the maximum available Serie count, eliminating the risk of sanity overflow.
|
||||
#### [CN ONLY] Integrated Strategies #6 "Sui's Garden of Grotesqueries"
|
||||
|
||||
> Typical workflow examples:
|
||||
> Current sanity: 20, Max sanity: 150, Stage cost: 21 sanity (6-Serie requires 126 sanity)
|
||||
>
|
||||
> Case 1: Having 2×80 sanity potions, set to consume 2 potions. Full consumption would exceed max sanity (20 + 160 = 180) → First consume one potion (20 + 80 = 100) and adjust to 4-Serie (4 × 21 = 84). After completion, consume the second potion and expend remaining sanity.
|
||||
> Case 2: Having 2×80 sanity potions, set to consume only 1 potion (+80) reaches consumption limit. Closing window triggers adjustment → Automatically adjusts to 4-Serie.
|
||||
> Case 3: Having 1×80 sanity potion, auto-consume 1 potion (+80). With no remaining potions, triggers adjustment → Automatically adjusts to 4-Serie.
|
||||
In this update, we've made several adaptations for the Garden I.S.:
|
||||
|
||||
Additionally, specified operation count will now coordinate with Serie count:
|
||||
1. MAA now supports "Grind to obtain Hot Water Kettle or Elite II Operators" strategies, allowing Doctors to automatically obtain Hot Water Kettle~
|
||||
2. Under Gaining Experience Points strategies, MAA can now enter the Wonderland Encounter(误入奇境) during the run instead of skipping them directly.
|
||||
|
||||
> Example: Current 100 sanity, stage cost 6 sanity
|
||||
>
|
||||
> Old version: Specified count set to 3, Serie count set to 5 → Would complete 5 * 3 = 15 operations, consuming 15 x 6 = 90 sanity.
|
||||
> New version: Specified count set to 10, Serie count set to 4 → Will complete 4 * floor(10 / 4) = 8 operations, consuming 8 x 6 = 48 sanity.
|
||||
> New version: Specified count set to 10, Serie count set to AUTO → Will complete 6 * floor(10 / 6) + (10 % 6) = 10 operations, consuming 10 x 6 = 60 sanity.
|
||||
#### Other Aspects
|
||||
|
||||
If you encounter any unexpected behavior, please generate logs via [Settings] → [Issue Report] and submit them to us~
|
||||
In this update, MAA now supports recognition of the new dynamic theme "Dreamland", allowing Doctors to fully relive that summer from two years ago~
|
||||
|
||||
Additionally~~though NiuNiu isn’t quite sure what purpose it serves, but~~ manual sorting of various sections in the settings is now supported. Simply drag the directory on the left side of the settings page.
|
||||
|
||||
----
|
||||
|
||||
以下是详细内容: Changelog below:
|
||||
以下是详细内容:
|
||||
|
||||
### 新增 | New
|
||||
|
||||
* 添加萨卡兹肉鸽劳作的清晨关卡策略 (#12626) @1286587265 @Daydreamer114 @Saratoga-Official
|
||||
* 指定次数联动连战, 修复连战导致指定次数失效, Auto模式不再溢出理智 (#12592) @status102 @ABA2396 @Constrat
|
||||
* 添加 自定义 webhook 功能 (#12602) @KagurazakaIris @ABA2396
|
||||
* 肉鸽适配新干员 (#12599) @Saratoga-Official
|
||||
* Mac AUTO连续作战 @hguandl
|
||||
* 更新 333 搓玉一天三换排班表 (#12604) @E022-23093
|
||||
* 更新 243 极限效率一天四换排班表(20250507 修订) (#12598) @bodayw
|
||||
* 新保全作业 (#13754) @Saratoga-Official
|
||||
* 界园肉鸽烧水 (#13690) @SherkeyXD @ABA2396
|
||||
* 支持 `梦乡` 主题 (#13693) @ABA2396
|
||||
* 优化标题栏显示效果 @ABA2396
|
||||
* 版本后面也跟个日期 @ABA2396
|
||||
* 幸运掉落用家具零件代替显示 @ABA2396
|
||||
* `ADB 连接失败时尝试启动模拟器` 勾选框在 `连接设置` 与 `启动设置` 中同时显示 @ABA2396
|
||||
* 支持 MuMu 5555 端口使用控制台退出与截图增强 @ABA2396
|
||||
* 反转网络桥接提示框的按钮位置,避免误勾选 @ABA2396
|
||||
* 自动编队支持指定使用编队 @ABA2396
|
||||
* 调整自动战斗页面布局 @ABA2396
|
||||
* 调整编队界面翻译 @ABA2396
|
||||
* 适配界园树洞节点 (#13552) @travellerse
|
||||
* 设置排序 (#13699) @ABA2396
|
||||
* 调整自动战斗页面布局 @ABA2396
|
||||
* 使用编队宽度自适应 @ABA2396
|
||||
|
||||
### 改进 | Improved
|
||||
|
||||
* 日志压缩包压缩等级提升 (#12622) @BxFS
|
||||
* 基建使用切换职业栏返回列表最左侧 (#12594) @ABA2396
|
||||
* 合并 regex @status102
|
||||
* 仓库识别改用二值化后的非 char 模型识别 (#13667) @ABA2396
|
||||
* 繁中服基建 + 保全派駐 7 相關更新 (#13643) @momomochi987
|
||||
* 更新 nuke 版本与构建 @SherkeyXD
|
||||
* 更新 MaaBuilder 中使用的过时方法 @SherkeyXD
|
||||
* 代理倍率、肉鸽难度 使用 `不切换` 代替 `当前`、`不使用` 以符合实际逻辑 (#13612) @status102 @HX3N @Constrat
|
||||
* wpf 肉鸽难度初始化优化 @status102
|
||||
* 不同更新渠道加个描述 (#13734) @status102 @momomochi987 @Constrat @HX3N
|
||||
* 自动战斗使用编队选择框 UI @status102
|
||||
* 一键长草任务列表翻转按钮下拉框样式优化 @status102
|
||||
|
||||
### 修复 | Fix
|
||||
|
||||
* 切换账号失败 @Daydreamer114
|
||||
* 模拟器路径选择功能弹窗异常 @ABA2396
|
||||
* 截图增强显示错误 @ABA2396
|
||||
* 无法进入活动 @ABA2396
|
||||
* 刷理智结束后卡在“理智药选择”界面 @ABA2396
|
||||
* 萨米肉鸽刷坍缩范式闪退 @ABA2396
|
||||
* 修复界园树洞无可用节点时任务失败 (#13741) @travellerse
|
||||
* 修复萨卡兹肉鸽部分字段无法正确识别的问题 (#13691) @THSLP13
|
||||
* 无法区分界园 3/5 层 boss @ABA2396
|
||||
* 因招募动画卡预见密文板 (#13680) @ABA2396
|
||||
* 修修 ocr bin threshold 被 task info 错误覆盖 @status102
|
||||
* 获得排异反应的干员无法选择技能 @ABA2396
|
||||
* 移除使用 empty.png 当 JustReturn 屎 (#13652) @status102
|
||||
* 识别错误等待 +200ms @status102
|
||||
* 肉鸽投资可能由于存款被长期遮挡导致提前退出 @status102
|
||||
* 未启用备选关卡也会输出剿灭提醒 @status102
|
||||
* 合成密文板未进入合成页面导致卡死 @ABA2396
|
||||
* 修复 fody 一直报 warning @SherkeyXD
|
||||
* 商店因为动画卡在源石锭不足 @ABA2396
|
||||
* 理智药背景干扰使用数量识别 @status102
|
||||
* 第一层没出商店时会在第三层才退出 @ABA2396
|
||||
* 肉鸽任务高级设置界面 xaml 错误修复 @status102
|
||||
* 肉鸽种子选择框 visibility 判断更新 @status102
|
||||
* 每次截图测试前断开模拟器连接以获取最新的最快截图耗时 @ABA2396
|
||||
* 锻冶旧迹 导航识别错误 @ABA2396
|
||||
* 追加自定干员职业与最后编入干员职业相同时, 误展开子职业列表 @status102
|
||||
* 肉鸽烧水选择当前难度时禁用 0 难烧水切换 @status102
|
||||
* 移除未使用 @status102
|
||||
* 肉鸽投资在单次投资达到 999 时可能无法退出 @status102
|
||||
* 修复掉落上报消息类型没有在 Python 层定义导致外部脚本报错的问题 (#13723) @husy8
|
||||
* debug version 拿不到活动关卡 @ABA2396
|
||||
* 干员识别输出遗漏干员持有情况、潜能 @status102
|
||||
* 剿灭失败不报错 @status102
|
||||
* 傀影卡在无法进行初始招募的深入探索月度小队 @ABA2396
|
||||
* schema error @ABA2396
|
||||
* add slight delay before `InfrastEnteredFlag' in case of stutters in base rendering @Constrat
|
||||
* EN Phantom IS font change nextlevel fix @Constrat
|
||||
* start plugin task not enough delay (#13623) @Constrat
|
||||
|
||||
### 文档 | Docs
|
||||
|
||||
* 连战次数文档更新 @status102
|
||||
* 更正保全派驻协议文档中的拼写错误 (#12578) @lucienshawls
|
||||
* 更正主文档和中文文档中的两处错别字 (#12577) @lucienshawls
|
||||
* 修正 `刷理智` 文档表述错误 (#13745) @vcfch843875
|
||||
* MuMu 5.0 文档介绍 (#13658) @Rbqwow
|
||||
* 文档站小修复 (#13659) @Rbqwow
|
||||
* 文档日语化翻译 (#13713) @vcfch843875
|
||||
|
||||
### 其他 | Other
|
||||
|
||||
* 调整提示颜色 @ABA2396
|
||||
* 开始战斗前闪退无限循环识别,关卡名检查放宽至一分钟 (#12580) @ABA2396
|
||||
* 肉鸽招募 练度不够干员的 priority 可能为正 @Daydreamer114
|
||||
* 战斗次数识别错误缓解 @status102
|
||||
* 关闭连战列表点击 @status102
|
||||
* 关闭连战列表 @status102
|
||||
* 移除肉鸽难度hard code (#12587) @status102
|
||||
* 连战次数修复, 减少hard code @status102
|
||||
* 补上之前漏改的 tasks 路径修改 @ABA2396
|
||||
* 连战减少不必要的次数调整 @status102
|
||||
* 战斗次数识别错误处理 @status102
|
||||
* 关卡理智识别流程通用化 @status102
|
||||
* 减少一次不必要的连战次数变更 @status102
|
||||
* 移除过旧的任务参数 @status102
|
||||
* 优化提示 @ABA2396
|
||||
* 连战新增 -1 表示禁用切换 @ABA2396
|
||||
* 修改连接失败提示描述 @ABA2396
|
||||
* YostarKR BattleStartPre add ocrReplace pattern @HX3N
|
||||
* YostarJP ocr edits (#12607) @Manicsteiner
|
||||
* HttpService调整, Post函数追加 (#12605) @status102
|
||||
* 好像提示了也没人看 @ABA2396
|
||||
* 加点常用的进来 @status102
|
||||
* 调整超时提醒输出 @ABA2396
|
||||
* 理智识别 @status102
|
||||
* Reapply "feat:实现自适应调整连战次数 (#12555)" @Yoak3n @ABA2396
|
||||
* 迁移 UpdateStageList @status102
|
||||
* _stageManager 迁移 @status102
|
||||
* binThreshold, useRaw 直接写入 task @status102
|
||||
* 繁中服「出蒼白海」導航入口文字調整 (#13681) @momomochi987
|
||||
* 调整 LDExtras 文件位置 @ABA2396
|
||||
* 自动战斗存图阈值改为0.75 @ABA2396
|
||||
* 刷理智任务指定材料不再使用双属性保存,仅保存物品 id @status102
|
||||
* 密文板加一个进入后检查 @ABA2396
|
||||
* 繁中服「出蒼白海」活動導航 (#13644) @momomochi987
|
||||
* 添加 null 检测 @SherkeyXD
|
||||
* 合并 ocrBinThreshold (#13635) @status102
|
||||
* gitignore 添加 MaaBuilder 相关内容 @SherkeyXD
|
||||
* TestLinkAndGetImage 不允许同时运行 @ABA2396
|
||||
* 模板轮换 (#13625) @status102
|
||||
* 基建设施排序初始化 @status102
|
||||
* wpf 任务名字段统一 @status102
|
||||
* 基建设施种类 @status102
|
||||
* CustomTask 存储 @status102
|
||||
* 浅调一下初始化顺序 @status102
|
||||
* KR tweak copilot option translation @HX3N
|
||||
* catch 一下企鹅物流的上报错误请求,避免影响重试逻辑 @ABA2396
|
||||
* YostarKR CharsNameOcrReplace ocr edit @HX3N
|
||||
* rename MinimumFeatureLevel to minimumFeatureLevel @SherkeyXD
|
||||
* add copyright header @SherkeyXD
|
||||
* add nullable flags @SherkeyXD
|
||||
* add missing png suffix to templates @SherkeyXD
|
||||
|
||||
@@ -81,7 +81,8 @@ if (BUILD_TEST)
|
||||
target_link_libraries(test MaaCore)
|
||||
endif (BUILD_TEST)
|
||||
|
||||
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs videoio)
|
||||
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs videoio features2d)
|
||||
find_package(OpenCV QUIET COMPONENTS xfeatures2d)
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(cpr CONFIG REQUIRED)
|
||||
|
||||
|
||||
@@ -20,58 +20,61 @@ openfiles >nul 2>&1
|
||||
if %errorlevel% neq 0 (
|
||||
echo %YELLOW%正在获取管理员权限...%RESET%
|
||||
echo %YELLOW%Obtaining administrator privileges...%RESET%
|
||||
powershell -Command "Start-Process cmd.exe -ArgumentList '/c %~dpnx0' -Verb RunAs"
|
||||
powershell -Command "Start-Process cmd.exe -ArgumentList '/c %~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
echo.
|
||||
echo %BLUE%========================================%RESET%
|
||||
echo %BLUE%====================================================================================================%RESET%
|
||||
echo %BOLD%%CYAN%正在安装 Microsoft Visual C++ Redistributable%RESET%
|
||||
echo %BOLD%%CYAN%Installing Microsoft Visual C++ Redistributable%RESET%
|
||||
echo %BLUE%========================================%RESET%
|
||||
echo.
|
||||
|
||||
echo %YELLOW%如果是第一次使用 winget,可能会提示接受协议,请输入 Y 并按回车继续%RESET%
|
||||
echo %YELLOW%If this is your first time using winget, you may be prompted to accept the terms. %RESET%
|
||||
echo %YELLOW%Please enter Y and press Enter to continue.%RESET%
|
||||
echo.
|
||||
|
||||
winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
|
||||
if %errorlevel% neq 0 (
|
||||
echo.
|
||||
echo %BOLD%%RED%错误: Microsoft.VCRedist.2015+.x64 安装失败%RESET%
|
||||
echo %BOLD%%RED%Error: Microsoft.VCRedist.2015+.x64 installation failed%RESET%
|
||||
set "ErrorOccurred=1"
|
||||
)
|
||||
echo %BLUE%====================================================================================================%RESET%
|
||||
|
||||
echo.
|
||||
echo %BLUE%========================================%RESET%
|
||||
echo %BLUE%====================================================================================================%RESET%
|
||||
echo %BOLD%%CYAN%正在安装 .NET Desktop Runtime 8.0%RESET%
|
||||
echo %BOLD%%CYAN%Installing .NET Desktop Runtime 8.0%RESET%
|
||||
echo %BLUE%========================================%RESET%
|
||||
echo.
|
||||
|
||||
winget install "Microsoft.DotNet.DesktopRuntime.8" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
|
||||
if %errorlevel% neq 0 (
|
||||
echo.
|
||||
echo %BOLD%%RED%错误: Microsoft.DotNet.DesktopRuntime.8 安装失败%RESET%
|
||||
echo %BOLD%%RED%Error: Microsoft.DotNet.DesktopRuntime.8 installation failed%RESET%
|
||||
set "ErrorOccurred=1"
|
||||
)
|
||||
echo %BLUE%====================================================================================================%RESET%
|
||||
|
||||
echo.
|
||||
if %ErrorOccurred% equ 0 (
|
||||
echo %BOLD%%GREEN%运行库修复完成,请重启电脑后再次尝试运行 MAA。%RESET%
|
||||
echo %BOLD%%GREEN%The runtime library repair is complete. Please restart your computer and try running MAA again.%RESET%
|
||||
) else (
|
||||
echo %RED%========================================%RESET%
|
||||
echo %RED%====================================================================================================%RESET%
|
||||
echo %BOLD%%RED%运行库修复过程中出现错误%RESET%
|
||||
echo %BOLD%%RED%Errors occurred during runtime library repair%RESET%
|
||||
echo.
|
||||
echo %YELLOW%您可以尝试手动下载并安装以下组件:%RESET%
|
||||
echo %YELLOW%You can try to manually download and install the following components:%RESET%
|
||||
echo %YELLOW%如果提示%RESET% %WHITE%'winget' is not...%RESET% %YELLOW%说明您的电脑版本太老了,没有自带 winget%RESET%
|
||||
echo %YELLOW%If the prompt shows%RESET% %WHITE%'winget' is not...%RESET% %YELLOW%it means your system is too old and don't include winget by default.%RESET%
|
||||
echo.
|
||||
echo %YELLOW%您可以手动将以下两个链接复制到浏览器中打开,下载并安装所需组件。如果安装成功,无需再次运行本依赖库安装脚本。%RESET%
|
||||
echo %YELLOW%You can manually copy the following two links into your browser to download and install the required components.%RESET%
|
||||
echo %YELLOW%If the installation is successful, you don't need to run this dependency installation script again.%RESET%
|
||||
echo.
|
||||
echo %WHITE%Microsoft Visual C++ Redistributable:%RESET%
|
||||
echo %CYAN%https://aka.ms/vs/17/release/vc_redist.x64.exe%RESET%
|
||||
echo.
|
||||
echo %WHITE%.NET Desktop Runtime 8.0:%RESET%
|
||||
echo %CYAN%https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe%RESET%
|
||||
echo %RED%========================================%RESET%
|
||||
echo %RED%====================================================================================================%RESET%
|
||||
)
|
||||
|
||||
pause
|
||||
pause
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EN/@EntryIndexedValue">EN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KR/@EntryIndexedValue">KR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JP/@EntryIndexedValue">JP</s:String>
|
||||
@@ -69,6 +69,7 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=desp/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=dnplayer/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ehem/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Epilog/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=esource/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Eyjafjalla/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Favourite/@EntryIndexedValue">True</s:Boolean>
|
||||
@@ -83,6 +84,8 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Gacha/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Gavial/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Grandet/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=HKEY/@EntryIndexedValue">True</s:Boolean>
|
||||
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hotkey/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=hwnd/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Infrast/@EntryIndexedValue">True</s:Boolean>
|
||||
@@ -104,7 +107,9 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=mirrorc/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mirrorchyan/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mizuki/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=mrfz/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mumu/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nahimic/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nemu/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Netease/@EntryIndexedValue">True</s:Boolean>
|
||||
|
||||
@@ -121,6 +126,7 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Orundums/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=o_FF9Fv_FF9F/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pallas/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=penguinid/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=pidl/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Pormpt/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=powrprof/@EntryIndexedValue">True</s:Boolean>
|
||||
@@ -166,5 +172,6 @@
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Yahei/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=yituliu/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Yostar/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=ZOOT/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0020_0020_0020wp_002ELength_0020/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=_0020_003D_0020stri/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
|
||||
@@ -202,7 +202,7 @@ MAA 以中文(简体)为第一语言,翻译词条均以中文(简体)
|
||||
|
||||
## 广告
|
||||
|
||||
用户交流 QQ 群:[MAA 使用 & 粥游交流 QQ 群](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
用户交流 QQ 群:[MAA 使用 & 粥游交流 QQ 群](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
Discord 服务器: [邀请链接](https://discord.gg/23DfZ9uA4V)
|
||||
用户交流 TG 群:[Telegram 群](https://t.me/+Mgc2Zngr-hs3ZjU1)
|
||||
自动战斗 JSON 作业分享:[prts.plus](https://prts.plus)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { VNode } from "vue";
|
||||
import { defineComponent, h } from "vue";
|
||||
import { defineComponent, h, computed } from "vue";
|
||||
|
||||
import NavbarDropdown from "@theme-hope/modules/navbar/components/NavbarDropdown";
|
||||
import { I18nIcon } from "@theme-hope/modules/navbar/components/icons/index";
|
||||
@@ -11,17 +11,20 @@ export default defineComponent({
|
||||
setup() {
|
||||
const dropdown = useNavbarLanguageDropdown();
|
||||
|
||||
const filteredDropdown = () => {
|
||||
const filteredDropdown = computed(() => {
|
||||
if (!dropdown.value) return null;
|
||||
|
||||
const filteredConfig = { ...dropdown.value };
|
||||
|
||||
if (filteredConfig.children) {
|
||||
filteredConfig.children = filteredConfig.children.filter(item => item.link !== '/');
|
||||
filteredConfig.children = filteredConfig.children.filter(item => {
|
||||
// 过滤掉跳转到根目录的项目
|
||||
return item.link !== '/' && item.link !== '/docs/' && !item.link?.endsWith('/docs/');
|
||||
});
|
||||
}
|
||||
|
||||
return filteredConfig;
|
||||
};
|
||||
});
|
||||
|
||||
//console.log("OldLanguageDropdown", dropdown.value);
|
||||
//console.log("NewLanguageDropdown", filteredDropdown());
|
||||
@@ -33,11 +36,11 @@ export default defineComponent({
|
||||
{ class: "vp-nav-item" },
|
||||
h(
|
||||
NavbarDropdown,
|
||||
{ config: filteredDropdown() },
|
||||
{ config: filteredDropdown.value },
|
||||
{
|
||||
title: () =>
|
||||
h(I18nIcon, {
|
||||
"aria-label": filteredDropdown()?.ariaLabel,
|
||||
"aria-label": filteredDropdown.value?.ariaLabel,
|
||||
style: {
|
||||
width: "1rem",
|
||||
height: "1rem",
|
||||
|
||||
@@ -14,11 +14,6 @@ export default defineUserConfig({
|
||||
port: 3001,
|
||||
|
||||
locales: {
|
||||
"/": {
|
||||
lang: " ",
|
||||
title: " ",
|
||||
description: " ",
|
||||
},
|
||||
"/zh-cn/": {
|
||||
lang: "zh-cn",
|
||||
description: "文档",
|
||||
|
||||
BIN
docs/.vuepress/public/images/ko-kr/readme/1-dark.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
BIN
docs/.vuepress/public/images/ko-kr/readme/2-dark.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 24 KiB |
BIN
docs/.vuepress/public/images/ko-kr/readme/3-dark.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/.vuepress/public/images/ko-kr/readme/3-light.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
docs/.vuepress/public/images/ko-kr/readme/4-dark.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/.vuepress/public/images/ko-kr/readme/4-light.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
@@ -5,6 +5,16 @@ $vp-font: '-apple-system, BlinkMacSystemFont, "Noto Sans SC", "Segoe UI", Roboto
|
||||
$vp-font-heading: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "ST Heiti", sans-serif';
|
||||
$vp-font-mono: '"Sarasa Gothic", "Jetbrains mono", "Fira Code", "Noto Sans SC", Consolas, monospace, Menlo, "Courier New"';
|
||||
|
||||
.vp-hero-slide-down-button {
|
||||
display: none !important;
|
||||
visibility: hidden !important;
|
||||
}
|
||||
|
||||
.vp-skip-link.sr-only {
|
||||
display: none !important;
|
||||
visibility: hidden !important;
|
||||
}
|
||||
|
||||
html[lang="ja-JP"] {
|
||||
$vp-font: "Helvetica Neue, Arial, Hiragino Kaku Gothic ProN, Hiragino Sans, Meiryo, sans-serif";
|
||||
}
|
||||
|
||||
137
docs/en-us/develop/ci-tutorial.md
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
order: 7
|
||||
icon: devicon-plain:githubactions
|
||||
---
|
||||
|
||||
# CI System Analysis
|
||||
|
||||
MAA leverages GitHub Actions to complete a large amount of automation work, including website building, automatic resource updates, final file building and release processes, etc. Over time, these CI workflows have gradually become nested, with some even pointing to other repositories. This document aims to provide a brief introduction for those who want to improve MAA's CI system.
|
||||
|
||||
Before reading this document, it's best to have a basic understanding of MAA's project structure and components.
|
||||
|
||||
::: tip
|
||||
You can quickly navigate to the section you want to see by searching for CI file names within this page
|
||||
:::
|
||||
|
||||
Workflow files are all stored under `.github/workflows`, and each file can be categorized into the following functional parts:
|
||||
|
||||
+ [Code Testing](#code-testing)
|
||||
+ [Code Building](#code-building)
|
||||
+ [Version Release](#version-release)
|
||||
+ [Resource Updates](#resource-updates)
|
||||
+ [Website Building](#website-building)
|
||||
+ [Issues Management](#issues-management)
|
||||
+ [Pull Requests Management](#pull-requests-management)
|
||||
+ [MirrorChyan Related](#mirrorchyan-related)
|
||||
+ [Others](#others)
|
||||
|
||||
Additionally, we use [pre-commit.ci](https://pre-commit.ci/) to implement automatic code formatting and image resource optimization, which runs automatically after creating PRs and generally requires no special attention.
|
||||
|
||||
## GitHub Actions Section
|
||||
|
||||
### Code Testing
|
||||
|
||||
`smoke-testing.yml`
|
||||
|
||||
This workflow is mainly responsible for basic testing of MaaCore, including resource file loading, simple task execution tests, etc.
|
||||
|
||||
Since test cases haven't been updated for a long time, this workflow is now basically used to ensure resource files don't contain errors and that MaaCore code doesn't have fatal errors (the kind that affects building).
|
||||
|
||||
### Code Building
|
||||
|
||||
`ci.yml`
|
||||
|
||||
This workflow is responsible for full code building work, including all MAA components. The build artifacts are runnable MAA instances.
|
||||
|
||||
In addition to the necessary MaaCore, Windows build artifacts include MaaWpfGui, macOS build artifacts include MaaMacGui, and Linux build artifacts include MaaCLI.
|
||||
|
||||
This workflow runs automatically on any new commit and PR. When triggered by a release PR, the build artifacts from this run will be used directly for release and will create a Release.
|
||||
|
||||
### Version Release
|
||||
|
||||
Version release is the necessary operation to publish updates to users, consisting of the following workflows:
|
||||
|
||||
+ `release-nightly-ota.yml` Release nightly builds
|
||||
+ `release-ota.yml` Release stable/beta versions
|
||||
+ `gen-changelog.yml` Generate changelog for stable/beta versions
|
||||
+ `pr-auto-tag.yml` Generate tags for stable/beta versions
|
||||
|
||||
::: tip
|
||||
The "ota" in the above file names stands for Over-the-Air, which is what we commonly call "incremental update packages". Therefore, MAA's release process actually includes building OTA packages for past versions.
|
||||
:::
|
||||
|
||||
#### Nightly Builds
|
||||
|
||||
`release-nightly-ota.yml`
|
||||
|
||||
This workflow runs automatically at 22:00 UTC daily to ensure nightly build release frequency. Of course, you can also manually release when making changes that need verification.
|
||||
|
||||
Note that nightly builds are only released for Windows users; macOS and Linux users cannot receive nightly updates.
|
||||
|
||||
#### Stable/Beta Versions
|
||||
|
||||
The release process for these two channels is relatively more complex. We'll explain the role of each workflow by simulating a release process:
|
||||
|
||||
1. Create a PR from `dev` to `master` branch, and the PR name must be `Release v******`
|
||||
2. `gen-changelog.yml` generates a changelog from the most recent stable/beta version to the current version (as a new PR)
|
||||
3. Manually adjust the changelog and add brief descriptions
|
||||
4. Merge the PR, triggering `pr-auto-tag.yml` to create tags and sync branches
|
||||
5. The Release event triggers `release-ota.yml`, which builds OTA packages and uploads attachments after tagging master
|
||||
|
||||
### Resource Updates
|
||||
|
||||
This section of workflows is mainly responsible for MAA's resource updates and optimization, with the following specific workflows:
|
||||
|
||||
+ `res-update-game.yml` Executes periodically to pull game resources from specified repositories
|
||||
+ `sync-resource.yml` Syncs resources to the MaaResource repository for resource updates
|
||||
+ `optimize-templates.yml` Optimizes template image sizes
|
||||
|
||||
### Website Building
|
||||
|
||||
`website-workflow.yml`
|
||||
|
||||
This workflow is mainly responsible for building and publishing MAA's official website, including both the main page and documentation components.
|
||||
|
||||
Please note that website publishing is tightly bound to releases. Regular modifications to web components only trigger builds to ensure no errors occur, and actual deployment to Azure only happens during releases.
|
||||
|
||||
### Issues Management
|
||||
|
||||
`issue-checker.yml`
|
||||
|
||||
Uses regex matching to tag various Issues, categorizing and marking Issue content for easier viewing and management.
|
||||
|
||||
`issue-checkbox-checker.yml`
|
||||
|
||||
Uses regex matching to automatically close Issues that check "I have not read carefully".
|
||||
If "I have not read carefully" is not checked, all checkboxes are collapsed.
|
||||
|
||||
`stale.yml`
|
||||
|
||||
Checks Bug Issues that have had no activity for more than 90 days, marks them and sends notifications, then closes them after 7 more days if still inactive.
|
||||
|
||||
### Pull Requests Management
|
||||
|
||||
`pr-checker.yml`
|
||||
|
||||
This workflow checks whether commit messages in PRs conform to [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) and whether they contain merge commits, providing reminders if these conditions are met.
|
||||
|
||||
### MirrorChyan Related
|
||||
|
||||
MirrorChyan is a paid update mirror service, with the following related workflows:
|
||||
|
||||
+ `mirrorchyan.yml` Sync update packages to MirrorChyan
|
||||
+ `mirrorchyan_release_note.yml` Generate MirrorChyan Release Notes
|
||||
|
||||
### Others
|
||||
|
||||
`markdown-checker.yml`
|
||||
|
||||
Responsible for checking all Markdown files in the repository for invalid links.
|
||||
|
||||
`blame-ignore.yml`
|
||||
|
||||
Automatically ignores commits with commit messages containing `blame ignore` to keep repository history clean.
|
||||
|
||||
`cache-delete.yml`
|
||||
|
||||
Cleans up related caches after PR merges to save cache usage.
|
||||
@@ -5,11 +5,15 @@ icon: iconoir:developer
|
||||
|
||||
# Getting Started with Development
|
||||
|
||||
## Introduction to GitHub Pull Request flow
|
||||
::: tip
|
||||
This page mainly describes the PR workflow and MAA's file formatting requirements. If you want to learn specifically how to make changes to MAA's operational logic, please refer to the [Protocol Documentation](../protocol/)
|
||||
:::
|
||||
|
||||
## Introduction to GitHub Pull Request Flow
|
||||
|
||||
### I don't know programming but just want to modify some JSON files/documents, how can I do it?
|
||||
|
||||
Welcome to the [GitHub Pull Request Tutorial](./pr-tutorial.md) that anyone can understand (purely web-based on Github.com)
|
||||
Welcome to the [Web-based PR Tutorial](./pr-tutorial.md) that anyone can understand (purely web-based on Github.com)
|
||||
|
||||
### I can program, but I've never used GitHub/C++/..., how do I get started?
|
||||
|
||||
@@ -27,7 +31,7 @@ Welcome to the [GitHub Pull Request Tutorial](./pr-tutorial.md) that anyone can
|
||||
|
||||
4. Download prebuilt third-party libraries
|
||||
**Python environment required - search for Python installation tutorials if needed**
|
||||
_(maadeps-download.py is located in the project root)_
|
||||
_(maadeps-download.py is located in the project root)_
|
||||
|
||||
```cmd
|
||||
python maadeps-download.py
|
||||
@@ -41,11 +45,11 @@ Welcome to the [GitHub Pull Request Tutorial](./pr-tutorial.md) that anyone can
|
||||
7. Configure Visual Studio settings
|
||||
|
||||
- Select `RelWithDebInfo` and `x64` in the top configuration bar (Skip for Release builds or ARM platforms)
|
||||
- Right-click `MaaWpfGui` -> Properties -> Debug -> Enable native debugging (This enables breakpoints in C++ Core)
|
||||
- Right-click `MaaWpfGui` → Properties → Debug → Enable native debugging (This enables breakpoints in C++ Core)
|
||||
|
||||
8. Now you're ready to happily ~~mess around~~ start developing!
|
||||
9. Commit regularly with meaningful messages during development
|
||||
Beginners should create a new branch instead of committing directly to `dev`:
|
||||
If you're not familiar with git usage, you might want to create a new branch for changes instead of committing directly to `dev`:
|
||||
|
||||
```bash
|
||||
git branch your_own_branch
|
||||
@@ -75,16 +79,16 @@ Welcome to the [GitHub Pull Request Tutorial](./pr-tutorial.md) that anyone can
|
||||
git fetch upstream
|
||||
```
|
||||
|
||||
3. Rebase or merge:
|
||||
3. Rebase (recommended) or merge:
|
||||
|
||||
```bash
|
||||
git rebase upstream/dev
|
||||
git rebase upstream/dev # rebase
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```bash
|
||||
git merge
|
||||
git merge # merge
|
||||
```
|
||||
|
||||
4. Repeat steps 7, 8, 9, 10.
|
||||
@@ -93,15 +97,15 @@ Welcome to the [GitHub Pull Request Tutorial](./pr-tutorial.md) that anyone can
|
||||
After opening Visual Studio, Git operations can be performed using VS's built-in "Git Changes" instead of command-line tools.
|
||||
:::
|
||||
|
||||
## MAA file formatting requirements
|
||||
## MAA File Formatting Requirements
|
||||
|
||||
MAA uses a series of formatting tools to ensure that the code and resource files in the repository are visually unified for easy maintenance and reading.
|
||||
|
||||
Please ensure that it has been formatted before submission, or [enable Pre commit Hooks for automatic formatting](#use-pre-commit-hooks-to-automatically-format-code).
|
||||
Please ensure that it has been formatted before submission, or [enable Pre-commit Hooks for automatic formatting](#use-pre-commit-hooks-to-automatically-format-code).
|
||||
|
||||
The currently enabled formatting tools are as follows:
|
||||
|
||||
|File Type | Format Tool|
|
||||
| File Type | Format Tool |
|
||||
| --- | --- |
|
||||
| C++ | [clang-format](https://clang.llvm.org/docs/ClangFormat.html) |
|
||||
| Json/Yaml | [Prettier](https://prettier.io/) |
|
||||
|
||||
@@ -7,7 +7,9 @@ icon: bxs:bot
|
||||
|
||||
The action of Issue Bot is [issue-checker](https://github.com/zzyyyl/issue-checker), with configuration file [issue-checker.yml](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/issue-checker.yml).
|
||||
|
||||
**Note that your merge request will be marked as `ambiguous` when you are not committing with Commitizen specification.**
|
||||
::: warning
|
||||
Your pull request will be marked as `ambiguous` when you are not committing with Conventional Commits specification.
|
||||
:::
|
||||
|
||||
## Features
|
||||
|
||||
@@ -27,7 +29,7 @@ The action of Issue Bot is [issue-checker](https://github.com/zzyyyl/issue-check
|
||||
Issue Bot will check the title of your pull request. Unless the title starts with one of the following keywords, the pull request will be marked as `ambiguous`.
|
||||
|
||||
- `build` `chore` `ci` `doc` `docs` `feat` `fix` `perf` `refactor` `rfc` `style` `test`
|
||||
- `Merge` `merge` `Revert` `revert`
|
||||
- `Merge` `merge` `Revert` `revert` `Reapply` `reapply`
|
||||
|
||||
### Triggering Manually
|
||||
|
||||
@@ -52,7 +54,9 @@ It is better to trigger Issue Bot with keywords instead of commands listed below
|
||||
- `Duplicate of #{ISSUE_NUMBER}` will add `duplicate` label to the issue.
|
||||
- **You can add some `skip` operations if your comment may confuse Issue Bot.**
|
||||
|
||||
_Note<sup>1</sup>: The `COMMIT_HASH` here is the full 40-character hash._
|
||||
::: info Note
|
||||
<sup>1</sup> The `COMMIT_HASH` here needs to be the full 40 characters
|
||||
:::
|
||||
|
||||
#### Push
|
||||
|
||||
|
||||
@@ -3,24 +3,27 @@ order: 2
|
||||
icon: teenyicons:linux-alt-solid
|
||||
---
|
||||
|
||||
# Linux Compiling Tutorial
|
||||
# Linux Compilation Tutorial
|
||||
|
||||
**The tutorial requires some basic knowledge about Linux OS!**
|
||||
If you just want to install MAA directly instead of compiling it yourself, please read [Emulator Support for Linux](../manual/device/linux.md).
|
||||
**This tutorial requires readers to have some Linux environment configuration ability and programming foundation!** If you only want to directly install MAA instead of compiling it yourself, please read [User Manual - Linux Emulators and Containers](../manual/device/linux.md).
|
||||
|
||||
::: info Note
|
||||
Linux build of MAA is still under discussion, some of the content might be outdated, please follow the script in [GitHub workflow file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/workflows/ci.yml#L134), also reference [AUR PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=maa-assistant-arknights), [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
|
||||
MAA's build method is still under discussion. The content of this tutorial may be outdated. Please refer to the scripts in [GitHub workflow file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/workflows/ci.yml#L134). You can also refer to [AUR PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=maa-assistant-arknights), [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix).
|
||||
:::
|
||||
|
||||
## Compiling MAA
|
||||
::: info
|
||||
Mac can use the `tools/build_macos_universal.zsh` script for compilation. It's recommended to refer to the README.md of the [MaaAssistantArknights/MaaMacGui](https://github.com/MaaAssistantArknights/MaaMacGui) project.
|
||||
:::
|
||||
|
||||
1. Download build depends
|
||||
## Compilation Process
|
||||
|
||||
1. Download compilation dependencies
|
||||
|
||||
- Ubuntu/Debian
|
||||
|
||||
```bash
|
||||
sudo apt install gcc-12 g++-12 cmake zlib1g-dev
|
||||
```
|
||||
```bash
|
||||
sudo apt install gcc-12 g++-12 cmake zlib1g-dev
|
||||
```
|
||||
|
||||
- Arch Linux
|
||||
|
||||
@@ -28,30 +31,30 @@ Linux build of MAA is still under discussion, some of the content might be outda
|
||||
sudo pacman -S --needed gcc cmake zlib
|
||||
```
|
||||
|
||||
2. Build or download third-party libraries
|
||||
2. Build third-party libraries
|
||||
|
||||
You may either download pre-built dependencies or build them from scratch
|
||||
You can choose to download pre-built dependency libraries or compile from scratch
|
||||
|
||||
- Download pre-built libraries (recommended)
|
||||
- Download pre-built third-party libraries (recommended)
|
||||
|
||||
> **Note**
|
||||
> It contains shared objects built on a relatively new linux distro (Ubuntu 22.04), which may cause ABI incompatibility if you are working on a system with older version of libstdc++.
|
||||
> Contains dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system's libstdc++ version is older, you may encounter ABI incompatibility issues.
|
||||
|
||||
```bash
|
||||
python maadeps-download.py
|
||||
```
|
||||
|
||||
If this does not work for you due to ABI issue, and containerization is not an option, you may build them from scratch
|
||||
If you find the libraries downloaded above cannot run on your system due to ABI version issues and you don't want to use container solutions, you can also try compiling from scratch
|
||||
|
||||
- Build from source
|
||||
- Build third-party libraries from scratch (will take considerable time)
|
||||
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
cd MaaDeps
|
||||
python build.py
|
||||
python build.py
|
||||
```
|
||||
|
||||
3. Build MAA
|
||||
3. Compile MAA
|
||||
|
||||
```bash
|
||||
CC=gcc-12 CXX=g++-12 cmake -B build \
|
||||
@@ -61,24 +64,26 @@ Linux build of MAA is still under discussion, some of the content might be outda
|
||||
cmake --build build
|
||||
```
|
||||
|
||||
To install MAA to the target location, note that MAA is recommended to run by specifying `LD_LIBRARY_PATH`, do not use administrator privileges to load MAA into `/`
|
||||
To install MAA to target location, note that MAA is recommended to run by specifying `LD_LIBRARY_PATH`, don't use administrator privileges to install MAA into `/usr`
|
||||
|
||||
```bash
|
||||
cmake --install build --prefix <target_directory>
|
||||
```
|
||||
|
||||
## Integration
|
||||
## Integration Documentation
|
||||
|
||||
[~~Maybe not a doc~~](../protocol/integration.md)
|
||||
[~~Perhaps not really documentation~~](../protocol/integration.md)
|
||||
|
||||
### Python
|
||||
|
||||
Refer to the implementation of `__main__` in [Python demo](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Python/sample.py)
|
||||
You can refer to the implementation of `__main__` in [Python demo](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Python/sample.py)
|
||||
|
||||
### C
|
||||
### C++
|
||||
|
||||
Refer to the implementation of [CppSample](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Cpp/main.cpp)
|
||||
You can refer to the implementation in [CppSample](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Cpp/main.cpp)
|
||||
|
||||
### C Sharp
|
||||
|
||||
Refer to the implementation of [MaaWpfGui](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/MaaWpfGui/Main/AsstProxy.cs)
|
||||
<!-- Do not use C#, MD003/heading-style: Heading style [Expected: atx; Actual: atx_closed] -->
|
||||
|
||||
You can refer to the implementation in [MaaWpfGui](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/MaaWpfGui/Main/AsstProxy.cs)
|
||||
|
||||
@@ -3,114 +3,116 @@ order: 5
|
||||
icon: ri:earth-fill
|
||||
---
|
||||
|
||||
# Overseas Clients Adaptation
|
||||
# Overseas Client Adaptation Tutorial
|
||||
|
||||
## Preparation
|
||||
|
||||
Before starting this tutorial, make sure you have:
|
||||
|
||||
1. Installed and properly configured the required software. There should be information in the `readme.md` of the ZH-CN client or the corresponding client to ensure that the supported features work properly.
|
||||
2. Read [Task Schema](../protocol/task-schema.md) and have a basic understanding of the meaning and usage of each field. You should also understand the meaning and usage of `@` and `#` in the code.
|
||||
3. Understand that the `task.json` file and template image of the ZH-CN client will be used as alternatives when they are unmentioned or missing for the overseas client. The content in the `task.json` for the overseas client should be rewritten according to the fields of the ZH-CN task.
|
||||
4. Have some English ability, be able to read English logs, and be able to find missing pictures and other information through the logs.
|
||||
5. Understand that it is recommended to perform the modification individually according to the task chain. For example, to modify the Award task, you should modify the `template image`, `text`, and `roi` step by step in accordance with the order in its `next` field. This will ensure that every task is working normally after modification and errors can be easily spotted. Additionally, this can prevent confusion and forgetting which task the software is stuck on when too much content is modified at once.
|
||||
1. Installed and properly configured the required software. There should be relevant information in the CN client or corresponding client's `readme.md` to ensure that supported features work properly.
|
||||
2. Read the [Task Schema](../protocol/task-schema.md) and have a basic understanding of the meaning and usage of each field, and understand the meaning and usage of `@` and `#` type tasks.
|
||||
3. Understand that content not mentioned or missing in overseas client `task.json` and template images will use CN client `task.json` and template images as fallbacks. Content in overseas client `task.json` will override and rewrite corresponding fields of CN client tasks.
|
||||
4. Have sufficient English ability to read English logs and find missing images and other information through logs.
|
||||
5. It's recommended to modify according to task chains. For example, for the `Award` task, gradually replace `template images` / `text` / `modify roi` step by step according to the `next` order of the `Award` task in CN client `task.json`, ensuring each step works properly after modification or can quickly identify errors. This avoids confusion about which step the program is stuck on when too many changes are made at once.
|
||||
|
||||
### Preparation before making changes
|
||||
### Pre-modification Preparation
|
||||
|
||||
Before making changes, there are several preparations that need to be noted:
|
||||
Before making modifications, there are several preparation steps to note:
|
||||
|
||||
1. Refer to the ZH-CN client's `task.json` and make sure you have prepared the template images and text content for the overseas client.
|
||||
2. Make sure you have ready access to these images and text content.
|
||||
1. Refer to CN client task.json and ensure you have prepared template images and text content for overseas clients that differ from CN client.
|
||||
2. Ensure you can access these images and text content at any time.
|
||||
|
||||
## Get screenshots
|
||||
## Getting Screenshots
|
||||
|
||||
To get high-quality screenshots, please follow these guidelines:
|
||||
|
||||
1. Use the screenshot tool provided with the emulator to take and save screenshots.
|
||||
2. Ensure that the size of the screenshot is at least `1280x720` and the aspect ratio is `16:9`.
|
||||
3. Make sure the screenshot does not contain any extraneous content, such as the taskbar, status bar, or notification bar.
|
||||
4. Make sure the screenshot includes all the content that needs to be recognized.
|
||||
1. Use the emulator's built-in screenshot tool to take and save screenshots.
|
||||
2. Ensure screenshot dimensions are larger than `1280*720` with aspect ratio `16:9`.
|
||||
3. Ensure screenshots don't contain any irrelevant content, such as taskbar, status bar, notification bar, etc.
|
||||
4. Ensure screenshots contain all content that needs to be recognized.
|
||||
|
||||
To crop the image and get the text/image region of interest (ROI), you will need to install `Python` and `OpenCV`, and download the `MaaAssistantArknights/tools/CropRoi/main.py` file.
|
||||
To crop images and get text/image `roi`, you need to install `python` and `opencv`, and download the `MaaAssistantArknights/tools/CropRoi/main.py` file.
|
||||
|
||||
Then, follow these steps:
|
||||
Then follow these steps:
|
||||
|
||||
1. Create new `src` and `dst` folders in the same directory as `main.py`.
|
||||
2. Place the **complete screenshot** of the text/image that needs to be resized or in need of a new ROI value into the `src` folder.
|
||||
2. Place **complete screenshots** that need resizing or text/image `roi` extraction into the `src` folder.
|
||||
3. Run `main.py`.
|
||||
4. Select the target range by dragging the mouse, making sure not to include extraneous content.
|
||||
5. Once the range is determined, press `S` to save and `Q` to exit. The cropped image will be saved in the dst folder.
|
||||
4. Use mouse drag to select target range, try not to include irrelevant content.
|
||||
5. After determining the range, press `S` to save, press `Q` to exit. Cropped images will be saved in the `dst` folder.
|
||||
|
||||
For example, the output after completing a crop would be:
|
||||
For example, output after completing one crop:
|
||||
|
||||
``` log
|
||||
```log
|
||||
src: Screenshot_xxx.png
|
||||
dst: Screenshot_xxx.png_426,272,177,201.png
|
||||
original roi: 476, 322, 77, 101,
|
||||
amplified roi: 426, 272, 177, 201
|
||||
```
|
||||
|
||||
In this example, `Screenshot_xxx.png` is the name of the full screenshot placed in the `src` folder, and `Screenshot_xxx.png_426,272,177,201.png` is the name of the cropped image.
|
||||
Where:
|
||||
|
||||
The `original roi` is the area selected by the mouse, while the `amplified roi` is the enlarged area. You will need the enlarged area, so you should use the `amplified roi` value to fill in the roi field in task.json.
|
||||
`Screenshot_xxx.png` is the name of the complete screenshot placed in the `src` folder. `Screenshot_xxx.png_426,272,177,201.png` is the cropped image.
|
||||
|
||||
## Modify the template image
|
||||
`original roi` is the mouse-selected area. `amplified roi` is the enlarged area. You need the enlarged range, so fill the `roi` field in `task.json` with this value.
|
||||
|
||||
Before modifying the template image, you need to open the template image folder of the corresponding client and the template image folder of the ZH-CN client.
|
||||
## Modifying Template Images
|
||||
|
||||
Before modifying template images, you need to open the corresponding client's template image folder and CN client's template image folder.
|
||||
|
||||
For example:
|
||||
|
||||
- The location of the template image folder for EN client is `MaaAssistantArknights\resource\global\YoStarEN\resource\template`.
|
||||
- The location of the template image folder for the ZH-CN client is `MaaAssistantArknights\resource\template`.
|
||||
- EN client template image folder location: `MaaAssistantArknights\resource\global\YoStarEN\resource\template`.
|
||||
- CN client template image folder location: `MaaAssistantArknights\resource\template`.
|
||||
|
||||
Refer to the template images mentioned in the `task.json` file, compare the template images of the ZH-CN client and the overseas client, and identify any missing templates in the overseas client.
|
||||
Refer to template images mentioned in `task.json`, compare CN client and overseas client template images, and find templates missing in overseas client.
|
||||
|
||||
Typically, template images containing text need to be replaced with screenshots, with the exception of images such as logos. If the size of the image is significantly larger than the corresponding template image in the ZH-CN client, you may need to modify the size of the `roi`.
|
||||
Usually, except for logos and other images, templates containing text need to be replaced through screenshots. If image dimensions are significantly larger than corresponding CN client template images, you need to modify `roi` size.
|
||||
|
||||
Once you have captured and renamed the template image, you can place it in the template image folder of the corresponding client.
|
||||
Place captured and renamed template images into the corresponding client's template image folder.
|
||||
|
||||
## Modify the text content
|
||||
## Modifying Text Content
|
||||
|
||||
Before modifying the text content, you will need to open the `task.json` file for both the corresponding server and ZH-CN client.
|
||||
Before modifying text content, you need to open the corresponding server's `task.json` and CN client's `task.json`.
|
||||
|
||||
For example:
|
||||
|
||||
- The location of `task.json` in EN client is `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`.
|
||||
- The location of `task.json` for ZH-CN client is `MaaAssistantArknights\resource\tasks.json`.
|
||||
- EN client `task.json` location: `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`.
|
||||
- CN client `task.json` location: `MaaAssistantArknights\resource\tasks.json`.
|
||||
|
||||
To modify the text, locate the corresponding task and change the `text` field to the content displayed in the corresponding server. Keep in mind that the identified content can be a substring of the full content within the game. In general, you should replace any `text` containing text unless it is recognized as a pure ASCII character.
|
||||
Find the corresponding task and modify the `text` field to content displayed in the corresponding server. Note that recognized content can be a substring of complete in-game content.
|
||||
|
||||
If the text length is significantly longer than the ZH-CN client version, you may need to modify the size of the `roi` field. For example, if the difference in length between the `"任务"`(Mission in chinese) and the English word `"Mission"` is too large, you may need to modify the size of the `roi` for that mission in the overseas client.
|
||||
Usually, unless it's pure ASCII character recognition, `text` containing text needs to be replaced. If text length is significantly larger than CN client, you need to modify `roi` size, such as the length difference between `"任务"` and `"Mission"` being too large, requiring modification of overseas client task `roi` size.
|
||||
|
||||
If the task does not exist in the `task.json` file of the corresponding overseas server, you will need to add it. Simply fill in the `text` field with the appropriate content.
|
||||
If the corresponding overseas client `task.json` doesn't have the task, you need to add the task, only filling in the `text` field.
|
||||
|
||||
## Modify ROI range
|
||||
## Modifying ROI Range
|
||||
|
||||
To modify the ROI range:
|
||||
1. Open the corresponding server's `task.json`, such as EN client location `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`
|
||||
2. Find the corresponding task that needs `roi` range modification, use your prepared overseas game interface screenshots, and adjust `roi` range size according to `amplified roi`.
|
||||
3. Usually, `roi` doesn't need modification, only when recognition content size difference with CN client is too large.
|
||||
4. If the corresponding overseas client `task.json` doesn't have the task, add the task and write the `roi` field.
|
||||
|
||||
1. Open the `task.json` file for the corresponding server, for example, the location of the EN client's `task.json` file is `MaaAssistantArknights\resource\global\YoStarEN\resource\tasks.json`.
|
||||
2. Find the task that corresponds to the ROI range you need to modify, and use a screenshot of the overseas game interface to adjust the size of the `roi` range according to the amplified ROI.
|
||||
3. Normally, you should not need to modify the `roi` range, but you may need to do so if the difference in size between the text and the Chinese client version is too large.
|
||||
4. If the task does not exist in the `task.json` file of the corresponding overseas client, add the task and write the `roi` field with the appropriate values.
|
||||
## Save Settings and Restart Software
|
||||
|
||||
## Save the settings and restart the software
|
||||
After modifications are complete, restart the software to reload files and make changes effective. Or create a `DEBUG.txt` file in the software directory before opening the software, so templates and files reload every time you click start, without needing restart.
|
||||
|
||||
After making the changes, you will need to save the settings and restart the software in order for the changes to take effect. To do this, you can either restart the software and reload the file, or create a new `DEBUG.txt` file in the software directory. This will cause the template and files to be reloaded every time you click the "Link Start" button, so you will not need to restart the software.
|
||||
Check for success:
|
||||
|
||||
To check for success:
|
||||
1. Check software operation to ensure it works normally on overseas clients.
|
||||
2. If it doesn't work properly, check if modifications are correct or view log output to find error locations.
|
||||
|
||||
1. Test the operation of the software to ensure that it is functioning properly on the overseas server.
|
||||
2. If it is not working properly, you will need to check if the changes are correct, or check the log output to determine what went wrong.
|
||||
## Reading Logs
|
||||
|
||||
## Interpreting the logs
|
||||
Sometimes after modifying `task.json`, we find the program still can't run correctly. In this case, we should check logs to find error locations and modify corresponding tasks.
|
||||
|
||||
If you have modified the `task.json` file but the program is still not functioning correctly, it may be helpful to check the logs to find any errors and modify the corresponding task accordingly. The log file is typically located in the root directory of the software, and is named `asst.log`. If you compiled MAA yourself, it may be located in the `\x64\Release` or `\x64\RelWithDebInfo` directory, depending on the compilation mode you selected when compiling.
|
||||
Log file location is in the software root directory, filename `asst.log`. If you compiled MAA yourself, it's in `\x64\Release` or `x64\RelWithDebInfo`, depending on your compilation mode selection.
|
||||
|
||||
Interpreting the logs can be helpful in identifying any issues with the program. Here is an example log:
|
||||
Here's a log example:
|
||||
|
||||
``` log
|
||||
```log
|
||||
[2022-12-18 17:43:17.535][INF][Px7ec][Tx15c8] {"taskchain":"Award","details":{"to_be_recognized":["Award@ReturnTo","Award","ReceiveAward","DailyTask","WeeklyTask","Award@CloseAnno","Award@CloseAnnoTexas","Award@TodaysSupplies","Award@FromStageSN"],"cur_retry":10,"retry_times":20},"first":["AwardBegin"],"taskid":2,"class":"asst::ProcessTask","subtask":"ProcessTask","pre_task":"AwardBegin"}
|
||||
[2022-12-18 17:43:18.398][INF][Px7ec][Tx15c8] Call ` C:\Program Files\BlueStacks_nxt\. \HD-Adb.exe -s 127.0.0.1:5555 exec-out "screencap | gzip -1" ` ret 0 , cost 862 ms , stdout size: 2074904 , socket size: 0
|
||||
[2022-12-18 17:43:18.398][INF][Px7ec][Tx15c8] Call ` C:\Program Files\BlueStacks_nxt\.\HD-Adb.exe -s 127.0.0.1:5555 exec-out "screencap | gzip -1" ` ret 0 , cost 862 ms , stdout size: 2074904 , socket size: 0
|
||||
[2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] OcrPack::recognize | roi: [ 500, 50, 300, 150 ]
|
||||
[2022-12-18 17:43:18.541][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | enter
|
||||
[2022-12-18 17:43:18.634][TRC][Px7ec][Tx15c8] Ocr Pipeline with asst::WordOcr | leave, 93 ms
|
||||
@@ -122,20 +124,21 @@ Interpreting the logs can be helpful in identifying any issues with the program.
|
||||
[2022-12-18 17:43:19.144][TRC][Px7ec][Tx15c8] asst::ProcessTask::_run | enter
|
||||
```
|
||||
|
||||
In this log, you can see that:
|
||||
In this log, you can see:
|
||||
|
||||
- `"taskchain"` represents the task currently in progress.
|
||||
- `"details"` is the content of the task, including the fields to be recognized (`to_be_recognized`) and the current number of retries (`cur_retry`) and the total number of retries (`retry_times`).
|
||||
- `"first"` represents the start of the task.
|
||||
- `"taskid"` is the task number.
|
||||
- `"class"` and `subtask` represent the class and subtask of the task, respectively.
|
||||
- `"pre_task"` represents the previous task.
|
||||
In addition, the execution of the command (e.g. `Call`) and the `OCR` information (e.g. `OcrPack::recognize`) are recorded in the log.
|
||||
- `taskchain` represents the currently running task.
|
||||
- `details` is task content, including fields to be recognized (`to_be_recognized`), current retry count (`cur_retry`), and total retry count (`retry_times`).
|
||||
- `first` represents task start.
|
||||
- `taskid` is the task number.
|
||||
- `class` and `subtask` represent task class and subtask respectively.
|
||||
- `pre_task` represents the previous task.
|
||||
|
||||
For example, in this log, `"to_be_recognized"`,`"cur_retry":3,"retry_times":20` means that the task has been attempted to be recognized 10 times, and the maximum number of times is 20. After the maximum number of times is reached, the task will be skipped and an error will be reported, and the next task will be performed. If there are no issues with the previous task, it is likely that there is a problem with the recognition here. To troubleshoot this issue, you can check the tasks mentioned in the log to see if there is a corresponding template file, if the `text` field of the corresponding task is incorrect, or if the `roi` range for task recognition is incorrect, and make any necessary modifications.
|
||||
Additionally, the log records command execution (like `Call`) and `OCR` information (like `OcrPack::recognize`).
|
||||
|
||||
By looking at the corresponding template image, you may find that there is a template for this image in the EN client template folder, but the size is larger than the image in template folder for the ZH-CN client . This could cause the `roi` in ZH-CN client to not be recognized in the EN client, so you may need to modify the corresponding task's `roi` in the EN client's `task.json` file to match the size of the image in the EN client.
|
||||
In this log, `"to_be_recognized"`, `"cur_retry":3,"retry_times":20` indicates it has repeatedly tried recognition 3 times, with maximum recognition attempts of 20. After reaching maximum attempts, it will skip the task and report error, continuing to the next task. If previous tasks had no issues, we can basically determine there's a recognition problem here. We need to check tasks mentioned in the log to see if there's a corresponding `template file`, if the corresponding task's `text` is incorrect, if task recognition `roi` range is correct, to find and fix the problem.
|
||||
|
||||
## Submit your changes
|
||||
By checking the corresponding template image, we found there's a template for this image in the EN client template folder, but it's significantly larger than the CN client image, causing CN client's `roi` to fail recognition on EN client. So we need to modify the corresponding task `roi` in EN client's `task.json` to match EN client image size.
|
||||
|
||||
Check out [Github Pull Request Guide](./pr-tutorial.md)
|
||||
## Submit Your Changes
|
||||
|
||||
Please refer to [GitHub Pull Request Guide](./pr-tutorial.md)
|
||||
|
||||
@@ -3,24 +3,24 @@ order: 3
|
||||
icon: mingcute:git-pull-request-fill
|
||||
---
|
||||
|
||||
# GitHub Pull Request User Guide
|
||||
# Web-based PR Tutorial
|
||||
|
||||
This document is machine-translated. If you have the ability, please refer to the Chinese version. We would greatly appreciate any errors or suggestions for improvement.
|
||||
A GitHub Pull Request guide that even beginners can understand (\*´▽ `)ノノ
|
||||
|
||||
::: warning
|
||||
Many concepts in this tutorial have been simplified in order to make it more accessible to a wider audience, even at the expense of some elegance and accuracy.
|
||||
For those who have experience using Git and programming knowledge, you may refer to the more advanced tutorial in [Development](./development.md)
|
||||
This tutorial simplifies many concepts to make them accessible to more people. It includes some ~~inelegant but simple~~ operations and not entirely accurate explanations. Please go easy on us, experts.
|
||||
If you have some git experience and programming background, ~~then why are you reading this~~, you can check out the more advanced tutorial [GitHub Pull Request Process Overview](./development.md)
|
||||
:::
|
||||
|
||||
## Basic concepts and terminology
|
||||
## Basic Concepts and Terminology
|
||||
|
||||
This chapter contains slightly dry content. If you're not interested, you can skip directly to the practical section below. If there is anything you don't understand, you can come back to read this chapter later.
|
||||
This section might be a bit dry. Feel free to skip to the practical section below and come back here if you need clarification.
|
||||
|
||||
### Repository
|
||||
|
||||
"Repo" is short for "repository", which is the place where we store our code and other resource files.
|
||||
Abbreviated as "repo", the place where we store our code and other resource files.
|
||||
|
||||
👇 You can think of the current web page and all of its contents as the repository for MAA (we usually refer to it as MAA's main repository).
|
||||
👇 You can simply understand this webpage and all its contents as MAA's repository (we generally call it MAA's main repository)
|
||||
|
||||
```component Image1
|
||||
{
|
||||
@@ -35,11 +35,12 @@ This chapter contains slightly dry content. If you're not interested, you can sk
|
||||
|
||||
### Fork
|
||||
|
||||
To fork, literally meaning to make a copy of MAA's code, and then perform subsequent modifications and operations to avoid damaging the original repository.
|
||||
Literally means to copy. Fork a copy of MAA's code so you can make subsequent modifications without breaking the original.
|
||||
Although "copy" in Chinese might first remind us of the "copy" operation, "fork" doesn't have a clear translation, so we usually use the English term directly, like "fork a copy of the code."
|
||||
|
||||
Since it's a copy, let's assume it's called `MAA (1)`.
|
||||
To distinguish it from the original repository, we usually refer to the original MAA repository as "main repository" or "upstream".
|
||||
Since everyone can make a copy of their own, the copied repository is called a "personal repository" or "origin".
|
||||
Since it's a copy, it becomes `MAA (1)` (just kidding)
|
||||
To distinguish from the original repository, we generally call the original MAA repository the "main repository" or "upstream repository."
|
||||
Since everyone can fork their own copy, the copied version is called a "personal repository" or "origin repository."
|
||||
|
||||
```component Image1
|
||||
{
|
||||
@@ -54,11 +55,12 @@ Since everyone can make a copy of their own, the copied repository is called a "
|
||||
|
||||
### Pull Request
|
||||
|
||||
Continuing from the previous section, after you have made changes to your forked personal repository, how do you provide the changes to the main repository? This is when you can open a pull request (PR) to request that your modified content be added to the main repository.
|
||||
Abbreviated as PR. "Pull request" sounds strange when literally translated, ~~and it's too many characters to type~~, so everyone usually just says "make a PR."
|
||||
Following the above, after you fork your personal repository and make modifications, how do you contribute your changes to the main repository? This is when you can open a PR to request that your modifications be added to the main repository.
|
||||
|
||||
Of course, since it's a "request", it naturally requires approval. MAA Team may provide feedback on your modifications, but our feedback may not necessarily be entirely correct. Let's have a reasonable discussion together~
|
||||
Of course, since it's a "request," it naturally needs approval. MAA Team members might provide feedback on your modifications, though our opinions aren't necessarily always correct - let's discuss reasonably~
|
||||
|
||||
👇 The following are the PRs currently submitted by contributors and awaiting approval from MAA Team.
|
||||
👇 Below are PRs currently submitted by contributors, waiting for approval
|
||||
|
||||
```component Image1
|
||||
{
|
||||
@@ -73,12 +75,14 @@ Of course, since it's a "request", it naturally requires approval. MAA Team may
|
||||
|
||||
### Conflict
|
||||
|
||||
Assuming that there is a file called A in the main repository with the content 111. You forked a copy and changed its content to 222. However, just as you were about to submit the PR, another person named Zhangsan forked a copy and submitted a PR with changes to the A file, changing it to 333.
|
||||
Now we have a conflict, as both of you have modified the A file but in different ways. This conflict can be difficult to resolve, and here we are only explaining the concept to help you understand what has happened when you encounter it, without going into the details of the solution.
|
||||
Imagine there's a file A in the main repository with content "111."
|
||||
You fork a copy and change its content to "222," but just as you're about to submit a PR, someone else also forks a copy, submits a PR, and changes file A to "333."
|
||||
Now we see that both of you modified file A differently. Whose version should we listen to? This is a Conflict.
|
||||
Conflicts are somewhat troublesome to resolve. This section only explains the concept to help you understand what's happening when you encounter one.
|
||||
|
||||
## Full Process of Pure Web-based PR Operation
|
||||
## Complete Web-based PR Process
|
||||
|
||||
1. First, go to the MAA main repository and click the button in the top right corner to fork a copy of the code.
|
||||
1. First, enter MAA's main repository and click the Fork button in the upper right corner to fork a copy of the code
|
||||
|
||||
```component Image1
|
||||
{
|
||||
@@ -91,7 +95,7 @@ Now we have a conflict, as both of you have modified the A file but in different
|
||||
}
|
||||
```
|
||||
|
||||
2. Then, click on 'Create Fork' directly.
|
||||
2. Then directly click "Create Fork"
|
||||
|
||||
```component Image1
|
||||
{
|
||||
@@ -104,170 +108,49 @@ Now we have a conflict, as both of you have modified the A file but in different
|
||||
}
|
||||
```
|
||||
|
||||
3. You will be taken to your personal repository, which will have a title of "your_name/MaaAssistantArknights", with a small note below stating "forked from MaaAssistantArknights/MaaAssistantArknights" (copied from the MAA main repository).
|
||||
3. You'll arrive at your personal repository. You can see the title is "YourName/MaaAssistantArknights" with small text below saying "forked from MaaAssistantArknights/MaaAssistantArknights"
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-3-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-3-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
4. Find the file you want to modify. You can click "Go to file" for global search, or browse through the folders below if you know where the file is
|
||||
|
||||
4. Find the file you want to edit. You can click 'Go to file' to search globally, or you can browse through the folders below if you know where the file is located.
|
||||
5. After opening the file, directly click the ✏️ in the upper right corner of the file to edit
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-4-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-4-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
6. Start editing! (For resource files, we recommend testing modifications in your local MAA folder first, confirming they work before pasting into the webpage to avoid errors)
|
||||
|
||||
5. After opening the file, click on the ✏️ icon on the top right corner of the file to start editing.
|
||||
7. After editing, click the button in the upper right corner to open the commit page and write what you changed
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-5-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-5-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
We have a simple commit title [naming format](https://www.conventionalcommits.org/en/v1.0.0/). It's best to follow it, but if you really can't understand it, you can write something simple first.
|
||||
|
||||
6. Make your changes! (If it's a resource file, we recommend testing the changes in your local MAA folder before pasting them in the web page to avoid errors).
|
||||
7. Once you've finished editing, click the button 👇 in the top right corner to open the commit page and write a brief description of what you changed.
|
||||
8. Have a second file to modify? Discovered an error after finishing? No problem! Just repeat steps 4-7!
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-7-1-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-7-1-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
9. After all modifications are complete, make a PR! Click "Code" to return to your **personal repository's** homepage
|
||||
If there's a "Compare & Pull Request" button, that's great - click it directly!
|
||||
If not, don't worry - click the "Contribute" button below, then "Open Pull Request" - it's the same thing.
|
||||
|
||||
We have a simple commit title [naming format](https://www.conventionalcommits.org/zh-hans/v1.0.0/), which you should try to follow. However, if you find it difficult to understand, you can just write something for now.
|
||||
10. You'll arrive at the main repository's PR page. Please verify that what you want to PR is what you intend to submit.
|
||||
As shown in the image, there's a leftward arrow in the middle, requesting to merge the right side's PersonalName/MAA dev branch into the main repository/MAA dev branch.
|
||||
Scrolling down shows the differences between these two branches - what you've changed.
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-7-2-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-7-2-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Then write a title and specific content of your modifications, then click confirm.
|
||||
PR titles also need to follow the [naming format](https://www.conventionalcommits.org/en/v1.0.0/). If you still can't understand it, you can write something simple first.
|
||||
|
||||
8. Need to edit another file? Made a mistake and want to change it again? No problem! Simply repeat steps 4-7 for the other file.
|
||||
9. When all changes are made, create a Pull Request by going to the Pull Request tab in your personal repository.
|
||||
If there is a "Compare & Pull Request" button, that's great, just click it!
|
||||
If not, don't worry, clicking "Open Pull Request" below is also the same.
|
||||
11. Wait for MAA Team members to review! They might also provide feedback
|
||||
👇 For example (purely for entertainment, don't take it seriously)
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-9-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-9-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
12. If team members say to modify some small issues, return to **your personal repository** and repeat steps 4-7!
|
||||
Note: you don't need to repeat steps 1-2 (re-fork) and steps 9-10 (re-Pull Request). Your current Pull Request is still pending review, and subsequent modifications will directly enter this Pull Request.
|
||||
👇 For example, you can see an additional modification entry at the bottom
|
||||
|
||||
10. Now you are in the main repository, please double-check the changes you want to PR.
|
||||
As shown in the figure, there is a leftward arrow, which means you want to merge the dev branch from your forked repository "your_name/MAA" to the dev branch of the main repository "MAA".
|
||||
Scrolling down shows the differences between these two branches, indicating what changes you have made.
|
||||
13. Once team members approve, everything is complete! Your modifications have entered MAA's main repository!
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-10-1-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-10-1-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
14. Next time you want to submit another PR, first return to your personal repository's homepage and click "Sync fork" to synchronize your repository with the main repository.
|
||||
Note here: if there's a red "Discard 1 commit," click the red one; if not, then click the green "Update branch."
|
||||
You can then repeat steps 4-10 to make modifications again.
|
||||
|
||||
Then, write a title and description of your changes, and click "Create Pull Request".
|
||||
The PR title should also follow the [naming format](https://www.conventionalcommits.org/zh-hans/v1.0.0/). However, if you still don't understand it, you can also just write something for now.
|
||||
**After version release**, your GitHub avatar will automatically be added to the contributors list. Thank you very much for your selfless contributions!
|
||||
~~Why are they all anime characters? Oh wait, I am too, never mind then~~
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-10-2-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-10-2-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
11. Just wait for the MAA Team members to review it! Of course, they may also provide some comments,
|
||||
👇 for example (for entertainment purposes only, do not take it seriously):
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-11-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-11-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
12. If they request further changes, go back to **your personal repository** and repeat steps 4-7!
|
||||
Note that you do not need to redo step 1-2 (re-fork) or step 9-10 (re-Pull Request), your current Pull Request is still pending review, and subsequent changes will be added directly to this Pull Request.
|
||||
👇 For example, you can see that "revised demo" has been added at the bottom.
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-12-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-12-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
13. Once the experts approve the PR, you're all set! Your changes have been merged into the main MAA repository!
|
||||
|
||||
14. If you want to submit another PR next time, please first go back to the homepage of your personal repository and click 'Sync fork' to synchronize your repository with the main repository.
|
||||
Note here: If there is a red 'Discard 1 commit', click the red one. If there isn't, then click the green 'Update branch'.
|
||||
Next, you can repeat steps 4-10 to make further modifications.
|
||||
|
||||
```component Image1
|
||||
{
|
||||
"imageList": [
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-14-1-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-14-1-dark.png"
|
||||
},
|
||||
{
|
||||
"light": "images/zh-cn/pr-tutorial/pr-14-2-light.png",
|
||||
"dark": "images/zh-cn/pr-tutorial/pr-14-2-dark.png"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**After the version is released**, your GitHub avatar will automatically be added to the contributors list. Thank you very much for your selfless dedication!
|
||||
::: tip Contributors/Participators
|
||||
Thank you to everyone involved in development and testing. Your help is going to ~~Make MAA Great Again~~! (\*´▽ `)ノノ
|
||||
::: tip Contributors
|
||||
Thanks to all friends who participated in development/testing. Everyone's help makes MAA better and better! (\*´▽ `)ノノ
|
||||
|
||||
[](https://github.com/MaaAssistantArknights/MaaAssistantArknights/graphs/contributors)
|
||||
:::
|
||||
|
||||
@@ -28,7 +28,7 @@ type = "StartUp" # The type of the task
|
||||
params = { client_type = "Official", start_game_enabled = true } # The parameters of the task
|
||||
```
|
||||
|
||||
The specific task types and parameters can be found in the [MAA Integration Document][task-types]. Note that maa-cli does not validate parameter names and values, and no error message will be generated even if an error occurs unless MaaCore` detects an error at runtime.
|
||||
The specific task types and parameters can be found in the [MAA Integration Document][task-types]. Note that maa-cli does not validate parameter names and values, and no error message will be generated even if an error occurs unless MaaCore detects an error at runtime.
|
||||
|
||||
### Task variants and conditions
|
||||
|
||||
@@ -61,9 +61,9 @@ params = { plan_index = 2 }
|
||||
The `condition` field is used to determine whether the variant should be used,
|
||||
and the `params` field of the matched variant will be merged into the parameters of the task.
|
||||
|
||||
**Note**: If the `filename` field is a relative path, it will be relative to `$MAA_CONFIG_DIR/infrast`. Besides, the custom infrastructure plan file will not be read by `maa-cli` but MaaCore. So the format of the file must be `JSON` and the time period defined in the file will not be used to select the corresponding sub-plan. So you must specify the `plan_index` field in the parameters of the task to use the correct infrastructure plan in the corresponding time period. This will ensure that the correct infrastructure plan is used in the appropriate time period.
|
||||
**Note**: If the `filename` field is a relative path, it will be relative to `$MAA_CONFIG_DIR/infrast`. Additionally, the custom infrastructure plan file will not be read by `maa-cli` but by MaaCore. Therefore, the file format must be `JSON` and the time period defined in the file will not be used to select the corresponding sub-plan. You must specify the `plan_index` field in the task parameters to use the correct infrastructure plan in the corresponding time period. This ensures that the correct infrastructure plan is used at the appropriate time.
|
||||
|
||||
Besides of `Time` condition, there are also `DateTime`, `Weekday`, `DayMod` conditions.
|
||||
Besides the `Time` condition, there are also `DateTime`, `Weekday`, and `DayMod` conditions.
|
||||
`DateTime` condition is used to specify a specific date-time period,
|
||||
`Weekday` condition is used to specify some days in a week,
|
||||
`DayMod` condition is similar to `Weekday`, but the period can be specified by `divisor` and `remainder`.
|
||||
@@ -85,13 +85,13 @@ params = { stage = "CE-6" }
|
||||
params = { stage = "1-7" }
|
||||
```
|
||||
|
||||
All the above conditions related to time have a `timezone` field, which is used to specify the timezone of the condition. The value of `timezone` can be an offset of UTC, like `8` or `-7`, or a name of the client type of game, like `Official`. Note, even though the official server is in China, the timezone of the official server is `UTC+4` instead of `UTC+8`, because the start of the game day is `04:00:00` instead of `00:00:00`. When the `timezone` is omitted, the condition will be matched in the local timezone of the system.
|
||||
Besides of above conditions, there is a condition `OnSideStory` which depends on hot update resource to check if there is any opening side story. Thus, the condition of fight `SL-8` can be simplified as `{ type = "OnSideStory", client = "Official" }`, where the `client` is the client type of game.
|
||||
All the above conditions related to time have a `timezone` field, which can be an offset from UTC (e.g., `8` for UTC+8) or a client type (e.g., `"Official"`). Note that the official server timezone is UTC+4, not UTC+8, because the game day starts at 04:00:00 rather than 00:00:00. If timezone is omitted, your local system timezone is used.
|
||||
|
||||
Beside of above basic condition, `{ type = "And", conditions = [...] }` `{ type = "Or", conditions = [...] }`, and `{ type = "Not", condition = ... }` can be used for logical combination of conditions.
|
||||
In addition to the above conditions, there's a `OnSideStory` condition that uses hot-update resources to check if there are any active events. For example, the condition to farm `SL-8` during a summer event can be simplified to `{ type = "OnSideStory", client = "Official" }`, where `client` is your game client type. Using this condition means you only need to update the stage to farm when an event changes, without manually editing event dates.
|
||||
|
||||
By the combination of of above conditions, you can define an infrastructure plan for multiple days,
|
||||
here is an example of 6 plans for 2 days:
|
||||
Besides the basic conditions, you can use `{ type = "And", conditions = [...] }`, `{ type = "Or", conditions = [...] }`, and `{ type = "Not", condition = ... }` for logical combinations.
|
||||
|
||||
By combining these conditions, you can define infrastructure plans spanning multiple days. Here's an example of 6 plans for 2 days:
|
||||
|
||||
```toml
|
||||
[[tasks]]
|
||||
@@ -109,16 +109,14 @@ filename = "normal.json"
|
||||
condition = {
|
||||
type = "And",
|
||||
conditions = [
|
||||
# The divisor use to specify the period, the remainder use to specify the offset
|
||||
# The offset is equal to num_days_since_ce % divisor
|
||||
# The num_days_since_ce is the number of days since the Common Era, 0001-01-01 is the first day
|
||||
# The offset of current day can be got by `maa remainder <divisor>`
|
||||
# for 2024-01-27, num_days_since_ce is 738,912,
|
||||
# the offset of 2024-01-27 is 738,912 % 2 = 0
|
||||
# so this condition will be matched on 2024-01-27
|
||||
# The divisor specifies the period, the remainder specifies the offset
|
||||
# The offset equals num_days_since_ce % divisor
|
||||
# num_days_since_ce is the number of days since Common Era (0001-01-01 is day 1)
|
||||
# You can get the current day's offset with `maa remainder <divisor>`
|
||||
# For 2024-01-27, num_days_since_ce is 738,912
|
||||
# The offset is 738,912 % 2 = 0, so this condition matches on 2024-01-27
|
||||
{ type = "DayMod", divisor = 2, remainder = 0 },
|
||||
{ type = "Time", start = "04:00:00", end = "12:00:00" },
|
||||
|
||||
]
|
||||
}
|
||||
params = { plan_index = 0 }
|
||||
@@ -136,7 +134,7 @@ params = { plan_index = 1 }
|
||||
|
||||
# The third shift, 20:00:00 (first day) - 04:00:00 (second day)
|
||||
[[tasks.variants]]
|
||||
# Note, we must use Or condition here, otherwise the second day 00:00:00 - 04:00:00 will not be matched
|
||||
# Note: we must use Or condition here to properly handle the time across midnight
|
||||
condition = {
|
||||
type = "Or",
|
||||
conditions = [
|
||||
@@ -192,9 +190,9 @@ condition = {
|
||||
params = { plan_index = 5 }
|
||||
```
|
||||
|
||||
With the default strategy, if multiple variants are matched, only the first one will be used. If the condition is not given, the variant will always be matched. So you can put a variant without condition at the end of variants.
|
||||
With the default strategy, if multiple variants are matched, only the first one will be used. If no condition is given, the variant will always be matched. So you can put a variant without condition at the end as a default case.
|
||||
|
||||
The strategy of matching variants can be changed by `strategy` field:
|
||||
The strategy for matching variants can be changed with the `strategy` field:
|
||||
|
||||
```toml
|
||||
[[tasks]]
|
||||
@@ -226,11 +224,11 @@ params = { stage = "SL-8" }
|
||||
condition = { type = "DateTime", start = "2023-08-01T16:00:00", end = "2023-08-21T03:59:59" }
|
||||
```
|
||||
|
||||
The outcome stage of this example should be identical to the previous one, but expiring medicine will be used on Sunday night additionally.
|
||||
With the `merge` strategy, if multiple variants are matched, the parameters of all matched variants will be merged. If multiple variants have the same parameters, the last one will be used.
|
||||
This example will yield the same stage selection as the previous one, but will additionally use expiring medicine on Sunday night.
|
||||
With the `merge` strategy, if multiple variants are matched, the parameters of all matched variants will be merged. If multiple variants have the same parameter keys, the later ones will override earlier ones.
|
||||
|
||||
If no variant is matched, the task will not be executed,
|
||||
which is useful when you want to only run a task in some conditions:
|
||||
which is useful when you want to only run a task under certain conditions:
|
||||
|
||||
```toml
|
||||
# Mall after 18:00
|
||||
@@ -241,9 +239,9 @@ type = "Mall"
|
||||
condition = { type = "Time", start = "18:00:00" }
|
||||
```
|
||||
|
||||
### User input
|
||||
### User Input
|
||||
|
||||
In some cases, you may want to input some value at runtime, instead of hard code it in the task file. Such as the stage to fight, the item to buy, etc. You can specify the value as `Input` or `Select` type:
|
||||
For some tasks, you might want to input values at runtime rather than hardcoding them in the task file. You can set parameters to `Input` or `Select` type:
|
||||
|
||||
```toml
|
||||
[[tasks]]
|
||||
@@ -261,9 +259,9 @@ alternatives = [
|
||||
"SL-7", # will be displayed as "1. SL-7"
|
||||
{ value = "SL-8", desc = "Manganese Ore" } # will be displayed as "2. SL-8 (Manganese Ore)"
|
||||
]
|
||||
default_index = 1 # the index of default value, start from 1, if not given, empty value will be re-prompt
|
||||
default_index = 1 # the index of default value, start from 1, if not given, empty input will re-prompt
|
||||
description = "a stage to fight in summer event" # description of the input, optional
|
||||
allow_custom = true # whether allow input custom value, default to false, if allow, non-integer value will be treated as custom value
|
||||
allow_custom = true # whether to allow custom value input, default is false; if true, non-integer inputs are treated as custom values
|
||||
|
||||
# Task without input
|
||||
[[tasks.variants]]
|
||||
@@ -273,30 +271,29 @@ params = { stage = "CE-6" }
|
||||
# Input a stage to fight
|
||||
[[tasks.variants]]
|
||||
|
||||
# Set the stage to a `Input` type with default value and description
|
||||
# Set the stage to an `Input` type with default value and description
|
||||
[tasks.variants.params.stage]
|
||||
default = "1-7" # default value of stage, optional (if not given, user can input empty value to re-prompt)
|
||||
default = "1-7" # default value of stage, optional (if not given, empty input will re-prompt)
|
||||
description = "a stage to fight" # description of the input, optional
|
||||
|
||||
# query the medicine to use only when stage is 1-7
|
||||
[tasks.variants.params.medicine]
|
||||
# a parameter can be optional with `optional` field
|
||||
# if the condition is not matched, the parameter will be ignored
|
||||
# the `condition` field can be used to specify the condition of the parameter
|
||||
# where the condition can be a table, whose keys are name of other parameters and values are the expected value
|
||||
# a parameter can be conditional based on other parameter values
|
||||
# the condition uses a table where keys are other parameter names and values are the expected values
|
||||
# this condition means "only prompt for medicine when stage is 1-7"
|
||||
conditions = { stage = "1-7" }
|
||||
default = 1000
|
||||
description = "medicine to use"
|
||||
```
|
||||
|
||||
For an `Input` type, a prompt will be shown to ask the user to input a value. If the default value is given, it will be used if the user inputs an empty value, otherwise, it will re-prompt.
|
||||
For `Select` type, a prompt will be shown to ask the user to input an index or custom value (if `allow_custom` is `true`). If the default index is given, it will be used if the user inputs an empty value, otherwise, it will re-prompt.
|
||||
For an `Input` type, a prompt will be shown to ask the user to input a value. If a default value is given, it will be used when the user inputs an empty value; otherwise, it will re-prompt.
|
||||
For a `Select` type, a prompt will be shown to ask the user to input an index or custom value (if `allow_custom` is `true`). If a default index is given, it will be used when the user inputs an empty value; otherwise, it will re-prompt.
|
||||
|
||||
`--batch` option can be used to run tasks in batch mode, which will use the default value for all inputs and panic if no default value is given.
|
||||
The `--batch` option can be used to run tasks in batch mode, which will use default values for all inputs and error if no default value is given.
|
||||
|
||||
## MaaCore related configurations
|
||||
## MaaCore Related Configurations
|
||||
|
||||
The related configuration files of MaaCore is called "Profile" and located in `$MAA_CONFIG_DIR/profiles` directory. Each files in this directory is a profile, while the default profile is `default.toml`. If you want to use a profile other than the default one, you can specify it by `-p` or `--profile` option.
|
||||
The MaaCore configuration files are called "Profiles" and located in the `$MAA_CONFIG_DIR/profiles` directory. Each file in this directory is a profile, with the default being `default.toml`. To use a different profile, specify it with the `-p` or `--profile` option.
|
||||
|
||||
The currently available configurations are:
|
||||
|
||||
@@ -325,150 +322,157 @@ kill_adb_on_exit = false
|
||||
|
||||
### Connection
|
||||
|
||||
The `connection` section is used to specify how to connect to the game:
|
||||
The `connection` section specifies how to connect to the game:
|
||||
|
||||
```toml
|
||||
[connection]
|
||||
adb_path = "adb" # the path of adb executable, default to "adb", which means use adb in PATH
|
||||
address = "emulator-5554" # the address of device, such as "emulator-5554" or "127.0.0.1:5555"
|
||||
config = "General" # the config of maa, should not be changed most of time
|
||||
adb_path = "adb" # path to adb executable, default is "adb" (uses PATH)
|
||||
address = "emulator-5554" # device address like "emulator-5554" or "127.0.0.1:5555"
|
||||
config = "General" # connection configuration, rarely needs changing
|
||||
```
|
||||
|
||||
`adb_path` is the path of `adb` executable, you can set it to the absolute path of `adb` or or leave it empty if it is in PATH. The `address` is the address of the device used by `adb`, like `emulator-5554` or `127.0.0.1:[port]`, the port of some common emulators can be found in the [MAA FAQ][emulator-ports]. If the `address` is absent, the cli will try to find the device automatically by `adb devices`, if there are multiple online devices, the first one will be used. If cli can not find any device, it will try to use the default address `emulator-5554`. The `config` is used to specify some configurations of the host and emulator, whose default value is `CompatMac` on macOS, `CompatPOSIXShell` on Linux and `General` on other platforms. More optional configs can be found in `config.json` in the resource directory.
|
||||
`adb_path` is the path to the `adb` executable - you can set its absolute path or leave it empty to use it from PATH. Most emulators include `adb`, so you can use their built-in version without installing separately. `address` is the address used by `adb`. For emulators, use `127.0.0.1:[port]` - common emulator ports are listed in the [FAQ][emulator-ports]. If no address is specified, maa-cli tries to find a device with `adb devices`, using the first one found or defaulting to `emulator-5554` if none are found. `config` specifies platform/emulator configurations - defaults to `CompatPOSIXShell` on Linux, `CompatMac` on macOS, and `General` on other platforms. More options are in the resource folder's `config.json`.
|
||||
|
||||
For some common emulators, you can use `preset` to use predefined configurations:
|
||||
For common emulators, you can use `preset` for predefined configurations:
|
||||
|
||||
```toml
|
||||
[connection]
|
||||
preset = "MuMuPro"
|
||||
adb_path = "/path/to/other/adb" # override predefined adb executable path
|
||||
address = "127.0.0.1:7777" # override the predefined address
|
||||
preset = "MuMuPro" # Use MuMu Pro emulator preset
|
||||
adb_path = "/path/to/adb" # Override the preset's adb path if needed (optional)
|
||||
address = "127.0.0.1:7777" # Override the preset's address if needed (optional)
|
||||
```
|
||||
|
||||
Currently, there is only one preset `MuMuPro` for emulators. Issue and PR are welcome for the new preset.
|
||||
Currently only `MuMuPro` preset is available. Issues and PRs for more presets are welcome.
|
||||
|
||||
There is a special preset `PlayCover`, used for the iOS app running on macOS by PlayCover. In this case, `adb_path` is ignored and `address` is used to specify the address of `MaaTools` set in `PlayCover`, more details can be found in the [PlayCover documentation][playcover-doc].
|
||||
#### Special Presets
|
||||
|
||||
There are two special presets: `PlayCover (macOS)` and `Waydroid (Linux)`
|
||||
|
||||
- `PlayCover` is for connecting to iOS apps running natively on macOS through PlayCover. In this case, `adb_path` is ignored and `address` is the address of `PlayTools`. See [PlayCover documentation][playcover-doc] for details.
|
||||
|
||||
- `Waydroid` is for connecting to Android apps running natively on Linux through Waydroid. `adb_path` is still required. See [Waydroid documentation][waydroid-doc] for details.
|
||||
|
||||
### Resource
|
||||
|
||||
The `resource` section is used to specify the resource to use:
|
||||
The `resource` section specifies which resources MaaCore should load:
|
||||
|
||||
```toml
|
||||
[resource]
|
||||
global_resource = "YoStarEN" # the global resource to use
|
||||
platform_diff_resource = "iOS" # the platform diff resource to use
|
||||
user_resource = true # whether use user resource
|
||||
global_resource = "YoStarEN" # Non-Chinese resources
|
||||
platform_diff_resource = "iOS" # Non-Android resources
|
||||
user_resource = true # Whether to load user-defined resources
|
||||
```
|
||||
|
||||
When your game is not in Simplified Chinese, you should set `global_resource` to non-Chinese resource. If you connect to the game with `PlayCover`, you should set `platform_diff_resource` to `iOS`.
|
||||
Leave those two fields empty if you don't want to use global resource or platform diff resource. Besides, those two fields will also be set up automatically by maa-cli based on your task and connection type.
|
||||
Lastly, if you want to use user resources, you should set `user_resource` to `true`. When `user_resource` is `true`, maa-cli will try to find user resources in `$MAA_CONFIG_DIR/resource` directory.
|
||||
When using a non-Simplified Chinese game client, set `global_resource` to load non-Chinese resources. When using an iOS client, set `platform_diff_resource` to `iOS`. Both are optional - leave empty to not load these resources. These are also auto-set based on your `startup` task's `client_type` and when using `PlayTools` connection. To load user-defined resources, set `user_resource` to `true`, which loads resources from `$MAA_CONFIG_DIR/resource`.
|
||||
|
||||
### Static options
|
||||
|
||||
The `static_options` section is used to configure MAA static options:
|
||||
The `static_options` section configures MaaCore static options:
|
||||
|
||||
```toml
|
||||
[static_options]
|
||||
cpu_ocr = false # whether use CPU OCR, CPU OCR is enabled by default
|
||||
gpu_ocr = 1 # the ID of your GPU, leave it to empty if you don't want to use GPU OCR
|
||||
cpu_ocr = false # Whether to use CPU OCR (enabled by default)
|
||||
gpu_ocr = 1 # GPU ID for GPU OCR; leave empty to use CPU OCR
|
||||
```
|
||||
|
||||
### Instance options
|
||||
|
||||
The `instance_options` section is used to configure MAA instance options:
|
||||
The `instance_options` section configures MaaCore instance options:
|
||||
|
||||
```toml
|
||||
[instance_options]
|
||||
touch_mode = "ADB" # touch mode to use, can be "ADB", "MiniTouch", "MaaTouch" or "MacPlayTools" (only for PlayCover)
|
||||
deployment_with_pause = false # whether pause the game when deployment
|
||||
adb_lite_enabled = false # whether use adb-lite
|
||||
kill_adb_on_exit = false # whether kill adb when exit
|
||||
touch_mode = "ADB" # Touch mode: "ADB", "MiniTouch", "MaaTouch", or "MacPlayTools"
|
||||
deployment_with_pause = false # Whether to pause game during deployment
|
||||
adb_lite_enabled = false # Whether to use adb-lite
|
||||
kill_adb_on_exit = false # Whether to kill adb on exit
|
||||
```
|
||||
|
||||
Note: If you connect to the game with `PlayCover`, the `touch_mode` will be ignored and `MacPlayTools` will be used.
|
||||
Note: When using `PlayTools` connection, `touch_mode` is forced to `MacPlayTools` regardless of setting.
|
||||
|
||||
## CLI related configurations
|
||||
## CLI Related Configurations
|
||||
|
||||
The CLI related configurations should be located in `$MAA_CONFIG_DIR/cli.toml`. Currently, it only contains one section: `core`:
|
||||
CLI-related configurations should be in `$MAA_CONFIG_DIR/cli.toml`. Current configurations include:
|
||||
|
||||
```toml
|
||||
# MaaCore install and update configurations
|
||||
# MaaCore install and update configurations
|
||||
[core]
|
||||
channel = "Stable" # update channel, can be "Stable", "Beta" or "Alpha"
|
||||
test_time = 0 # the time to test download mirrors in seconds, 0 to skip
|
||||
# the url to query the latest version of MaaCore, leave it to empty to use default url
|
||||
apit_url = "https://github.com/MaaAssistantArknights/maa-cli/raw/version/"
|
||||
channel = "Stable" # Update channel: "Alpha", "Beta", or "Stable" (default)
|
||||
test_time = 0 # Time to test mirror speeds in seconds; 0 to skip, default is 3
|
||||
# API URL to query latest MaaCore version; leave empty for default
|
||||
api_url = "https://github.com/MaaAssistantArknights/MaaRelease/raw/main/MaaAssistantArknights/api/version/"
|
||||
|
||||
# Component installation config (not recommended to change)
|
||||
[core.components]
|
||||
library = true # whether install MaaCore library
|
||||
resource = false # whether install resource resource
|
||||
library = true # Whether to install MaaCore library
|
||||
resource = true # Whether to install MaaCore resources
|
||||
|
||||
# CLI update configurations
|
||||
[cli]
|
||||
channel = "Stable" # update channel, can be "Stable", "Beta" or "Alpha"
|
||||
# the url to query the latest version of maa-cli, leave it to empty to use default url
|
||||
channel = "Stable" # Update channel: "Alpha", "Beta", or "Stable" (default)
|
||||
# API URL to query latest maa-cli version; leave empty for default
|
||||
api_url = "https://github.com/MaaAssistantArknights/maa-cli/raw/version/"
|
||||
# the url to download prebuilt binary, leave it to empty to use default url
|
||||
# URL to download prebuilt binaries; leave empty for default
|
||||
download_url = "https://github.com/MaaAssistantArknights/maa-cli/releases/download/"
|
||||
|
||||
[cli.components]
|
||||
binary = true # whether install maa-cli binary
|
||||
binary = true # Whether to install maa-cli binary
|
||||
|
||||
|
||||
# hot update resource configurations
|
||||
# Resource hot update configurations
|
||||
[resource]
|
||||
auto_update = true # whether auto update resource before running task
|
||||
warn_on_update_failure = true # Whether to warn on update failure instead of panic
|
||||
backend = "libgit2" # the backend of resource, can be "libgit2" or "git"
|
||||
auto_update = true # Whether to auto-update resources before running tasks
|
||||
warn_on_update_failure = true # Whether to warn instead of error on update failure
|
||||
backend = "libgit2" # Hot update backend: "git" or "libgit2"
|
||||
|
||||
# the remote of resource
|
||||
# Remote repository configuration
|
||||
[resource.remote]
|
||||
branch = "main" # Branch of remote resource repository
|
||||
# URL of remote resource repository, leave it empty to use the default URL
|
||||
url = "git@github.com:MaaAssistantArknights/MaaResource.git"
|
||||
# If you want to use ssh, a certificate is needed which can be "ssh-agent" or "ssh-key"
|
||||
# To use ssh-agent, set `use_ssh_agent` to true, and leave `ssh_key` and `passphrase` empty
|
||||
# use_ssh_agent = true # Use ssh-agent to authenticate
|
||||
# To use ssh-key, set `ssh_key` to path of ssh key,
|
||||
ssh_key = "~/.ssh/id_ed25519" # Path of ssh key
|
||||
# A Passphrase is needed if the ssh key is encrypted
|
||||
passphrase = "password" # Passphrase of ssh key
|
||||
# Store plain text password in configuration file is unsafe, so there are some ways to avoid it
|
||||
# 1. set `passphrase` to true, then maa-cli will prompt you to input passphrase each time
|
||||
branch = "main" # Branch of remote repository
|
||||
# Repository URL; leave empty for default
|
||||
# GitHub repositories support both HTTPS and SSH; HTTPS recommended
|
||||
url = "https://github.com/MaaAssistantArknights/MaaResource.git"
|
||||
# url = "git@github.com:MaaAssistantArknights/MaaResource.git"
|
||||
# If using SSH, you need to provide authentication:
|
||||
# 1. Using ssh-agent (recommended)
|
||||
# use_ssh_agent = true # Use ssh-agent for authentication
|
||||
# 2. Using SSH key file
|
||||
ssh_key = "~/.ssh/id_ed25519" # Path to SSH key
|
||||
# If your key is password-protected:
|
||||
passphrase = "password" # Passphrase for SSH key
|
||||
# Storing plaintext passwords is insecure. Alternatives:
|
||||
# 1. Set passphrase to true to be prompted each time
|
||||
# passphrase = true
|
||||
# 2. set `passphrase` to a environment variable, then maa-cli will use the environment variable as passphrase
|
||||
# 2. Use an environment variable
|
||||
# passphrase = { env = "MAA_SSH_PASSPHRASE" }
|
||||
# 3. set `passphrase` to a command, then maa-cli will execute the command to get passphrase
|
||||
# which is useful when you use a password manager to manage your passphrase
|
||||
# 3. Use a command output (useful with password managers)
|
||||
# passphrase = { cmd = ["pass", "show", "ssh/id_ed25519"] }
|
||||
```
|
||||
|
||||
**NOTE**:
|
||||
|
||||
- The `Alpha` channel of MaaCore is only available on Windows;
|
||||
- The hot update resource can not work separately, it should be used with basic resources installed with MaaCore;
|
||||
- If you want to use `git` backend, `git` command is required;
|
||||
- If you want to fetch resources with ssh, the `ssh_key` is required;
|
||||
- The `resource.remote.url` only affects first-time installation, it will be ignored when updating resource. If you want to change the remote URL, you should change it manually or delete the resource directory and reinstall the resources. The directory of the repository can be located by `maa dir hot-update`.
|
||||
- The `Alpha` channel for MaaCore is only available on Windows
|
||||
- Hot update resources require the basic resources installed with MaaCore
|
||||
- Using the `git` backend requires the `git` command to be available
|
||||
- SSH authentication requires either `ssh_key` configuration or `ssh-agent`
|
||||
- The `resource.remote.url` only affects first installation; to change it later, modify it manually or delete and reinstall resources. Get the repository location with `maa dir hot-update`.
|
||||
|
||||
## Example of config file
|
||||
## Example Configuration Files
|
||||
|
||||
- [Example configuration][example-config];
|
||||
- [Configuration used by maintainer][wangl-cc-dotfiles].
|
||||
- [Example configurations][example-config]
|
||||
- [Maintainer's configuration][wangl-cc-dotfiles]
|
||||
|
||||
## JSON schema
|
||||
## JSON Schema
|
||||
|
||||
The JSON schema of configuration files can be found at [`schemas` directory][schema-dir]:
|
||||
JSON schemas for configuration files are in the [`schemas` directory][schema-dir]:
|
||||
|
||||
- The schema of the task configuration is [`task.schema.json`][task-schema];
|
||||
- the schema of the MaaCore configuration file is [`asst.schema.json`][asst-schema];
|
||||
- the schema of the CLI configuration file is [`cli.schema.json`][cli-schema].
|
||||
- Task configuration schema: [`task.schema.json`][task-schema]
|
||||
- MaaCore configuration schema: [`asst.schema.json`][asst-schema]
|
||||
- CLI configuration schema: [`cli.schema.json`][cli-schema]
|
||||
|
||||
With the help of JSON schema, you can get auto-completion and validation in some editors with plugins.
|
||||
With these schemas, you can get auto-completion and validation in supported editors with plugins.
|
||||
|
||||
[task-types]: ../../protocol/integration.md#list-of-task-types
|
||||
[emulator-ports]: ../../manual/connection.md#obtain-port-number
|
||||
[playcover-doc]: ../../manual/device/macos.md#%E2%9C%85-playcover-the-software-runs-most-fluently-for-its-nativity-%F0%9F%9A%80
|
||||
[waydroid-doc]: ../../manual/device/linux.md#✅-waydroid
|
||||
[example-config]: https://github.com/MaaAssistantArknights/maa-cli/blob/main/crates/maa-cli/config_examples
|
||||
[wangl-cc-dotfiles]: https://github.com/wangl-cc/dotfiles/tree/master/.config/maa
|
||||
[schema-dir]: https://github.com/MaaAssistantArknights/maa-cli/blob/main/crates/maa-cli/schemas/
|
||||
|
||||
@@ -7,7 +7,7 @@ icon: ph:question-fill
|
||||
|
||||
## 1. How to use `$HOME/.config/maa` as the configuration directory on macOS?
|
||||
|
||||
Due to the limitation of [Directories](https://github.com/dirs-dev/directories-rs/), maa-cli uses the Apple-style configuration directory on macOS by default. However, the XDG-style configuration directory is more suitable for command-line programs. If you want to use the XDG style configuration directory, you can set the `XDG_CONFIG_HOME` environment variable, such as `export XDG_CONFIG_HOME="$HOME/.config"`, this will make maa-cli use the XDG style configuration directory. Or you can use the below command to create a symbolic link:
|
||||
Due to the Rust library [Directories](https://github.com/dirs-dev/directories-rs/) using Apple-style directories on macOS by default, maa-cli also uses Apple-style configuration directories by default. However, XDG-style directories are more suitable for command-line programs. If you want to use XDG-style directories, you can set the `XDG_CONFIG_HOME` environment variable, such as `export XDG_CONFIG_HOME="$HOME/.config"`, which will make maa-cli use XDG-style configuration directories. If you want to use XDG-style configuration directories but don't want to set environment variables, you can use the following command to create a symbolic link:
|
||||
|
||||
```bash
|
||||
mkdir -p "$HOME/.config/maa"
|
||||
|
||||
@@ -47,7 +47,7 @@ Homebrew users can install maa-cli via the unofficial [tap](https://github.com/M
|
||||
nix run github:Cryolitia/nur-packages#maa-cli-nightly
|
||||
```
|
||||
|
||||
Stable is the maa-cli packaged in [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-cli/package.nix), using the nixpkgs's Rust toolchain; Nightly is in [NUR](https://github.com/Cryolitia/nur-packages/blob/master/pkgs/maa-assistant-arknights/maa-cli.nix), uses the Beta Channel of Rust toolchain, automatically updates and builds for verification by Github Action daily.
|
||||
Stable is packaged in [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-cli/package.nix), using the nixpkgs Rust toolchain; Nightly is in [NUR](https://github.com/Cryolitia/nur-packages/blob/master/pkgs/maa-assistant-arknights/maa-cli.nix), using the Beta Channel Rust toolchain, automatically updated and built daily by GitHub Actions.
|
||||
|
||||
- Users using Homebrew on Linux please refer to the macOS installation method above.
|
||||
|
||||
@@ -96,6 +96,14 @@ maa-cli only provides an interface for MaaCore, it needs MaaCore and resources t
|
||||
maa install
|
||||
```
|
||||
|
||||
For Windows platform users, before running the `maa install` command, please run the following command as administrator in Command Prompt or PowerShell to install the required VC++ toolset:
|
||||
|
||||
- Windows:
|
||||
|
||||
```bat
|
||||
winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
|
||||
```
|
||||
|
||||
For users who installed via package managers, MaaCore can also be installed via package managers:
|
||||
|
||||
- Homebrew:
|
||||
|
||||
@@ -5,96 +5,98 @@ icon: material-symbols:summarize
|
||||
|
||||
# Usage
|
||||
|
||||
maa-cli is a command-line interface for MaaCore that automates tasks in the game Arknights. Additionally, maa-cli can manage MaaCore.
|
||||
maa-cli's main functionality is to automate Arknights game tasks by calling MaaCore. Additionally, for convenience, maa-cli also provides functions to manage MaaCore.
|
||||
|
||||
## Manage MaaCore
|
||||
|
||||
maa-cli can install and update MaaCore and resources, just run the following commands:
|
||||
maa-cli can install and update MaaCore and resources by running the following commands:
|
||||
|
||||
```bash
|
||||
maa install # Install MaaCore and resources
|
||||
maa update # Update MaaCore and resources
|
||||
```
|
||||
|
||||
## Update maa-cli itself
|
||||
## Update maa-cli Itself
|
||||
|
||||
maa-cli can update itself, just run the following command:
|
||||
maa-cli can update itself by running the following command:
|
||||
|
||||
```bash
|
||||
maa self update
|
||||
```
|
||||
|
||||
**Note**: Users who install maa-cli via a package manager should use the package manager to update maa-cli, this command is invalid for these users.
|
||||
**Note**: Users who installed maa-cli via a package manager should use the package manager to update maa-cli. This command will not work for those users.
|
||||
|
||||
## Initialize Configuration
|
||||
|
||||
Once MaaCore is installed, you can run tasks directly without additional configuration. The default configuration may not be suitable for all users. Therefore, you can initialize the configuration by running the following command:
|
||||
Once MaaCore is installed, you can typically run tasks directly without additional configuration. However, the default configuration may not be suitable for all users, so you can initialize the configuration with:
|
||||
|
||||
```bash
|
||||
maa init
|
||||
```
|
||||
|
||||
With this command, you can configure [the relevant configurations of MaaCore][config-core] interactively.
|
||||
With this command, you can interactively configure [MaaCore-related settings][config-core].
|
||||
|
||||
## Run Tasks
|
||||
|
||||
After installing and configuring MaaCore, you can run tasks. maa-cli supports two types of tasks: predefined tasks and custom tasks.
|
||||
|
||||
### Predefined tasks
|
||||
### Predefined Tasks
|
||||
|
||||
- `maa startup [client]`: start the game client and enter the main screen, the `client` is the client type of game, leave it empty to don't start the game.
|
||||
- `maa closedown [client]`: close the game client, the `client` is the client type of game, default is `Official`.
|
||||
- `maa fight [stage]`: run a "fight" task, the `stage` is the stage to fight, like `1-7`, `CE-6`, etc.; if not given, the user will be prompted to input one.
|
||||
- `maa copilot <maa_uri>...`: run a "copilot" task, the `maa_uri` is the URI of a copilot task, multiple URIs will be executed in sequence, `maa_uri` can be `maa://1234` or local file path `./1234.json`.
|
||||
- `maa sscopilot <maa_uri>`: run a "sscopilot" task, the `maa_uri` is the URI of a sscopilot task.
|
||||
- `maa roguelike [theme]`: run a "roguelike" task, the `theme` is the theme of roguelike, and available themes are `Phantom`, `Mizuki`, `Sami` and `Sarkaz`.
|
||||
- `maa reclamation [theme]`: run a "reclamation" task, the `theme` is the theme of reclamation, and available themes are `Tales`.
|
||||
For common tasks, maa-cli provides several predefined options:
|
||||
|
||||
The above tasks accept some parameters, you can view the specific parameters by `maa <task> --help`.
|
||||
- `maa startup [client]`: Start the game and enter the main interface. `[client]` is the client type; leave empty to not start any game client.
|
||||
- `maa closedown [client]`: Close the game client. `[client]` is the client type, defaulting to `Official`.
|
||||
- `maa fight [stage]`: Run a combat task. `[stage]` is the stage name like `1-7`; leave empty to select the last or current stage.
|
||||
- `maa copilot <maa_uri>...`: Auto-run copilot tasks. `<maa_uri>` is the task URI, multiple URIs will execute in sequence. `maa_uri` can be `maa://1234` or a local file path like `./1234.json`.
|
||||
- `maa sscopilot <maa_uri>`: Auto-run Stationary Security Service tasks. `<maa_uri>` is the task URI.
|
||||
- `maa roguelike <theme>`: Auto-run Integrated Strategy. `<theme>` is the theme, with options including `Phantom`, `Mizuki`, `Sami`, `Sarkaz`, and `JieGarden`.
|
||||
- `maa reclamation <theme>`: Auto-run Reclamation Algorithm. `<theme>` is the theme, currently only `Tales` is available.
|
||||
|
||||
For example, if you want to open the game, use 3 sanity medicines to farm BB-7, and then close the game, you can run the following command:
|
||||
These tasks accept various parameters. You can view the specific parameters with `maa <task> --help`.
|
||||
|
||||
For example, if you want to open the game, use 3 sanity potions to farm BB-7, and then close the game, you can run:
|
||||
|
||||
```bash
|
||||
maa startup YoStarEN && maa fight BB-7 -m 3 && maa closedown
|
||||
maa startup Official && maa fight BB-7 -m 3 && maa closedown
|
||||
```
|
||||
|
||||
### Custom Tasks
|
||||
|
||||
Due to the multitude of tasks supported by MAA, maa-cli cannot provide predefined options for all tasks. Additionally, you may need to run multiple tasks as shown in the example above. To address this issue, maa-cli offers custom task functionality. Custom tasks allow for the combination of different tasks and provide finer control over the parameters of each task as well as the execution order. Furthermore, custom tasks support conditional statements, enabling you to decide whether to execute a task based on certain conditions or to execute a task with specific parameters. This can be used to automate your daily tasks. A custom task is defined in a configuration file. The location and format of the configuration file are described in the [Custom Task Document][custom-task]. After defining the configuration file, you can run the custom task by `maa run <task>`, where `<task>` is the name of the custom task, excluding the extension.
|
||||
Due to MAA's support for numerous tasks, maa-cli cannot provide predefined options for everything. Additionally, you may need to run multiple tasks as in the example above. To address this, maa-cli offers custom task functionality. Custom tasks can combine different tasks, providing finer control over parameters and execution order. They also support conditional execution based on specific criteria, automating your daily routines. Custom tasks are defined via configuration files—see the [Custom Task Documentation][custom-task] for details on location and format. After creating a configuration file, run your custom task with `maa run <task>`, where `<task>` is the filename without extension.
|
||||
|
||||
### Task Summary
|
||||
|
||||
maa-cli will output a summary of the task after the task is terminated, including the running time of each subtask (start time, end time, running time). For some tasks, it will also output a summary of the task results:
|
||||
Both predefined and custom tasks output summary information upon completion, including each subtask's runtime (start time, end time, duration). For certain tasks, result summaries include:
|
||||
|
||||
- `fight` task: stage name, times, sanity cost, and drop statistics;
|
||||
- `infrast`: operators stationed in each facility, for the factory and trading post, it also includes the type of product;
|
||||
- `recruit`: tags, star ratings, and status of each recruitment, as well as the total number of recruitments;
|
||||
- `roguelike`: exploration times, investment times.
|
||||
- `fight` task: Stage name, number of runs, sanity potions used, and drop statistics
|
||||
- `infrast`: Operators assigned to each facility, including product types for factories and trading posts
|
||||
- `recruit`: Tags, star ratings, and status for each recruitment, plus total recruitment count
|
||||
- `roguelike`: Exploration count, investment count
|
||||
|
||||
If you don't want the task summary, you can turn it off by `--no-summary`.
|
||||
If you don't want task summaries, disable them with the `--no-summary` parameter.
|
||||
|
||||
### Loggings
|
||||
### Task Logging
|
||||
|
||||
maa-cli will output logs, the log output levels from low to high are `Error`, `Warn`, `Info`, `Debug`, and `Trace`. The default log output level is `Warn`. The log level can be set by the `MAA_LOG` environment variable, for example, `MAA_LOG=debug`. You can also increase or decrease the log output level by `-v` or `-q`.
|
||||
maa-cli outputs logs with the following levels (low to high): `Error`, `Warn`, `Info`, `Debug`, and `Trace`. The default level is `Warn`. Set the log level via the `MAA_LOG` environment variable (e.g., `MAA_LOG=debug`) or use `-v` to increase and `-q` to decrease the level.
|
||||
|
||||
maa-cli will output logs to stderr by default. The `--log-file` option can output logs to a file, the logs are saved in `$(maa dir log)/YYYY/MM/DD/HH:MM:SS.log`, where `$(maa dir log)` is the log directory, you can get it by `maa dir log`. You can also specify the log file path by `--log-file=path/to/log`.
|
||||
By default, logs go to standard error (stderr). The `--log-file` option can redirect logs to a file at `$(maa dir log)/YYYY/MM/DD/HH:MM:SS.log`, where `$(maa dir log)` is the log directory obtainable via `maa dir log`. You can also specify a custom log path with `--log-file=path/to/log`.
|
||||
|
||||
By default, all output logs will include a timestamp and a log-level prefix. You can change this behavior by the `MAA_LOG_PREFIX` environment variable. When set to `Always`, the prefix will always be included, when set to `Auto`, the prefix will be included when writing to the log file, and not included when writing to stderr, and when set to `Never`, the prefix will not be included even when writing to the log file.
|
||||
All logs normally include a timestamp and level prefix. The `MAA_LOG_PREFIX` environment variable controls this behavior: `Always` always includes prefixes, `Auto` includes prefixes in log files but not in stderr output, and `Never` omits prefixes even in log files.
|
||||
|
||||
### Other subcommands
|
||||
### Other Subcommands
|
||||
|
||||
Except for the above subcommands, maa-cli also provides other subcommands:
|
||||
Besides the above commands, maa-cli provides additional subcommands:
|
||||
|
||||
- `maa list`: list all available tasks;
|
||||
- `maa dir <dir>`: get the path of a specific directory, for example, `maa dir config` can be used to get the path of the configuration directory;
|
||||
- `maa version`: get the version information of `maa-cli` and `MaaCore`;
|
||||
- `maa convert <input> [output]`: convert a file in `JSON`, `YAML`, or `TOML` format to another format;
|
||||
- `maa complete <shell>`: generate an auto-completion script;
|
||||
- `maa activity [client]`: get the current activity information of the game, the `client` is the client type, default is `Official`.
|
||||
- `maa cleanup`: clean up the cache of `maa-cli` and `MaaCore`.
|
||||
- `maa import <file> [-t <type>]`: import a configuration file, the `file` is the path of the configuration file. The `-t` option can specify the type of the configuration file, such as `cli`, `profile`, `infrast`, etc.
|
||||
- `maa list`: List all available tasks
|
||||
- `maa dir <dir>`: Get a specific directory path, such as `maa dir config` for the configuration directory
|
||||
- `maa version`: Get version information for `maa-cli` and `MaaCore`
|
||||
- `maa convert <input> [output]`: Convert between `JSON`, `YAML`, or `TOML` format files
|
||||
- `maa complete <shell>`: Generate auto-completion scripts
|
||||
- `maa activity [client]`: Get current in-game activity information, with `[client]` defaulting to `Official`
|
||||
- `maa cleanup`: Clean `maa-cli` and `MaaCore` caches
|
||||
- `maa import <file> [-t <type>]`: Import a configuration file, with `-t` specifying the type (e.g., `cli`, `profile`, `infrast`)
|
||||
|
||||
More command usage can be viewed by `maa help`, and the usage of specific commands can be viewed by `maa help <command>`.
|
||||
For more command information, use `maa help`. For specific command details, use `maa help <command>`.
|
||||
|
||||
[config-core]: config.md#maacore-related-configurations
|
||||
[custom-task]: config.md#custom-tasks
|
||||
|
||||
@@ -3,192 +3,247 @@ order: 3
|
||||
icon: mdi:plug
|
||||
---
|
||||
|
||||
# Connection
|
||||
# Connection Settings
|
||||
|
||||
## Automatic Detection
|
||||
## Auto Detection
|
||||
|
||||
MAA can automatically detect and fill in the ADB path, connection address, and connection present through the **currently running single emulator**.
|
||||
MAA can automatically detect and fill in the ADB path, connection address, and connection configuration for a **single currently running emulator**.
|
||||
|
||||
As of MAA v5.7.0, the supported emulators and connection addresses for detection are as follows:
|
||||
As of MAA v5.22.3, the following emulators and connection addresses are supported for detection:
|
||||
|
||||
- BlueStacks 5: `127.0.0.1:5555/5556/5565/5575/5585/5595/5554`
|
||||
- MuMu Player 12: `127.0.0.1:16384/16416/16448/16480/16512/16544/16576`
|
||||
- MuMu Player: `127.0.0.1:16384/16416/16448/16480/16512/16544/16576`
|
||||
- LDPlayer 9: `emulator-5554/5556/5558/5560`, `127.0.0.1:5555/5557/5559/5561`
|
||||
- NoxPlayer: `127.0.0.1:62001/59865`
|
||||
- Memu Play: `127.0.0.1:21503`
|
||||
- MEmu Play: `127.0.0.1:21503`
|
||||
|
||||
If detection fails, try launching MAA with UAC administrator privileges and retry detection. If it still fails, please refer to the manual setup below and verify whether the emulator and connection address are included in the list above.
|
||||
If detection fails, try launching MAA with UAC administrator privileges and detect again. If it still fails, refer to the manual setup instructions below and verify that your emulator and connection address are included in the list above.
|
||||
|
||||
## ADB Path
|
||||
|
||||
:::info Technical Details
|
||||
Automatic detection uses the emulator's ADB, but sometimes problems occur with automatic detection, then manual settings are required.
|
||||
`Replace ADB` is to download the ADB provided by Google and then replace it. If you set up Google's ADB yourself, you can do it once and for all.
|
||||
:::info Technical details
|
||||
Auto detection uses the emulator's ADB. Manual configuration is only required if auto detection fails.
|
||||
`Force Replace ADB` will download Google's ADB and use it automatically.
|
||||
If ADB is available in the environment variables, just fill in `adb`.
|
||||
:::
|
||||
|
||||
### Use the ADB provided by the emulator
|
||||
### Use emulator's ADB
|
||||
|
||||
Go to the emulator installation path. In Windows, when the emulator is running, right-click the process in the Task Manager and click `Open the location of the file`.
|
||||
Go to your emulator's installation directory. On Windows, you can right-click the process in Task Manager while the emulator is running and select `Open file location`.
|
||||
|
||||
There should be an exe file with `adb` in its name in the top-level or lower directory. You can search and select it.
|
||||
Look for an exe file with `adb` in its name in the top-level or subdirectories. You can use search to find it.
|
||||
|
||||
:::details Examples
|
||||
`adb.exe` `HD-adb.exe` `adb_server.exe` `nox_adb.exe`
|
||||
:::
|
||||
|
||||
### Use ADB provided by Google
|
||||
### Use Google's ADB
|
||||
|
||||
[Click](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) to download and unzip, then select `adb.exe`.
|
||||
[Download here](https://dl.google.com/android/repository/platform-tools-latest-windows.zip), extract it, and select `adb.exe`.
|
||||
|
||||
We are recommended to extract it directly to the MAA folder, so that you can directly fill in `.\platform-tools\adb.exe` in the ADB path, and move it with MAA.
|
||||
We recommend extracting it directly to the MAA folder so you can enter `.\platform-tools\adb.exe` as the ADB path, allowing it to move with the MAA folder.
|
||||
|
||||
## Connection Address
|
||||
|
||||
::: tip
|
||||
The connection address of the emulator running on this computer should be `127.0.0.1:<port>` 或 `emulator-<four numbers>`。
|
||||
Emulators running on your local machine should use addresses like `127.0.0.1:<port number>` or `emulator-<four digits>`.
|
||||
:::
|
||||
|
||||
### Emulator documents and addressess for reference
|
||||
### Emulator documentation and reference addresses
|
||||
|
||||
:::warning
|
||||
The following links are Chinese websites, cuz no English websites were found. Maybe.
|
||||
:::
|
||||
|
||||
- [Bluestacks 5](https://support.bluestacks.com/hc/zh-tw/articles/360061342631-%E5%A6%82%E4%BD%95%E5%B0%87%E6%82%A8%E7%9A%84%E6%87%89%E7%94%A8%E5%BE%9EBlueStacks-4%E8%BD%89%E7%A7%BB%E5%88%B0BlueStacks-5#%E2%80%9C2%E2%80%9D) `127.0.0.1:5555`
|
||||
- [Bluestacks 5](https://support.bluestacks.com/hc/zh-tw/articles/360061342631-%E5%A6%82%E4%BD%95%E5%B0%87%E6%82%A8%E7%9A%84%E6%87%89%E7%94%A8%E5%BE%9EBlueStacks-4%E8%BD%89%E7%A7%BB%E5%88%B0BlueStacks-5#%E2%80%9C2%E2%80%9D): Emulator settings show current multi-instance ports.
|
||||
- [MuMu Player](https://mumu.163.com/help/20240807/40912_1073151.html?maa): Multi-instance manager shows running ports in the top-right corner.
|
||||
- [MuMu Player Pro](https://mumu.163.com/mac/function/20240126/40028_1134600.html) `127.0.0.1:16384`
|
||||
- [MuMu Player 12](https://mumu.163.com/help/20230214/35047_1073151.html) `127.0.0.1:16384`
|
||||
- [LD Player 9](https://help.ldmnq.com/docs/LD9adbserver) `emulator-5554`
|
||||
- [LDPlayer 9](https://help.ldmnq.com/docs/LD9adbserver) `emulator-5554`
|
||||
- [NoxPlayer](https://support.yeshen.com/zh-CN/qt/ml) `127.0.0.1:62001`
|
||||
- [Memu Play](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `127.0.0.1:21503`
|
||||
- [MEmu Play](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `127.0.0.1:21503`
|
||||
|
||||
For other emulators, please check [Zhao Qingqing's blog](https://www.cnblogs.com/zhaoqingqing/p/15238464.html).
|
||||
For other emulators, refer to [Zhao Qingqing's blog](https://www.cnblogs.com/zhaoqingqing/p/15238464.html).
|
||||
|
||||
### Obtain Port Number
|
||||
::: details Alternative methods
|
||||
|
||||
- MuMu 12: The running emulator ports can be found in the upper right corner of the MultiPlayer.
|
||||
- Bluestacks 5: The current emulator ports can be viewed in the emulator settings.
|
||||
- _TODO_
|
||||
- Method 1: Check emulator ports using ADB commands
|
||||
|
||||
::: details Alternatives
|
||||
|
||||
- Method 1: Use the adb command to view the running port directly
|
||||
|
||||
1. Launch **one** emulator and make sure no other Android devices are connected to this computer.
|
||||
2. Launch a terminal in the folder where the adb executable is.
|
||||
3. Execute the following command.
|
||||
1. Launch **one** emulator and ensure no other Android devices are connected to your computer.
|
||||
2. Open a terminal in the folder containing the ADB executable.
|
||||
3. Run the following command:
|
||||
|
||||
```sh
|
||||
# Windows CMD
|
||||
# Windows command prompt
|
||||
adb devices
|
||||
# Windows PowerShell
|
||||
.\adb devices
|
||||
```
|
||||
|
||||
An example of output:
|
||||
Example output:
|
||||
|
||||
```text
|
||||
List of devices attached
|
||||
127.0.0.1:<port> device
|
||||
emulator-<four numbers> device
|
||||
127.0.0.1:<port number> device
|
||||
emulator-<four digits> device
|
||||
```
|
||||
|
||||
Use `127.0.0.1:<port>` or `emulator-<four numbers>` as the connection address.
|
||||
Use `127.0.0.1:<port>` or `emulator-<four digits>` as your connection address.
|
||||
|
||||
- Method 2: Find established adb connections
|
||||
- Method 2: Find established ADB connections
|
||||
|
||||
1. Do method 1.
|
||||
2. Press `Win+S` to open the search bar, type `Resource Monitor` and open it.
|
||||
3. Switch to the `Network` tab and look for the emulator process name in the name column of `Listening Port`, such as `HD-Player.exe`.
|
||||
4. Make a note of all listening ports for the emulator process.
|
||||
5. Find `adb.exe` in the name column of `TCP connection`. The port in the remote port column that is consistent with the emulator listening port is the emulator debugging port.
|
||||
1. Follow Method 1.
|
||||
2. Press `Windows key+S` to open search, type `Resource Monitor` and open it.
|
||||
3. Go to the `Network` tab and find the emulator process name in the `Listening Ports` name column, such as `HD-Player.exe`.
|
||||
4. Note all listening ports for the emulator process.
|
||||
5. In the `TCP Connections` name column, find `adb.exe` and identify the remote port matching the emulator's listening port - this is the emulator's debug port.
|
||||
|
||||
:::
|
||||
|
||||
### Automatically Start Multiple Emulators
|
||||
### BlueStacks with Hyper-V port changes on every startup
|
||||
|
||||
- If you need to operate multiple emulators simultaneously, you can copy the MAA folder multiple times, and use **different MAAs**, **the same adb.exe**, and **different connection addresses** to connect.
|
||||
- Taking `BlueStacks International Version` as an example, two ways to start multiple emulators are introduced.
|
||||
In `Connection Settings`, set `Connection Configuration` to `BlueStacks`, then check both `Auto Detect Connection` and `Re-detect Each Time`.
|
||||
|
||||
- Perform multiple operations by attaching commands to `HD-Player.exe`.
|
||||
This should work in most cases. If connection still fails, you may have multiple emulator cores or issues requiring additional settings as explained below.
|
||||
|
||||
1. Start the corresponding emulator separately.
|
||||
2. Open the Task Manager, find the corresponding emulator process, go to the Details tab, right-click the column above, click `Select Columns`, and check `Command Line`.
|
||||
3. In the newly added `Command Line` column, find the content after `"...\Bluestacks_nxt\HD-Player.exe"`.
|
||||
4. Fill in the found content, similar to `--instance Nougat32`, in `Startup Settings` - `Additional Commands`.
|
||||
#### Specifying `Bluestacks.Config.Keyword`
|
||||
|
||||
Note: After the operation is completed, it is recommended to hide the `Command Line` column opened in `Step 2` to prevent freezing.
|
||||
|
||||
- Example:
|
||||
|
||||
```bash
|
||||
Multi-instance 1:
|
||||
Emulator Path: C:\Program Files\BlueStacks_nxt\HD-Player.exe
|
||||
Additional Commands: --instance Nougat32 --cmd launchApp --package "com.hypergryph.arknights"
|
||||
Multi-instance 2:
|
||||
Emulator Path: C:\Program Files\BlueStacks_nxt\HD-Player.exe
|
||||
Additional Commands: --instance Nougat32_1 --cmd launchApp --package "com.hypergryph.arknights.bilibili"
|
||||
```
|
||||
|
||||
The `--cmd launchApp --package` part starts and automatically runs the specified package name application after startup, which can be changed as needed.
|
||||
|
||||
- Perform multi-instance operation by using the shortcut of emulators or apps.
|
||||
|
||||
1. Open the multi-instance manager and add the corresponding emulator's shortcut.
|
||||
2. Fill in the path of the emulator shortcut in `Startup Settings` - `Emulator Path`.
|
||||
|
||||
Note: Some emulators support creating app shortcuts, which can directly launch the emulator and open Arknights with the app shortcut.
|
||||
|
||||
- Example:
|
||||
|
||||
```bash
|
||||
Multi-instance 1:
|
||||
Emulator Path: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\BlueStacks\Multi-instance 1.lnk
|
||||
Multi-instance 2:
|
||||
Emulator Path: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\BlueStacks\Multi-instance 2 - Arknights.lnk
|
||||
```
|
||||
|
||||
If using `Emulator Path` for multi-instance operation, it is recommended to leave `Additional Commands` in `Startup Settings` empty.
|
||||
|
||||
### The port number of BlueStack emulator Hyper-V is different every time it is started
|
||||
|
||||
:::warning
|
||||
TODO: replace these Chinese emulators links with English ones
|
||||
::: info Note
|
||||
If you're using multi-instance or have multiple emulator cores installed, you'll need additional settings to specify which emulator number to use
|
||||
:::
|
||||
|
||||
## Connection Present
|
||||
In `.\config\gui.json`, search for the `Bluestacks.Config.Keyword` field containing `"bst.instance.<emulator number>.status.adb_port"`. Find the emulator number in the `BlueStacks_nxt\Engine` folder in the emulator path.
|
||||
|
||||
You need to select the configuration of the emulator you are using. If it is not in the list, select General Mode. If General Mode is not available please try and select any of the other available presents.
|
||||
::: details Examples
|
||||
Nougat64 core:
|
||||
|
||||
For specific differences, you can read the [source code](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/resource/config.json#L65).
|
||||
```json
|
||||
"Bluestacks.Config.Keyword":"bst.instance.Nougat64.status.adb_port",
|
||||
```
|
||||
|
||||
Pie64_2 core: (the number after the core name indicates a multi-instance core)
|
||||
|
||||
```json
|
||||
"Bluestacks.Config.Keyword": "bst.instance.Pie64_2.status.adb_port",
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
#### Specifying `Bluestacks.Config.Path`
|
||||
|
||||
::: info Note
|
||||
MAA now attempts to read the `bluestacks.conf` storage location from the registry. When this fails, you need to manually specify the configuration file path
|
||||
:::
|
||||
|
||||
1. Find the `bluestacks.conf` file in the BlueStacks data directory
|
||||
|
||||
- International version default: `C:\ProgramData\BlueStacks_nxt\bluestacks.conf`
|
||||
- Chinese version default: `C:\ProgramData\BlueStacks_nxt_cn\bluestacks.conf`
|
||||
|
||||
2. If this is your first time, run MAA once so it automatically generates the configuration file.
|
||||
|
||||
3. **First close** MAA, **then** open `gui.json`, find your current configuration name under `Configurations` (viewable in Settings-Switch Configuration, default is `Default`), search for the `Bluestacks.Config.Path` field, and enter the full path to `bluestacks.conf`. (Note: use escaped backslashes `\\`)
|
||||
|
||||
::: details Example
|
||||
For `C:\ProgramData\BlueStacks_nxt\bluestacks.conf`:
|
||||
|
||||
```json
|
||||
{
|
||||
"Configurations": {
|
||||
"Default": {
|
||||
"Bluestacks.Config.Path": "C:\\ProgramData\\BlueStacks_nxt\\bluestacks.conf"
|
||||
// Other configuration fields, don't manually modify
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
## Connection Configuration
|
||||
|
||||
Select the configuration matching your emulator. If not listed, choose General Configuration. If that doesn't work, try any other available configuration.
|
||||
|
||||
For specific differences, see the [source code](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/resource/config.json#L65).
|
||||
|
||||
### MuMu Screenshot Enhanced Mode
|
||||
|
||||
Only Chinese or Arknights Edition MuMu 12 V4.0.0 and later versions are supported. Global Edition is not supported at this time. <!-- Chinese V3.8.13 -->
|
||||
Requires official or Arknights-specific MuMu V4.1.26 or newer. <!-- Official V3.8.13 supports initial enhanced screenshots -->
|
||||
|
||||
1. Settings → Connection Settings, enable `Enable MuMu's screenshot enhancement mode`. MAA will attempt to automatically fill in the exec path through the registry when the switch is checked.
|
||||
1. In `Settings` - `Connection Settings`, check `Enable MuMu Screenshot Enhanced Mode`. MAA will automatically try to get the installation path from the registry when you check this option.
|
||||
|
||||
2. `MuMu12 Emulator exec path` Fill in the path to the `MuMuPlayer-12.0` or `YXArkNights-12.0` folder. e.g. `C:\Program Files\Netease\MuMuPlayer-12.0`.
|
||||
2. Enter the path to the `MuMu Player` or `MuMuPlayerGlobal-12.0` or `YXArkNights-12.0` folder in `MuMu Installation Path`, e.g., `C:\Program Files\Netease\MuMu Player`.
|
||||
|
||||
3. If using MuMu network bridging, check `MuMu network bridging mode` and manually enter the serial number of the corresponding emulator in MuMu Multi-Instance Manager, such as `0` for the main instance.
|
||||
3. If using MuMu Network Bridge, check `MuMu Network Bridge Mode` and manually enter the number of the corresponding emulator in the MuMu multi-instance manager, such as `0` for the main instance.
|
||||
|
||||
### LD Screenshot Enhanced Mode
|
||||
|
||||
Only Chinese or Global LD Player 9 V9.1.32 and later versions are supported. <!-- Chinese V9.0.78 -->
|
||||
Requires official or international LDPlayer 9 V9.1.32 or newer. <!-- Official V9.0.78 supports initial enhanced screenshots but has high-resolution issues that V9.1.29 fixes -->
|
||||
|
||||
1. Settings → Connection Settings, enable `Enable LD's screenshot enhancement mode`. MAA will attempt to automatically fill in the exec path through the registry when the switch is checked.
|
||||
1. In `Settings` - `Connection Settings`, check `Enable LD Screenshot Enhanced Mode`. MAA will automatically try to get the installation path from the registry when you check this option.
|
||||
|
||||
2. `LD Emulator exec path` Fill in the path to the `LDPlayer9` folder. e.g. `C:\leidian\LDPlayer9\`。
|
||||
2. Enter the path to the `LDPlayer9` folder in `LD Installation Path`, e.g., `C:\leidian\LDPlayer9\`.
|
||||
|
||||
3. `Instance Number` Fill in the serial number (ID) of the corresponding emulator in LD Multiplayer. e.g. `0` for Main Multiplayer.
|
||||
3. Enter the number (ID) of the corresponding emulator in the LDPlayer multi-instance manager in `Instance Number`, such as `0` for the main instance.
|
||||
|
||||
## Touch Mode
|
||||
|
||||
1. [Minitouch](https://github.com/DeviceFarmer/minitouch):An Android touch eventer written in C uses `evdev` to provide a Socket interface for external programs to trigger touch events and gestures. Starting with Android 10, Minitouch no longer works when SELinux is `Enforcing`.<sup>[Source](https://github.com/DeviceFarmer/minitouch?tab=readme-ov-file#for-android-10-and-up)</sup>
|
||||
2. [MaaTouch](https://github.com/MaaAssistantArknights/MaaTouch):A Java-based reimplementation of Minitouch by MAA, which uses Android's `InputDevice`, and added additional features. Availability of higher versions of Android is yet to be tested. ~~Help us do some testing~~
|
||||
3. Adb Input:Directly call ADB to use Android's `input` command to perform touch operations. It has the highest compatibility and the slowest speed.
|
||||
1. [Minitouch](https://github.com/DeviceFarmer/minitouch): An Android touch event handler written in C that operates on `evdev` devices and provides a Socket interface for external programs to trigger touch events and gestures. Starting with Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode.<sup>[source](https://github.com/DeviceFarmer/minitouch?tab=readme-ov-file#for-android-10-and-up)</sup>
|
||||
2. [MaaTouch](https://github.com/MaaAssistantArknights/MaaTouch): MAA's Java reimplementation of Minitouch that uses Android's native `InputDevice` and adds extra features. Compatibility with newer Android versions is still being tested. ~~Help us test it~~
|
||||
3. Adb Input: Directly calls ADB to use Android's `input` command for touch operations. Most compatible but slowest.
|
||||
|
||||
## ADB Lite
|
||||
|
||||
An ADB Client independently implemented by MAA uses TCP to communicate directly with the ADB Server. Compared with the original ADB, it can avoid opening multiple ADB processes continuously and reduce performance overhead, but some screenshot methods are unavailable.<sup>[PR](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/3315)</sup>
|
||||
MAA's independent ADB Client implementation that communicates directly with the ADB Server via TCP. Compared to the original ADB, it avoids constantly launching multiple ADB processes, reducing performance overhead, but some screenshot methods aren't available.<sup>[PR](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/3315)</sup>
|
||||
|
||||
It is recommended to enable it, but the specific advantages and disadvantages need feedback. ~~Help us do some testing x2~~
|
||||
We recommend enabling it, but specific pros and cons need feedback. ~~Help us test it x2~~
|
||||
|
||||
## Running multiple MAA and emulator instances
|
||||
|
||||
::: info How to do it
|
||||
To operate multiple emulators simultaneously, copy the MAA folder multiple times and use **different MAA instances**, **the same adb.exe**, and **different connection addresses** to connect.
|
||||
:::
|
||||
|
||||
### Auto-starting multiple emulator instances
|
||||
|
||||
Using [BlueStacks International](./device/windows.md) as an example, here are two ways to auto-start multiple emulator instances:
|
||||
|
||||
#### Start via additional commands
|
||||
|
||||
1. Launch a single multi-instance emulator.
|
||||
2. Open Task Manager, find the corresponding emulator process, go to the Details tab, right-click the column header, click `Select Columns`, and check `Command line`.
|
||||
3. In the new `Command line` column, find the content after `...\Bluestacks_nxt\HD-Player.exe"`.
|
||||
4. Add the content you found (similar to `--instance Nougat32`) to `Startup Settings` - `Additional Commands`.
|
||||
|
||||
::: note
|
||||
After finishing, we recommend hiding the `Command line` column opened in `Step 2` to prevent slowdowns
|
||||
:::
|
||||
|
||||
::: details Example
|
||||
|
||||
```text
|
||||
Instance 1:
|
||||
Emulator Path: C:\Program Files\BlueStacks_nxt\HD-Player.exe
|
||||
Additional Commands: --instance Nougat32 --cmd launchApp --package "com.hypergryph.arknights"
|
||||
Instance 2:
|
||||
Emulator Path: C:\Program Files\BlueStacks_nxt\HD-Player.exe
|
||||
Additional Commands: --instance Nougat32_1 --cmd launchApp --package "com.hypergryph.arknights.bilibili"
|
||||
```
|
||||
|
||||
The `--cmd launchApp --package` part auto-launches the specified package after startup; modify as needed.
|
||||
:::
|
||||
|
||||
#### Start via emulator shortcuts
|
||||
|
||||
Some emulators support creating application shortcuts that directly launch the emulator and open Arknights.
|
||||
|
||||
1. Open the multi-instance manager and create shortcuts for the corresponding emulators.
|
||||
2. Enter the emulator shortcut path in `Startup Settings` - `Emulator Path`
|
||||
|
||||
::: details Example
|
||||
|
||||
```text
|
||||
Instance 1:
|
||||
Emulator Path: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\BlueStacks\Instance 1.lnk
|
||||
Instance 2:
|
||||
Emulator Path: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\BlueStacks\Instance 2-Arknights.lnk
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
When using `Emulator Path` for multi-instance operation, we recommend leaving `Startup Settings` -
|
||||
|
||||
@@ -3,107 +3,106 @@ order: 4
|
||||
icon: mingcute:android-fill
|
||||
---
|
||||
|
||||
# Android Physical Device
|
||||
# Android Physical Devices
|
||||
|
||||
::: warning
|
||||
This method involves ADB debugging and requires connection to a computer, it is **not recommended** for beginners.
|
||||
This method involves ADB command-line usage, has lower stability, and still requires computer connection. **Not recommended** for beginners.
|
||||
:::
|
||||
|
||||
::: info Note
|
||||
|
||||
0. Please also check [Connection](../connection.md).
|
||||
1. Starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode, please switch to other touch modes or switch SELinux **temporary** to `Permissive` mode.
|
||||
2. Due to the extreme complexity of the Android ecosystem, try to change the `Connection Configuration` in MAA `Settings` - `Connection` to `General Mode` or `Compatibility Mode` or `2nd Resolution` or `General Mode (Blocked exception output)` until one of the modes is working properly.
|
||||
3. Since MAA only supports `16:9` ratio resolutions, devices with non-`16:9` or `9:16` screen ratios will need to be forced to change their resolution, which includes most modern devices. If the connected device has a native `16:9` or `9:16` screen resolution ratio, you can skip the `Change resolution' section. 4.
|
||||
4. Switch your device's navigation method to something other than `Full Screen Gestures`, such as the `Classic Navigation Keys` to avoid misuse.
|
||||
5. Please adjust the `Shaped Screen UI Adaptation` section in the in-game settings to 0 to avoid task errors.
|
||||
0. Please also refer to [Connection Settings](../connection.md).
|
||||
1. Starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode. Please switch to other touch modes, or **temporarily** switch SELinux to `Permissive` mode.
|
||||
2. Due to the extreme complexity of the Android ecosystem, try changing the `Connection Configuration` in MAA `Settings` - `Connection Settings` to `General Mode`, `Compatibility Mode`, `2nd Resolution`, or `General Mode (Block Exception Output)` until one mode works properly.
|
||||
3. Since MAA only supports `16:9` aspect ratios, devices with non-`16:9` or `9:16` screen ratios (including most modern devices) need to have their resolution forcibly changed. If your device's native screen ratio is `16:9` or `9:16`, you can skip the `Change Resolution` section.
|
||||
4. Switch your device's navigation method to something other than `Full Screen Gestures`, such as `Classic Navigation Keys`, to avoid accidental operations.
|
||||
5. Please set the `Notched Screen UI Adaptation` option in the game settings to 0 to avoid task errors.
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Typical `16:9` ratio resolutions are `3840x2160` (4K), `2560x1440` (2K), `1920x1080` (1080P), `1280x720` (720P).
|
||||
Typical `16:9` resolutions include `3840x2160` (4K), `2560x1440` (2K), `1920x1080` (1080P), and `1280x720` (720P).
|
||||
:::
|
||||
|
||||
## Download, run adb debugging tool and connect the device
|
||||
## Download and Run ADB Debug Tool to Connect Device
|
||||
|
||||
1. Download [adb](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) and unzip it.
|
||||
2. Open the extracted folder, clear the address bar and type `cmd` and enter. 3.
|
||||
3. Type `adb` in the command prompt window that pops up, if it gives you a lot of help text in English, it will run successfully.
|
||||
4. Turn on `USB debugging` on your mobile phone, this may be different for each brand of mobile phone, so please use a search engine. Manufacturers may provide additional options for USB debugging, such as `USB Installation` and `USB Debugging (Security Settings)` in MIUI, please enable them at the same time.
|
||||
5. Connect your phone to your computer via data cable and enter the following command in the command prompt window you just got.
|
||||
1. Download [ADB](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) and extract it.
|
||||
2. Open the extracted folder, clear the address bar, type `cmd`, and press Enter.
|
||||
3. In the command prompt window that appears, type `adb`. If you see extensive help text, the command ran successfully.
|
||||
4. Enable `USB Debugging` on your phone. The process varies by manufacturer, so use a search engine to find instructions. Manufacturers may provide additional USB debugging options, such as MIUI's `USB Installation` and `USB Debugging (Security Settings)` - enable these too.
|
||||
5. Connect your phone to the computer with a data cable and enter the following command in the command prompt:
|
||||
|
||||
```bash
|
||||
adb devices
|
||||
```
|
||||
|
||||
- If executed successfully, it will give you a message that the ``USB debugging`` device is connected.
|
||||
- When executed successfully, it will show connected USB debugging devices.
|
||||
|
||||
- Example of a successful connection:
|
||||
|
||||
```bash
|
||||
List of devices attached
|
||||
VFNDU1682100xxxx device
|
||||
VFNDU1682100xxxx device
|
||||
```
|
||||
|
||||
- **The alphanumeric combination in front of `device` is the serial number of the device, which also serves as the `connection address` of the MAA.**
|
||||
- **The alphanumeric combination before `device` is the device serial number, which is also your MAA `Connection Address`.**
|
||||
|
||||
- For modern Android devices to perform `USB debugging`, you need to click the pop-up window on the debugged device to authorise it, if not authorised, the example is as follows:
|
||||
- Modern Android devices require authorization on the device itself. Without authorization, you'll see:
|
||||
|
||||
```bash
|
||||
List of devices attached
|
||||
VFNDU1682100xxxx unauthorized
|
||||
Unauthorised
|
||||
VFNDU1682100xxxx unauthorized
|
||||
```
|
||||
|
||||
- If you are prompted for unauthorised or the serial number of the device shows `offline`, you need to reboot the device and computer and try again. If the problem is still not solved, you can delete the `.android` folder under the current user's personal folder and reboot again to retry, please search for the exact location.
|
||||
- If you consistently get "unauthorized" or "offline" status, restart both your device and computer. If that doesn't help, delete the `.android` folder in your user's personal directory and try again after restarting. Use search to find the exact location.
|
||||
|
||||
## Change resolution
|
||||
## Change Resolution
|
||||
|
||||
::: tip
|
||||
Mobile phone screen resolution is `short side*long side`, not `long side*short side` of computer monitor. Please determine the exact value according to your target device.
|
||||
Mobile screen resolution is specified as `short edge × long edge`, not `long edge × short edge` as with computer monitors. Determine the appropriate values for your specific device.
|
||||
:::
|
||||
|
||||
- If there is only one device within the device list above, you can change/restore the resolution directly by running the following command.
|
||||
- If you only have one device in your device list, run these commands to change/restore resolution:
|
||||
|
||||
```bash
|
||||
# View current resolution
|
||||
adb shell wm size
|
||||
# Restore the default resolution
|
||||
# Restore default resolution
|
||||
adb shell wm size reset
|
||||
|
||||
# Change resolution to 720p
|
||||
# Change to 720p
|
||||
adb shell wm size 720x1280
|
||||
# Change resolution to 1080p
|
||||
# Change to 1080p
|
||||
adb shell wm size 1080x1920
|
||||
```
|
||||
|
||||
- If there are multiple devices, you need to add the parameter `-s <target device serial number>` between `adb` and `shell`, as shown in the following example.
|
||||
- If you have multiple devices, add the parameter `-s <target device serial number>` between `adb` and `shell`:
|
||||
|
||||
```bash
|
||||
# View current resolution
|
||||
adb -s VFNDU1682100xxxx shell wm size
|
||||
# Restore the default resolution
|
||||
# Restore default resolution
|
||||
adb -s VFNDU1682100xxxx shell wm size reset
|
||||
|
||||
# Change resolution to 720p
|
||||
# Change to 720p
|
||||
adb -s VFNDU1682100xxxx shell wm size 720x1280
|
||||
# Change resolution to 1080p
|
||||
# Change to 1080p
|
||||
adb -s VFNDU1682100xxxx shell wm size 1080x1920
|
||||
```
|
||||
|
||||
- Some applications with irregular design may still have wrong layout after restoring the resolution, usually restarting the corresponding application or device can solve the problem.
|
||||
- Some apps with irregular designs may still have layout issues after resolution restoration. Usually, restarting the app or device resolves this.
|
||||
|
||||
::: danger Warning
|
||||
It is strongly recommended to restore the resolution **before** restarting the device next time, otherwise it may lead to unpredictable consequences depending on the device, ~~including but not limited to chaotic layout, touch misalignment, application flashback, unlocking, etc~~.
|
||||
Strongly recommended to restore the default resolution **before** restarting your device. Otherwise, depending on your device, unpredictable consequences may occur, ~~including layout chaos, touch misalignment, app crashes, inability to unlock, etc~~.
|
||||
:::
|
||||
|
||||
## Automating resolution changes
|
||||
## Automate Resolution Changes
|
||||
|
||||
1. Create two new text files in the MAA directory and fill them with the following contents.
|
||||
1. Create two text files in the MAA directory with the following content:
|
||||
|
||||
```bash
|
||||
# Adjust resolution to 1080p
|
||||
adb -s <target device serial number> shell wm size 1080x1920
|
||||
# Reduce screen brightness (optional)
|
||||
# Lower screen brightness (optional)
|
||||
adb -s <target device serial number> shell settings put system screen_brightness 1
|
||||
```
|
||||
|
||||
@@ -112,69 +111,69 @@ It is strongly recommended to restore the resolution **before** restarting the d
|
||||
adb -s <target device serial number> shell wm size reset
|
||||
# Increase screen brightness (optional)
|
||||
adb -s <target device serial number> shell settings put system screen_brightness 20
|
||||
# Return to desktop (optional)
|
||||
# Return to home screen (optional)
|
||||
adb -s <target device serial number> shell input keyevent 3
|
||||
# Lock screen (optional)
|
||||
adb -s <target device serial number> shell input keyevent 26
|
||||
```
|
||||
|
||||
2. Rename the first file to `startup.bat` and the second file to `finish.bat`.
|
||||
2. Rename the first file to `startup.bat` and the second to `finish.bat`.
|
||||
|
||||
- If you don't see the double confirmation dialogue box for changing extension after renaming, and the file icon doesn't change, please search for "How to display file extensions in Windows".
|
||||
- If no confirmation dialog appears when changing the extension and the file icon doesn't change, search for "How to show file extensions in Windows."
|
||||
|
||||
3. In `Settings` - `Connection` - `Starts with Script` and `Ends with Script` of MAA, fill in `startup.bat` and `finish.bat` respectively.
|
||||
3. In MAA's `Settings` - `Connection Settings`, set `Start Script` to `startup.bat` and `End Script` to `finish.bat`.
|
||||
|
||||
## Connecting to MAA
|
||||
## Connect to MAA
|
||||
|
||||
### Wired connection
|
||||
### Wired Connection
|
||||
|
||||
::: tip
|
||||
A wired connection does not require any IP address or port, only the device serial number given by `adb devices`.
|
||||
Wired connections don't need IP addresses or ports - just the device serial number from `adb devices`.
|
||||
:::
|
||||
|
||||
1. Fill in the MAA `Settings` - `Connection` - `Connection address` with the serial number of the target device obtained above.
|
||||
1. Enter the target device serial number from above into MAA's `Settings` - `Connection Settings` - `Connection Address`.
|
||||
2. Link Start!
|
||||
|
||||
### Wireless Connection
|
||||
|
||||
- Make sure that the device and the computer are on the same LAN and can communicate with each other. Settings such as `AP Isolation`, `Guest Network`, etc. can prevent communication between devices, please refer to the documentation of the corresponding router.
|
||||
- Wireless debugging is disabled after a device reboot and needs to be reset.
|
||||
- Ensure your device and computer are on the same network and can communicate with each other. Router settings like `AP Isolation` or `Guest Network` can block device communication - check your router documentation.
|
||||
- Wireless debugging is disabled after device restart and must be re-enabled.
|
||||
|
||||
#### To open a wireless port using `adb tcpip`
|
||||
#### Using `adb tcpip` for Wireless Debugging
|
||||
|
||||
1. Enable wireless debugging by entering the following command in the command prompt window you just opened.
|
||||
1. In the command prompt, enable wireless debugging:
|
||||
|
||||
```bash
|
||||
adb tcpip 5555
|
||||
# Add the -s parameter to specify the serial number if multiple devices are present.
|
||||
# Add -s parameter to specify the serial number if multiple devices are connected
|
||||
```
|
||||
|
||||
2. View the device IP address.
|
||||
2. Find your device's IP address:
|
||||
|
||||
- Go to `Settings` - `WLAN` on your mobile phone and click on the currently connected wireless network to view the IP address.
|
||||
- The IP address is different for different brands of devices, so please find it yourself.
|
||||
- Go to your phone's `Settings` - `Wi-Fi`, tap the connected network to view the IP address.
|
||||
- The location varies by manufacturer - search for instructions if needed.
|
||||
|
||||
3. Put `<IP>:5555` into MAA `Settings` - `Connection` - `Connection Address`, such as `192.168.1.2:5555`.
|
||||
3. Enter `<IP>:5555` in MAA's `Settings` - `Connection Settings` - `Connection Address`, e.g., `192.168.1.2:5555`.
|
||||
4. Link Start!
|
||||
|
||||
#### Use `adb pair` to open the wireless port
|
||||
#### Using `adb pair` for Wireless Debugging
|
||||
|
||||
::: tip
|
||||
`adb pair` wireless pairing, i.e. connecting after pairing using `wireless debugging` in Developer Options on Android 11 and newer, avoids the need for a wired connection compared to `adb tcpip`.
|
||||
`adb pair` wireless pairing (available in Android 11 and later via Developer Options) allows connection without a physical USB connection, unlike `adb tcpip`.
|
||||
:::
|
||||
|
||||
1. Go to your phone's developer options, tap `Wireless debugging` and turn it on, tap OK, tap `Pair device using pairing code` and don't close the pop-up window that appears until pairing is complete. 2.
|
||||
1. On your phone, go to Developer Options, tap `Wireless Debugging` and enable it. Tap `Pair device with pairing code` and keep the popup open until pairing completes.
|
||||
|
||||
2. To perform pairing.
|
||||
2. Complete the pairing:
|
||||
|
||||
1. At the command prompt, type `adb pair <IP address and port given in the device pop-up>` and enter.
|
||||
2. Type `<six-digit pairing code given in the device pop-up window>` and enter.
|
||||
3. The window appears with something like `Successfully paired to <IP:port>` and the pop-up window on the device disappears automatically, and the computer name appears at the bottom in the paired devices.
|
||||
1. In the command prompt, type `adb pair <IP address and port shown in the device popup>` and press Enter.
|
||||
2. Enter the six-digit pairing code from the device popup and press Enter.
|
||||
3. When you see `Successfully paired to <IP:port>`, the device popup will close automatically, and your computer's name will appear in the paired devices list.
|
||||
|
||||
3. Put the `<IP address and port>` given on the current device's screen into MAA `Settings` - `Connection` - `Connection Address`, e.g. `192.168.1.2:11451`, **must be different from the one you have just put in**.
|
||||
3. Enter the IP address and port shown on your device screen into MAA's `Settings` - `Connection Settings` - `Connection Address`, e.g., `192.168.1.2:11451`. **This is different from the address used for pairing**.
|
||||
4. Link Start!
|
||||
|
||||
#### Enable the wireless port with root privileges
|
||||
#### Using Root to Enable Wireless ADB
|
||||
|
||||
~~If you have access to root, why do you need to read this document~~
|
||||
|
||||
|
||||
@@ -3,142 +3,146 @@ order: 3
|
||||
icon: teenyicons:linux-alt-solid
|
||||
---
|
||||
|
||||
# Linux Emulator and Container
|
||||
# Linux Emulators and Containers
|
||||
|
||||
## Preparation
|
||||
|
||||
You can choose one of the following installation methods:
|
||||
Choose one of the following installation methods:
|
||||
|
||||
### Use maa-cli
|
||||
### Using maa-cli
|
||||
|
||||
[maa-cli](https://github.com/MaaAssistantArknights/maa-cli) is a simple CLI for MAA made with Rust. Please read installation and usage tutorials in [User Guide for CLI](../cli/).
|
||||
[maa-cli](https://github.com/MaaAssistantArknights/maa-cli) is a simple command-line tool for MAA written in Rust. Please read the [CLI User Guide](../cli/) for installation and usage instructions.
|
||||
|
||||
### Use Wine
|
||||
### Using Wine
|
||||
|
||||
The MAA WPF GUI can currently be run using Wine.
|
||||
The MAA WPF GUI can currently be run through Wine.
|
||||
|
||||
#### Installation Steps
|
||||
|
||||
1. Go to the [.NET Release Page](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) to download and install the .NET **Desktop** Runtime for Windows.
|
||||
1. Go to the [.NET download page](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) and download/install the Windows version of .NET **Desktop** Runtime.
|
||||
|
||||
2. Download MAA for Windows, unzip it and run `wine MAA.exe`.
|
||||
2. Download the Windows version of MAA, extract it, and run `wine MAA.exe`.
|
||||
|
||||
::: info Note
|
||||
You need to set the ADB path to [`adb.exe` for Windows](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) in the connection settings.
|
||||
You need to set the ADB path to the [Windows version of `adb.exe`](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) in the connection settings.
|
||||
|
||||
If you need to connect to USB devices via ADB, please run `adb start-server` outside of Wine first, i.e. connect to the native ADB server via Wine.
|
||||
If you need to connect to USB devices via ADB, first run `adb start-server` outside of Wine to connect to the native ADB server through Wine.
|
||||
:::
|
||||
|
||||
#### Use Linux native MaaCore (experimental feature)
|
||||
#### Using Linux Native MaaCore (Experimental)
|
||||
|
||||
Download the [MAA Wine Bridge](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/src/MaaWineBridge) source and build it, replace the Windows version with the generated `MaaCore.dll` (ELF file) in the same directory as the Linux native dynamic libraries (`libMaaCore.so` and dependencies).
|
||||
Download and build the [MAA Wine Bridge](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/src/MaaWineBridge) source code, replace the Windows version with the generated `MaaCore.dll` (ELF file), and place the Linux native dynamic libraries (`libMaaCore.so` and dependencies) in the same directory.
|
||||
|
||||
Running `MAA.exe` through Wine will load the Linux native libraries.
|
||||
When running `MAA.exe` through Wine, it will load the Linux native libraries.
|
||||
|
||||
::: info Note
|
||||
To use Linux native MaaCore, you need to set the ADB path to Linux native ADB in the connection settings.
|
||||
When using the Linux native MaaCore, you need to set the ADB path to the Linux native ADB in the connection settings.
|
||||
:::
|
||||
|
||||
#### Linux Desktop Integration (experimental feature)
|
||||
#### Linux Desktop Integration (Experimental)
|
||||
|
||||
Desktop integration provides native desktop notification support and the ability to map fontconfig font configurations to WPF.
|
||||
Desktop integration provides native desktop notification support and maps fontconfig font configurations to WPF.
|
||||
|
||||
Enable it by placing `MaaDesktopIntegration.so` generated by MAA Wine Bridge in the same directory as `MAA.exe`.
|
||||
Place the `MaaDesktopIntegration.so` generated by MAA Wine Bridge in the same directory as `MAA.exe` to enable this feature.
|
||||
|
||||
#### Known Issues
|
||||
|
||||
- Wine DirectWrite forces hinting to be enabled and does not pass DPI to FreeType, resulting in poor font display.
|
||||
- When not using native desktop notifications, the popup notification will grab the system-wide mouse focus, making it impossible to operate other windows. This can be mitigated by enabling virtual desktop mode via `winecfg`, or disabling desktop notifications.
|
||||
- Wine-staging users need to disable the `Hide Wine Version` option in `winecfg` in order for MAA to properly detect the Wine environment.
|
||||
- Wine's Light theme causes some text colours in WPF to be abnormal, it is recommended to switch to no theme (Windows Classic theme) in `winecfg`.
|
||||
- Wine uses the old XEmbed tray icon, which may not work properly under GNOME.
|
||||
- Auto-update is not supported when using Linux native MaaCore (~~Updater: I think I should download a Windows version~~).
|
||||
- Wine DirectWrite forces hinting and doesn't pass DPI to FreeType, resulting in poor font display.
|
||||
- When not using native desktop notifications, popup notifications grab the system-wide mouse focus, making it impossible to interact with other windows. You can mitigate this by enabling virtual desktop mode in `winecfg` or disabling desktop notifications.
|
||||
- Wine-staging users need to disable the `Hide Wine version` option in `winecfg` for MAA to correctly detect the Wine environment.
|
||||
- Wine's Light theme causes text color issues in WPF. We recommend using no theme (Windows Classic theme) in `winecfg`.
|
||||
- Wine uses the old XEmbed tray icon system, which may not work properly under GNOME.
|
||||
- When using Linux native MaaCore, automatic updates are not supported (~~the updater thinks: I should download a Windows version~~)
|
||||
|
||||
### Use Python
|
||||
### Using Python
|
||||
|
||||
#### 1. Installing dynamic library
|
||||
#### 1. Installing MAA Dynamic Library
|
||||
|
||||
1. Download and extract `Linux library` in [MAA Website](https://maa.plus/), or install from linux software repository:
|
||||
1. Download and extract the Linux dynamic library from the [MAA website](https://maa.plus/), or install from a software repository:
|
||||
|
||||
- AUR:[maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights), edit the script according to the post-install instruction.
|
||||
- AUR: [maa-assistant-arknights](https://aur.archlinux.org/packages/maa-assistant-arknights), follow the post-installation instructions
|
||||
- Nixpkgs: [maa-assistant-arknights](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)
|
||||
|
||||
2. Open `sample.py` in `./MAA-v{VERSION}-linux-{ARCH}/Python/`
|
||||
2. Navigate to `./MAA-v{version}-linux-{architecture}/Python/` and open the `sample.py` file
|
||||
|
||||
> **Note**
|
||||
> The precompiled version is built in a relatively new distro (Ubuntu 22.04), you may run into binary compatability problem, if libstdc++ in your environment is too old.
|
||||
> Where you should reference to [Linux tutorial](../../develop/linux-tutorial.md), or run inside a container instead.
|
||||
::: tip
|
||||
The precompiled version includes dynamic libraries compiled on relatively new Linux distributions (Ubuntu 22.04). If your system has an older libstdc++ version, you might encounter ABI incompatibility issues.
|
||||
You can refer to the [Linux Compilation Tutorial](../../develop/linux-tutorial.md) to recompile or use a container solution.
|
||||
:::
|
||||
|
||||
#### 2. `adb` Settings
|
||||
#### 2. ADB Configuration
|
||||
|
||||
1. Target to [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L48)
|
||||
1. Find the line [`if asst.connect('adb.exe', '127.0.0.1:5554'):`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/b4fc3528decd6777441a8aca684c22d35d2b2574/src/Python/sample.py#L62)
|
||||
|
||||
2. `adb` Tools Settings
|
||||
2. ADB Tool Configuration
|
||||
|
||||
- If you use `avd` in `Android Studio` as your emulator, it contains `adb` that you can use it directly. Just fill in your `adb` path in `adb.exe`, you can usually find it in `$HOME/Android/Sdk/platform-tools/` , eg.:
|
||||
- If using `Android Studio`'s `AVD` emulator, it comes with ADB. You can directly specify the ADB path to replace `adb.exe`, typically found in `$HOME/Android/Sdk/platform-tools/`, for example:
|
||||
|
||||
```python
|
||||
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "avd_ID"):
|
||||
```
|
||||
```python
|
||||
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator's ADB address"):
|
||||
```
|
||||
|
||||
- If you use other emulators, you have to install `adb` first: `$ sudo apt install adb` and then fill in the path of adb or just fill in `adb` if you had put it into the `PATH` environment variable.
|
||||
- For other emulators, first install ADB: `$ sudo apt install adb`, then either specify the path or simply use `adb` if it's in your `PATH` environment variable.
|
||||
|
||||
3. Emulator `adb` ID Settings
|
||||
3. Getting the Emulator's ADB Address
|
||||
|
||||
- You can use the adb tool directly: `$ ${adb_path} devices` , eg.:
|
||||
- Use the ADB tool directly: `$ adb_path devices`, for example:
|
||||
|
||||
```shell
|
||||
$ /home/foo/Android/Sdk/platform-tools/adb devices
|
||||
List of devices attached
|
||||
emulator-5554 device
|
||||
```
|
||||
```shell
|
||||
$ /home/foo/Android/Sdk/platform-tools/adb devices
|
||||
List of devices attached
|
||||
emulator-5554 device
|
||||
```
|
||||
|
||||
- `emulator-5554` that the terminal returns is the ID of emulator adb, replacing `127.0.0.1:5555` with it, eg.:
|
||||
- The returned `emulator-5554` is the emulator's ADB address. Replace `127.0.0.1:5555` with it, for example:
|
||||
|
||||
```python
|
||||
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
|
||||
```
|
||||
```python
|
||||
if asst.connect("/home/foo/Android/Sdk/platform-tools/adb", "emulator-5554"):
|
||||
```
|
||||
|
||||
4. Now you can test: `$ python3 sample.py` , if return `连接成功` , you almost finish setting.
|
||||
4. Now you can test with `$ python3 sample.py`. If it returns "Connection successful," you're ready to proceed.
|
||||
|
||||
#### 3. Tasks Settings
|
||||
#### 3. Task Configuration
|
||||
|
||||
Customizing tasks: Reference to [AsstAppendTask](../../protocol/integration.md#asstappendtask) and modify [`# 任务及参数请参考 docs/集成文档.md`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) section in `sample.py`.
|
||||
Custom tasks: Refer to the [Integration Documentation](../../protocol/integration.md) and modify the [`# Task parameters can be found in docs/integration.md`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/722f0ddd4765715199a5dc90ea1bec2940322344/src/Python/sample.py#L54) section in `sample.py`
|
||||
|
||||
## Emulator Supports
|
||||
## Emulator Support
|
||||
|
||||
### ✅ [AVD](https://developer.android.com/studio/run/managing-avds)
|
||||
|
||||
Requests: Resolution should be 16:9 and above 720p
|
||||
Requirements: 16:9 screen resolution larger than 720p
|
||||
|
||||
Recommendation: x86\_64 architecture (R - 30 - x86\_64 - Android 11.0) with `Linux x64 动态库` in MAA
|
||||
Recommended configuration: x86_64 architecture (R - 30 - x86_64 - Android 11.0) with MAA's Linux x64 dynamic library
|
||||
|
||||
Note: Starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode. Please switch to other touch modes, or **temporarily** switch SELinux to `Permissive` mode.
|
||||
|
||||
### ⚠️ [Genymotion](https://www.genymotion.com/)
|
||||
|
||||
Native x86\_64 architecture in high version of Android, light weight but easy to crash when running Arknights.
|
||||
High Android versions include x86_64 framework. Lightweight but tends to crash when running Arknights.
|
||||
|
||||
We have not testing strictly, but adb functions and path have no error.
|
||||
Not thoroughly tested yet, but ADB functionality and path retrieval work without issues.
|
||||
|
||||
## Containerized Android
|
||||
## Containerized Android Support
|
||||
|
||||
> **Note**
|
||||
> The following solutions are likely to depend on special kernel modules, make sure to have them installed accordingly.
|
||||
::: tip
|
||||
The following solutions typically require specific kernel modules. Please install the appropriate modules according to your distribution and the particular solution.
|
||||
:::
|
||||
|
||||
### ✅ [Waydroid](https://waydro.id/)
|
||||
|
||||
Need to reset the resolution to 16:9 (You can set it above 720P):
|
||||
After installation, you need to reset the resolution (to 16:9 ratio and greater than 720p, then restart):
|
||||
|
||||
```shell
|
||||
waydroid prop set persist.waydroid.width 1280
|
||||
waydroid prop set persist.waydroid.height 720
|
||||
```
|
||||
|
||||
After restarting, record `IP address` in `Setting` - `About phone` , fill `${IP address}:5555` to the adb IP address in `sample.py` .
|
||||
To set up ADB IP address: Go to `Settings` - `About` - `IP address`, note the first `IP`, and use `${recorded IP}:5555` in `sample.py` for the ADB IP.
|
||||
|
||||
If you are using amdgpu, `screencap` command may write messages to stderr, causing image decoding error.
|
||||
Run `adb exec-out screencap | xxd | head` to check if there is something like `/vendor/etc/hwdata/amdgpu.ids: No such file...` in the output.
|
||||
Modify screencap commands in `resource/config.json` from `adb exec-out screencap` to `adb exec-out 'screencap 2>/dev/null'` as a workaround.
|
||||
If using amdgpu, the `screencap` command might output messages to stderr, causing image decoding failures.
|
||||
You can run `adb exec-out screencap | xxd | head` and check if there's text like `/vendor/etc/hwdata/amdgpu.ids: No such file...` in the output.
|
||||
If present, try changing the screenshot command in `resource/config.json` from `adb exec-out screencap` to `adb exec-out 'screencap 2>/dev/null'`.
|
||||
|
||||
### ✅ [redroid](https://github.com/remote-android/redroid-doc)
|
||||
|
||||
Arknights runs properly in Android 11 image. Do remember to expose port 5555 for adb.
|
||||
Android 11 version images can run the game normally. Make sure to expose port 5555 for ADB.
|
||||
|
||||
@@ -3,62 +3,62 @@ order: 2
|
||||
icon: basil:apple-solid
|
||||
---
|
||||
|
||||
# Mac Emulator
|
||||
# macOS Emulators
|
||||
|
||||
## Apple Silicon Chips
|
||||
|
||||
### ✅ [PlayCover](https://playcover.io) (The software runs most fluently for its nativity 🚀)
|
||||
### ✅ [PlayCover](https://playcover.io) (Runs most fluently as it's native 🚀)
|
||||
|
||||
Compatible in beta, plz submit issue marked with `MacOS` when encounter errors.
|
||||
Experimental support. Please submit issues if you encounter problems, and include `MacOS` in the title.
|
||||
|
||||
P.S.: For the reason of `MacOS` mechanism itself, errors might occur when `PlayCover` is minimized and you switch to others windows. The errors of screenshot might crash `MAA`. Reference 👉🏻️[issue](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/4371#issuecomment-1527977512)
|
||||
Note: Due to macOS system limitations, screenshot issues may occur when minimizing the game window, switching to other windows while in Stage Manager, or moving the window to other desktops/screens. Related issue: [#4371](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/4371#issuecomment-1527977512)
|
||||
|
||||
1. Requests: MAA version above v4.13.0-rc.1
|
||||
0. Requirements: MAA version v4.13.0-rc.1 or newer
|
||||
|
||||
2. Download and install [fork version of PlayCover](https://github.com/hguandl/PlayCover/releases)
|
||||
1. Download and install the [forked version of PlayCover](https://github.com/hguandl/PlayCover/releases).
|
||||
|
||||
3. Download [decrypted version of Arknights](https://decrypt.day/app/id1454663939), and then install in PlayCover.
|
||||
2. Download the [decrypted Arknights client package](https://decrypt.day/app/id1454663939) and install it in PlayCover.
|
||||
|
||||
4. Right-click Arknights in PlayCover, choose `Setting` - `Jailbreak Bypass`, enable `Enable PlayChain`, `Enable Jailbreak Bypass (Alpha)`, `Insert Introspection Library`, `MaaTools`, then click `OK`.
|
||||
3. Right-click on Arknights in PlayCover, select `Settings` - `Bypasses`, check `Enable PlayChain`, `Enable Jailbreak Detection Bypass`, `Insert Introspection Libraries`, `MaaTools`, then click `OK`.
|
||||
|
||||
5. Relaunch Arknights, `[localhost:${port number}]` will appear above, meaning launching is successful.
|
||||
4. Now launch Arknights, which should run normally. The title bar will end with `[localhost:port]`, indicating successful activation.
|
||||
|
||||
6. In MAA, click `Settings` - `Connection Settings`, `Minitouch` choose `MacPlayTools`. `Connection Address` filling the content in `[]` .
|
||||
5. In MAA, go to `Settings` - `Connection Settings`, set `Touch Mode` to `MacPlayTools`. For `Connection Address`, enter the content inside the `[]` from the title bar.
|
||||
|
||||
7. Finish, MAA is able to build connection. If errors occur in image recognition, you could try to set resolution to 1080P in PlayCover.
|
||||
6. Setup complete! MAA should now connect successfully. If you encounter image recognition errors, try setting the resolution to 1080P in PlayCover.
|
||||
|
||||
8. 3-5 do not need to be repeated, you could just launch Arknights after that. While you have to repeat step 2 if Arknights is updated.
|
||||
7. Steps 3-5 only need to be done once. After that, just launch Arknights. After each Arknights client update, you'll need to repeat step 2.
|
||||
|
||||
### ✅ [MuMu Emulator Pro](https://mumu.163.com/mac/)
|
||||
|
||||
Supported, but less thoroughly tested. Requires using a touch mode other than `MacPlayTools`. Related issue: [#8098](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8098)
|
||||
|
||||
### ✅ [AVD](https://developer.android.com/studio/run/managing-avds)
|
||||
|
||||
Compatible
|
||||
Supported, but starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode. Please switch to other touch modes, or **temporarily** switch SELinux to `Permissive` mode.
|
||||
|
||||
### ✅ [BlueStacks Air](https://www.bluestacks.com/mac) (Free, optimized for Apple M-series chips)
|
||||
|
||||
Supported, tested, and can be connected via maatouch at `127.0.0.1:5555`.
|
||||
Supported and tested. Can be connected using MaaTouch via `127.0.0.1:5555`.
|
||||
|
||||
You need to enable **"Android Debugging (ADB)"** in the emulator's **`Settings`** - **`Advanced`** section.
|
||||
You need to enable `Android Debugging (ADB)` in the emulator's `Settings` - `Advanced` section.
|
||||
|
||||
## Intel Chips
|
||||
|
||||
::: tip
|
||||
Due to a lack of manpower for Mac version development, updates are relatively slower. It is recommended to use Mac's built-in multi-system feature to install Windows and use the Windows version of MAA.
|
||||
Due to limited development resources for the Mac version, updates are relatively slower. We recommend using Boot Camp to install Windows and using the Windows version of MAA instead.
|
||||
:::
|
||||
|
||||
### ✅ [Bluestacks-CN 5](https://www.bluestacks.cn/)
|
||||
### ✅ [BlueStacks](https://www.bluestacks.com/)
|
||||
|
||||
Fully compatible. Need to turn on `Settings` - `Engine Settings` - `Allow ADB connection`.
|
||||
Fully compatible. You need to enable `Android Debug Bridge` in the emulator's `Settings` - `Advanced`.
|
||||
|
||||
### ✅ [Bluestacks 5](https://www.bluestacks.com/tw/index.html)
|
||||
|
||||
Fully compatible. Need to turn on `Settings` - `Advanced` - `Android Debug Bridge`.
|
||||
|
||||
### ✅ [Nox](https://www.yeshen.com/)
|
||||
### ✅ [Nox Player](https://www.bignox.com/)
|
||||
|
||||
Fully compatible.
|
||||
|
||||
P.S.: Nox adb bin file path in Mac is `/Applications/NoxAppPlayer.app/Contents/MacOS/adb` , in parent path `MacOS` you are able to use `adb devices` command to get adb path.
|
||||
Note: On macOS, the Nox ADB binary is located at `/Applications/NoxAppPlayer.app/Contents/MacOS/adb`. In the `MacOS` parent directory, you can use the `adb devices` command to check the ADB port.
|
||||
|
||||
### ✅ [AVD](https://developer.android.com/studio/run/managing-avds)
|
||||
|
||||
Compatible.
|
||||
Supported, but starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode. Please switch to other touch modes, or **temporarily** switch SELinux to `Permissive` mode.
|
||||
|
||||
@@ -3,13 +3,9 @@ order: 1
|
||||
icon: ri:windows-fill
|
||||
---
|
||||
|
||||
# Windows Emulator
|
||||
# Windows Emulators
|
||||
|
||||
:::warning
|
||||
TODO: replace these Chinese emulators links with English ones
|
||||
:::
|
||||
|
||||
The following emulators are displayed randomly in no particular order.
|
||||
The following emulators are displayed in random order with no particular ranking.
|
||||
|
||||
<script setup>
|
||||
import MarkdownIt from 'markdown-it'
|
||||
@@ -25,29 +21,29 @@ const shuffleArray = (array) => {
|
||||
|
||||
const fullySupport = shuffleArray([
|
||||
{
|
||||
name: 'Bluestacks 5',
|
||||
name: 'BlueStacks 5',
|
||||
link: 'https://www.bluestacks.com/',
|
||||
note: 'Fully compatible. Need to turn on ADB Connectivity in the emulator `Settings` → `Advanced` → `Android Debug Bridge` → `Enable`. Known to be compatible with Hyper-V.\n\n- Recommended to download [Offline Installer](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer) to avoid slow and bundled installation; recommend installing [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) version; to uninstall it, please use the official [Uninstall Tool](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC) to get rid of the residue.\n- If the adb port number keeps changing irregularly and is different every time you start it, it may be because your computer has [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11) enabled. MAA will now try to automatically read the port number within the Blue Stacker emulator configuration file, if this does not work/you have a need to multi-open/have more than one emulator kernel installed, please refer to the [Connection (TODO)](../connection.html#the-port-number-of-bluestack-emulator-hyper-v-is-different-every-time-it-is-started) to make changes. Since Hyper-V runs as administrator, operations that don\'t involve adb such as auto-shutdown of the emulator, auto-detect connection, etc. also need to run MAA as administrator.',
|
||||
note: 'Fully compatible. Need to turn on ADB Connectivity in the emulator `Settings` → `Advanced` → `Android Debug Bridge` → `Enable`. Known to be compatible with Hyper-V.\n\n- Recommended to download [Offline Installer](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer) to avoid slow and bundled installation; recommend installing [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) version; to uninstall it, please use the official [Uninstall Tool](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC) to get rid of residues.\n- If the ADB port number keeps changing irregularly and is different every time you start it, it may be because your computer has [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11) enabled. MAA will now try to automatically read the port number from the BlueStacks emulator configuration file. If this doesn\'t work, or you need to use multiple instances, or have installed multiple emulator cores, please refer to [Connection Settings](../connection.html#bluestacks-emulator-hyper-v-port-number-changes-every-startup) to make adjustments. Since Hyper-V runs as administrator, operations that don\'t involve ADB such as automatic emulator shutdown or connection detection also need MAA to run as administrator.',
|
||||
},
|
||||
{
|
||||
name: 'MuMu Emulator 12',
|
||||
link: 'https://mumu.163.com/',
|
||||
note: 'Fully compatible, with additional support for the [Screenshot Enhanced Mode](../connection.html#mumu-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- The "Exit emulator when done" function may occasionally be abnormal, if you encounter it, please contact MuMu official for feedback.\n- You need to check the port information of the corresponding instance through the ADB button of MuMu 12 Multiple Opener when you open more than one instance, and change the port number of the connection address in MAA `Settings` - `Connection Settings` to the corresponding port.',
|
||||
name: 'MuMu Emulator',
|
||||
link: 'https://www.mumuglobal.com/',
|
||||
note: 'Fully compatible, with additional support for [Screenshot Enhanced Mode](../connection.html#mumu-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- The "Exit emulator when done" function may occasionally have issues. If you encounter problems, please report them to MuMu\'s official support.\n- When running multiple instances, you need to check the port information of each instance through the ADB button in MuMu Multi-Instance Manager, then change the port number in MAA `Settings` - `Connection Settings` to match the corresponding port.',
|
||||
},
|
||||
{
|
||||
name: 'LDPlayer',
|
||||
link: 'https://www.ldmnq.com/',
|
||||
note: 'Fully compatible, with additional support for the [Screenshot Enhanced Mode](../connection.html#ld-screenshot-enhanced-mode). Need to turn on ADB Connectivity in the emulator : `Settings` → `Others` → `ADB debugging` → `Enable local connection`. Known to be compatible with Hyper-V.\n\n- LDPlayer 9 installer will automatically and silently disable Hyper-V during the installation process. Please pay attention if you have related needs.',
|
||||
link: 'https://www.ldplayer.net/',
|
||||
note: 'Fully compatible, with additional support for [Screenshot Enhanced Mode](../connection.html#ld-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- LDPlayer 9 installer will automatically and silently disable Hyper-V during the installation process. Please be aware of this if you need Hyper-V for other purposes.',
|
||||
},
|
||||
{
|
||||
name: 'Nox',
|
||||
link: 'https://www.yeshen.com/',
|
||||
note: 'Fully compatible, but less tested. Known to be compatible with Hyper-V.',
|
||||
name: 'Nox Player',
|
||||
link: 'https://www.bignox.com/',
|
||||
note: 'Fully compatible, but less thoroughly tested. Known to be compatible with Hyper-V.',
|
||||
},
|
||||
{
|
||||
name: 'Memu',
|
||||
link: 'https://www.xyaz.cn/',
|
||||
note: 'Fully compatible, but less tested.',
|
||||
name: 'MEmu Play',
|
||||
link: 'https://www.memuplay.com/',
|
||||
note: 'Fully compatible, but less thoroughly tested.',
|
||||
},
|
||||
]);
|
||||
|
||||
@@ -55,22 +51,22 @@ const partiallySupport = shuffleArray([
|
||||
{
|
||||
name: 'MuMu Emulator 6',
|
||||
link: 'https://mumu.163.com/update/win/',
|
||||
note: 'Support has been dropped since MAA v5.1.0 and NetEase has stopped maintaining it on 15-08-2023.\n\n- No longer support auto-detect connection, need to use generic connection configuration and manually configure adb path and connection address.\n- Need to run `Forced Replacement of ADB` in `Settings` - `Connection` to use efficient touch modes such as Minitouch, MaaTouch.\n- You need to run MAA with administrator privileges to use the "Exit Emulator When Done" function.\n- MuMu 6 default resolution is not supported, you need to change it to `1280x720`, `1920x1080` and other 16:9 ratio.\n- MuMu 6 multi-open uses the same adb port, so it can\'t support multi-open MuMu 6.',
|
||||
note: 'Support has been dropped since MAA v5.1.0, and NetEase stopped maintaining it on August 15, 2023.\n\n- No longer supports automatic connection detection. You need to use general connection configuration and manually configure ADB path and connection address.\n- You need to run `Force Replace ADB` in `Settings` - `Connection Settings` to use efficient touch modes like Minitouch and MaaTouch.\n- You need to run MAA with administrator privileges to use the "Exit Emulator When Done" function.\n- MuMu 6\'s unusual default resolutions are not supported. You need to change it to standard 16:9 ratios like `1280x720` or `1920x1080`.\n- MuMu 6 multi-instance uses the same ADB port for all instances, so MAA cannot support multiple MuMu 6 instances.',
|
||||
},
|
||||
{
|
||||
name: 'Windows Subsystem for Android™️',
|
||||
name: 'Windows Subsystem for Android™',
|
||||
link: 'https://learn.microsoft.com/en-us/windows/android/wsa/',
|
||||
note: 'Support has been dropped since MAA v5.2.0 and will be discontinued by Microsoft on 05-03-2025.\n\n- Requires the use of [custom connection](../details.html#Custom connection) is required.\n- WSA 2204 or later (the version number is in the `About` page of the subsystem settings), select `Common Configuration` for the connection configuration.\n- WSA 2203 or older (the version number is at the top of the subsystem setup page), for the connection configuration select `WSA Older Versions`.\n- Since this software only supports 720p or higher `16:9` resolution better, please manually drag the window size as close to the 16:9 ratio as possible. (If your monitor is 16:9, you can press `F11` to go full screen).\n- Please try to make sure that Arknights is in the foreground and no other Android apps are running in the foreground at the same time, otherwise it may cause the game to pause or the task recognition error.\n- WSA\'s screenshots often somehow capture a white screen, resulting in recognition of abnormalities, or not recommended to use.',
|
||||
note: 'Support has been dropped since MAA v5.2.0, and Microsoft will discontinue it on March 5, 2025.\n\n- Requires using [custom connection](../connection.html) method.\n- For WSA 2204 or later versions (version number can be found in subsystem settings under `About`), select `General Configuration` for connection configuration.\n- For WSA 2203 or older versions (version number appears at the top of subsystem settings page), select `WSA Older Versions` for connection configuration.\n- Since MAA only properly supports `16:9` resolutions of 720p or higher, please manually adjust the window size to be as close to 16:9 ratio as possible. (If your monitor is 16:9, you can press `F11` for fullscreen).\n- During task execution, try to ensure Arknights remains in the foreground with no other Android apps running simultaneously, otherwise the game may pause or task recognition may fail.\n- WSA sometimes inexplicably captures white screens during screenshots, causing recognition issues. Not recommended for use.',
|
||||
},
|
||||
{
|
||||
name: 'AVD',
|
||||
link: 'https://developer.android.com/studio/run/managing-avds',
|
||||
note: 'Theoretical support.\n\n- Starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode, please switch to other touch modes, or switch SELinux **temporary** to `Permissive` mode.\n- AVD is made for debugging, it is more recommended to use other emulators designed for gaming.',
|
||||
note: 'Theoretically supported.\n\n- Starting from Android 10, Minitouch is no longer available when SELinux is in `Enforcing` mode. Please switch to other touch modes, or **temporarily** switch SELinux to `Permissive` mode.\n- AVD is designed for development debugging, not gaming. Other emulators specifically designed for gaming are recommended instead.',
|
||||
},
|
||||
{
|
||||
name: 'Google Play Games (Developer)',
|
||||
link: 'https://developer.android.com/games/playgames/emulator?hl=zh-cn',
|
||||
note: 'Theoretical support. Hyper-V must be enabled, and a Google account must be logged in.\n\n- You need to use [custom connection](../connection.html) to connect, the ADB port is `6520`.\n- Due to the SELinux policy of Android 10 and later versions, Minitouch cannot work properly, please switch to other touch modes.\n- The first connection after each emulator startup will fail, you need to check `Attempt to kill and restart ADB process after connection failure`.',
|
||||
link: 'https://developer.android.com/games/playgames/emulator',
|
||||
note: 'Theoretically supported. Requires Hyper-V to be enabled and a Google account to be logged in.\n\n- You need to use [custom connection](../connection.html) to connect, with ADB port `6520`.\n- Due to SELinux policies in Android 10 and later, Minitouch cannot work properly. Please switch to other touch modes.\n- The first connection attempt after each emulator startup will fail. Enable `Attempt to kill and restart ADB process after connection failure`.',
|
||||
},
|
||||
]);
|
||||
|
||||
@@ -78,7 +74,7 @@ const notSupport = shuffleArray([
|
||||
{
|
||||
name: 'Google Play Games',
|
||||
link: 'https://play.google.com/googleplaygames',
|
||||
note: 'Not supported, [Consumer Client](https://developer.android.com/games/playgames/pg-emulator#installing-game-consumer) cannot use ADB.',
|
||||
note: 'Not supported. The [Consumer Client](https://developer.android.com/games/playgames/emulator#installing-game-consumer) cannot connect via ADB.',
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
@@ -9,134 +9,128 @@ If this is your first time using MAA, please read [Getting Started](./newbie.md)
|
||||
|
||||
::: warning
|
||||
|
||||
If MAA fails to run after an update, or if you've reached this page via an error window in MAA, it's highly likely due to outdated runtime libraries.
|
||||
The most frequent issue is runtime-related, yet many users ignore the documentation and ask around, so we replaced the pinned message with this. It's frustrating.
|
||||
If MAA fails to run after an update, or if you've arrived here from MAA's error window, it's most likely due to outdated runtime libraries.
|
||||
The most common issue is related to runtime libraries, and many people keep asking about it without reading the documentation, so we changed the pinned message to this. It's frustrating.
|
||||
|
||||
Please run `DependencySetup_依赖库安装.bat` in the MAA directory, or execute the commands below in a terminal,
|
||||
Please run `DependencySetup_依赖库安装.bat` in the MAA directory, or execute the following command in terminal:
|
||||
|
||||
```sh
|
||||
winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --force --uninstall-previous --accept-package-agreements && winget install "Microsoft.DotNet.DesktopRuntime.8" --override "/repair /passive /norestart" --force --uninstall-previous --accept-package-agreements
|
||||
```
|
||||
|
||||
or manually download and install the following <u>**two**</u> runtime libraries to resolve the issue.
|
||||
Or manually download and install these <u>**two**</u> runtime libraries to solve the problem:
|
||||
|
||||
- [Visual C++ Redistributable x64](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
||||
- [Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
||||
- [.NET Desktop Runtime 8](https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe)
|
||||
|
||||
:::
|
||||
|
||||
## The program crashes immediately when I try to run it
|
||||
## Software won't run/crashes/shows errors
|
||||
|
||||
### Incomplete file downloaded
|
||||
### Download/Installation issues
|
||||
|
||||
- If you don't have a complete package of this software already, please DO NOT download the zip files marked with `OTA` in the file name, which are for incremental updates and shall not be used alone. In most cases, Windows users should download `MAA-vX.X.X-win-x64.zip`.
|
||||
In most cases, you need x64 operating system and x64 variant of MAA, i.e. `MAA-*-win-x64.zip`. There is no support for 32-bit (x86) operating systems.
|
||||
- If you find that certain features are missing or not working after an automatic update, it may be due to an issue during the update process. Please re-download and extract the full installation package. After extraction, drag the `config` folder from the old `MAA` folder into the newly extracted `MAA` folder.
|
||||
- A complete MAA software package is named "MAA-`version`-`platform`-`architecture`.zip"; others are "components" that cannot be used independently. Please read carefully.
|
||||
In most cases, you need the x64 architecture of MAA, meaning you should download `MAA-*-win-x64.zip`, not `MAA-*-win-arm64.zip`.
|
||||
- If you find missing or non-working features after an automatic update, the update process may have had issues. Please download and extract the complete installation package again. After extraction, drag the `config` folder from your old `MAA` folder into the newly extracted `MAA` folder.
|
||||
|
||||
### Missing runtime libraries
|
||||
### Runtime library issues
|
||||
|
||||
Find the upward ↑ arrow at the bottom right corner of the webpage and click it.
|
||||
Find the up arrow ↑ at the bottom right of the webpage and click it.
|
||||
|
||||
### System Issues
|
||||
### System issues
|
||||
|
||||
- MAA does not support 32-bit operating systems and does not support Windows 7 / 8 / 8.1.
|
||||
- The above runtime installations all require the Component Store Service (CBS, TrustedInstaller/TiWorker, WinSxS).
|
||||
If the Component Store Service is damaged, it cannot be installed properly.
|
||||
- MAA doesn't support 32-bit operating systems or Windows 7/8/8.1.
|
||||
- The runtime installations above require Component Store Service (CBS, TrustedInstaller/TiWorker, WinSxS).
|
||||
If these services are damaged, installation will fail.
|
||||
|
||||
We cannot provide repair suggestions other than reinstalling the system, so please avoid using "slimmed-down" systems that do not specify slimming items and slimming risks, or very old versions of systems.
|
||||
We cannot provide repair solutions other than reinstalling your system. Please avoid using "slimmed" system versions without clear documentation of what was removed, or extremely outdated systems.
|
||||
|
||||
#### Windows N/KN
|
||||
|
||||
For Windows N/KN (Europe/Korea), you also need to install the [Media Feature Pack](https://support.microsoft.com/en-us/topic/c1c6fffa-d052-8338-7a79-a4bb980a700a).
|
||||
For Windows N/KN (European/Korean versions), you also need to install the [Media Feature Pack](https://support.microsoft.com/zh-cn/topic/c1c6fffa-d052-8338-7a79-a4bb980a700a).
|
||||
|
||||
#### Notes on Windows 7
|
||||
#### Windows 7
|
||||
|
||||
.NET 8 does not support Windows 7 / 8 / 8.1 systems<sup>[source](https://github.com/dotnet/core/issues/7556)</sup>, so MAA also no longer supports them. The last available .NET 8 version is [`v5.4.0-beta.1.d035.gd2e5001e7`](https://github.com/MaaAssistantArknights/MaaRelease/releases/tag/v5.4.0-beta.1.d035.gd2e5001e7); the last available .NET 4.8 version is [`v4.28.8`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/releases/tag/v4.28.8). The feasibility of self-compilation has not yet been determined.
|
||||
.NET 8 doesn't support Windows 7/8/8.1 systems<sup>[source](https://github.com/dotnet/core/issues/7556)</sup>, so MAA no longer supports them either. The last usable .NET 8 version is [`v5.4.0-beta.1.d035.gd2e5001e7`](https://github.com/MaaAssistantArknights/MaaRelease/releases/tag/v5.4.0-beta.1.d035.gd2e5001e7); the last usable .NET 4.8 version is [`v4.28.8`](https://github.com/MaaAssistantArknights/MaaAssistantArknights/releases/tag/v4.28.8). Self-compilation feasibility remains undetermined.
|
||||
|
||||
For Windows 7, before installing the two runtime libraries mentioned above, you also need to check if the following patches are installed:
|
||||
For Windows 7, before installing the two runtime libraries mentioned above, check if these patches are installed:
|
||||
|
||||
1. [Windows 7 Service Pack 1](https://support.microsoft.com/en-us/windows/b3da2c0f-cdb6-0572-8596-bab972897f61)
|
||||
2. SHA-2 code-signing update:
|
||||
- KB4474419:[link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu), [link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu)
|
||||
- KB4490628:[link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu), [link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu)
|
||||
3. Platform Update for Windows 7 (DXGI 1.2 & Direct3D 11.1, KB2670838):[link 1](https://catalog.s.download.windowsupdate.com/msdownload/update/software/ftpk/2013/02/windows6.1-kb2670838-x64_9f667ff60e80b64cbed2774681302baeaf0fc6a6.msu), [link 2](http://download.windowsupdate.com/msdownload/update/software/ftpk/2013/02/windows6.1-kb2670838-x64_9f667ff60e80b64cbed2774681302baeaf0fc6a6.msu)
|
||||
1. [Windows 7 Service Pack 1](https://support.microsoft.com/zh-cn/windows/b3da2c0f-cdb6-0572-8596-bab972897f61)
|
||||
2. SHA-2 code signing patches:
|
||||
- KB4474419: [Download link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu), [Download link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6cea5cb4e198717789633dca16308ef79c.msu)
|
||||
- KB4490628: [Download link 1](https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu), [Download link 2](http://download.windowsupdate.com/c/msdownload/update/software/secu/2019/03/windows6.1-kb4490628-x64_d3de52d6987f7c8bdc2c015dca69eac96047c76e.msu)
|
||||
3. Platform Update for Windows 7 (DXGI 1.2, Direct3D 11.1, KB2670838): [Download link 1](https://catalog.s.download.windowsupdate.com/msdownload/update/software/ftpk/2013/02/windows6.1-kb2670838-x64_9f667ff60e80b64cbed2774681302baeaf0fc6a6.msu), [Download link 2](http://download.windowsupdate.com/msdownload/update/software/ftpk/2013/02/windows6.1-kb2670838-x64_9f667ff60e80b64cbed2774681302baeaf0fc6a6.msu)
|
||||
|
||||
##### .NET 8 applications running on Windows 7 mitigation measures [#8238](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8238)
|
||||
##### Workaround for .NET 8 applications running abnormally on Windows 7 [#8238](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/8238)
|
||||
|
||||
When running .NET 8 applications on Windows 7, there is an issue with abnormal memory usage. Please refer to the following mitigation measures. Windows 8/8.1 has not been tested. If the same issue exists, please kindly submit an issue to remind us to update the documentation.
|
||||
When running .NET 8 applications on Windows 7, abnormal memory usage can occur. Follow these steps to mitigate it. Windows 8/8.1 hasn't been tested; if similar issues occur, please open an Issue to remind us to update the documentation.
|
||||
|
||||
1. Open `Computer`, right-click on the blank space, click Properties, click `Advanced system settings` on the left, and click `Environment Variables`.
|
||||
2. Create a new system variable, variable name `DOTNET_EnableWriteXorExecute`, variable value `0`.
|
||||
3. Restart the computer.
|
||||
1. Open `Computer`, right-click in empty space, click Properties, click `Advanced system settings` on the left, and click `Environment Variables`.
|
||||
2. Create a new system variable with name `DOTNET_EnableWriteXorExecute` and value `0`.
|
||||
3. Restart your computer.
|
||||
|
||||
## Connection Error
|
||||
## Connection errors
|
||||
|
||||
- Tips: please refer to the [List of the Supported Emulators](./device/) section to ensure that the emulator you are using is officially supported and that your configuration is correct.
|
||||
- If you are using software such as a game accelerator, please close the software, RESTART your computer and try again.
|
||||
- Please check your decompression software - in some cases, using uncommon software such as `7z` or _other niche decompression software_ may cause errors in Minitouch-related files.
|
||||
### Verify ADB and connection address are correct
|
||||
|
||||
### Make sure ADB and address are correct
|
||||
See [Connection Settings](./connection.md).
|
||||
|
||||
Check [Connection](./connection.md)
|
||||
### Close existing ADB processes
|
||||
|
||||
### Change emulator
|
||||
After closing MAA, check `Task Manager` - `Details` for processes containing `adb`. If found, end them and retry connecting.
|
||||
|
||||
Change to another emulator, such as [Bluestacks international version](https://www.bluestacks.com/download.html) Nougat 64 bit.
|
||||
### Properly use multiple ADB instances
|
||||
|
||||
_After installation of Bluestack, you need to enable `Android Debug Bridge` in the settings._
|
||||
When ADB versions differ, newly started processes will close older ones. If you need to run multiple ADB instances simultaneously (e.g., Android Studio, Alas, phone managers), ensure they use the same version.
|
||||
|
||||
### Close extra adb processes
|
||||
### Avoid game accelerators
|
||||
|
||||
- Close MAA and check for any adb processes in the task manager. If there are any, please close them and retry.
|
||||
Some accelerators require restarting MAA, ADB, and the emulator after enabling or disabling acceleration.
|
||||
|
||||
### Restart computer
|
||||
For using UU Accelerator with MuMu, refer to the [official documentation](https://mumu.163.com/help/20240321/35047_1144608.html).
|
||||
|
||||
Try restarting your computer.
|
||||
### Restart your computer
|
||||
|
||||
## Connected successfully, then stuck, not operating at all
|
||||
Restarting solves 97% of problems. (Trust me)
|
||||
|
||||
The adb version packaged with some emulators is too old and does not support minitouch. Please open MAA with administrator privileges and navigate to `Settings` - `Connection Settings` - `Forced Replace ADB`. (It is recommended to close the emulator and restart MAA before proceeding, otherwise, the replacement may not be successful.)
|
||||
### Try a different emulator
|
||||
|
||||
The emulator will reset the ADB version after updating. If the problems occur again, please repeat the above steps. Or you can try to use the [custom connection](./connection.md) method to solve it once and for all.
|
||||
Please refer to [Emulator and Device Support](./device/).
|
||||
|
||||
If it still doesn't work, please retry after switching to `MaaTouch` from `Minitouch` in `Settings` - `Connection Settings`.
|
||||
## Connected but no operation
|
||||
|
||||
## Connected successfully, but actions are slow or errors are frequent
|
||||
Some emulators come with outdated ADB versions that don't support `Minitouch` or `MaaTouch`.
|
||||
|
||||
- The Copilot requires you to go to the screen with the `Start` button. Please confirm they are not related.
|
||||
- If you are using a non-CN client, please go to MAA Settings - Start-Up Settings - Select your client version. Not all features are currently supported for non-CN clients, please refer to docs.
|
||||
- If you are running the Auto-I.S. function, please PIN UP the I.S. theme you want in the game, and select I.S. theme in MAA `Task Settings` - `Auto I.S.`.
|
||||
- If Copilot frequently pauses without deploying operators, please disable `Pause Deployment` in `Settings` - `Game Settings`.
|
||||
- If Auto Squad fails to recognize operators properly, please cancel the special focus on the corresponding operators.
|
||||
- The input method `Adb Input` is naturally slow. It is recommended to use `MaaTouch` or `Minitouch` instead.
|
||||
Run MAA as administrator, close the emulator, restart MAA, and click `MAA Settings` - `Connection Settings` - `Force Replace ADB`.
|
||||
|
||||
### Prompt that the screenshot takes a long time / is too long
|
||||
Emulator updates may overwrite the ADB file. If the issue returns after an update, try replacing again or use [alternative ADB](./connection.md#use-adb-provided-by-google).
|
||||
|
||||
- MAA currently supports 3 screenshot methods: `RawByNc`, `RawWithGzip`, and `Encode`. When the average screenshot time of executing a task is >400 / >800, a prompt message will be output (a single task will only be output once).
|
||||
- `Settings - Connection Settings` will display the minimum/average/maximum time taken for the last 30 screenshots, refreshed every 10 screenshots.
|
||||
- Automatic combat functions (such as I.S.) are greatly affected by the time taken to take screenshots.
|
||||
- This time consumption is unrelated to MAA, but related to computer performance, current usage, or emulator. You can try cleaning up background processes, changing emulators, or upgrading computer configurations.
|
||||
## Connected but operations are laggy, abnormal, or error-prone
|
||||
|
||||
## About Windows UAC
|
||||
- If you've enabled `Notched Screen UI Adaptation`, set it to 0.
|
||||
- If using a non-CN client, first select your client version in `Settings` - `Game Settings` - `Client Type`. Some features may not be fully adapted for non-CN clients; refer to the corresponding documentation.
|
||||
- For Integrated Strategy automation, check the [Auto Integrated Strategy documentation](./introduction/integrated-strategy.md) and correctly select the theme in `Auto Integrated Strategy` - `Integrated Strategy Theme`.
|
||||
- If auto-combat frequently pauses without deploying operators, disable `Matchstick Mode` in `Settings` - `Operation Settings`.
|
||||
- If auto-squad formation can't recognize operators correctly, remove special focus from those operators.
|
||||
- `Adb Input` touch mode is naturally slow; try switching to other modes for functions like auto-combat.
|
||||
|
||||
MAA should not require Windows UAC administrator privileges to run all functions. The functionalities related to administrator privileges are as follows:
|
||||
### "Screenshot takes too long" message
|
||||
|
||||
1. `Auto Detect Connection`: Administrator privileges are required when the target emulator is running with administrator rights.
|
||||
2. `Close Emulator After Completion`: Administrator privileges are required when the target emulator is running with administrator rights.
|
||||
3. `Start MAA Automatically on Boot`: It is not possible to set automatic startup with administrator privileges.
|
||||
4. When MAA is incorrectly extracted to a path that requires administrator privileges for writing, such as `C:\` or `C:\Program Files\`.
|
||||
- MAA currently supports three ADB-based screenshot methods: `RawByNc`, `RawWithGzip`, and `Encode`. When average screenshot time exceeds 400/800ms, a notification appears once per task.
|
||||
- `Settings - Connection Settings` displays min/avg/max times for the last 30 screenshots, refreshed every 10 screenshots.
|
||||
- Auto-combat features (like Integrated Strategy) are heavily affected by screenshot times.
|
||||
- Screenshot performance is unrelated to MAA but depends on computer performance, background processes, or emulator. Try clearing background tasks, changing emulators, or upgrading your computer.
|
||||
|
||||
There have been reports that systems with UAC disabled may have the issue where "even without selecting 'Run as Administrator' by right-clicking, it will still run with administrator privileges." It is recommended to enable UAC to avoid unintended privilege escalation.
|
||||
## Administrator permissions issues
|
||||
|
||||
## The download speed is slow and the mirror site is not accessible
|
||||
MAA shouldn't need Windows UAC administrator privileges for any functionality. Current admin-related functions include:
|
||||
|
||||
1. Go to [Download](../readme.md) to get the link (non-mirror) you want to download.
|
||||
2. Find the link to the file you need to download.
|
||||
3. Right-click it and select `Copy link address`.
|
||||
4. Paste the link into your browser.
|
||||
5. Replace the `github.com` in the link with `download.fastgit.org`.
|
||||
6. Press `Enter` to download.
|
||||
1. `Auto-detect connection`: Administrator rights needed when the target emulator runs as administrator.
|
||||
2. `Close emulator when done`: Administrator rights needed when the target emulator runs as administrator.
|
||||
3. `Auto-start MAA at boot`: Cannot be set when running as administrator.
|
||||
4. When MAA is incorrectly extracted to paths requiring admin rights for writing, like `C:\` or `C:\Program Files\`.
|
||||
|
||||
## Download halfway and prompt "login"/"authentication"
|
||||
Reports indicate that systems with disabled UAC may run applications as administrator even without explicitly selecting "Run as administrator." We recommend enabling UAC to prevent unexpected privilege escalation.
|
||||
|
||||
Please use a browser / IDM / FDM and other regular downloaders to download files, **Do NOT fucking use Thunder!**
|
||||
## Download stops midway with "login"/"authentication" prompt
|
||||
|
||||
Please use a browser / IDM / FDM or other downloaders to download files, **DO NOT use Thunder!**
|
||||
|
||||
@@ -3,113 +3,125 @@ order: 3
|
||||
icon: hugeicons:brain-02
|
||||
---
|
||||
|
||||
# Combat
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
# Sanity Farming
|
||||
|
||||
## General Settings
|
||||
|
||||
- Combat options include `Use Sanity Potion + Use Originium`, `Perform Battles` and `Material`, you can specify any of them. The combat task stops once one of the specifications is met.
|
||||
- The `Use Sanity Potion` + `Use Originium` and `Perform Battles`+ `Material` options work as OR conditions - the task will stop when any of these conditions is met.
|
||||
|
||||
- `Use Sanity Potion` specifies the maximum used amount of sanity potions. Multiple potions may be used at a time.
|
||||
- `Use Originium` specifies the maximum used amount of Originium. It is used one at a time. The Originium will not be used when there are Sanity Potions in the depot.
|
||||
- `Perform Battles` specifies the number of battles to perform at most.
|
||||
- `Material` specifies the number of materials to collect.
|
||||
- `Use Sanity Potion` specifies how many times to replenish sanity (may use multiple potions at once).
|
||||
- `Use Originium` specifies how many Originium to use (one at a time). Originium won't be used if sanity potions are available.
|
||||
- `Perform Battles` specifies the number of battles to complete (e.g., "stop after 15 runs").
|
||||
- `Material` specifies how many of a specific material to obtain (e.g., "stop after getting 5 Orirock").
|
||||
|
||||
- `Material` and `Stage` are independent options. `Material` is not going to automatically navigate to the stage for the specified material. You still need to manually configure the stage option.
|
||||
- `Use Originium` will only be used after `Use Sanity Option`, because MAA will only use Originium to replenish sanity when there are no Sanity Potions left. Therefore, after checking `Use Originium`, MAA will lock the number of `Use Sanity Potion` to 999, making sure to consume all the Sanity Potions to avoid skipping the `Use Originium` judgment.
|
||||
- `Material` and `Stage Selection` are independent options. `Material` only uses the material count as a stopping condition and doesn't automatically navigate to stages that drop that material.
|
||||
- `Use Originium` is only checked after `Use Sanity Potion`. Since MAA only uses Originium when no sanity potions remain, checking `Use Originium` will automatically set `Use Sanity Potion` to 999, ensuring all potions are used first.
|
||||
|
||||
::: details Example
|
||||
::: details Examples
|
||||
|
||||
| Use Sanity Potion | Use Originium | Perform Battles | Material | Result |
|
||||
| :------: | :----: | :------: | :------: | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| | | | | Ends after using up the existing Sanity. |
|
||||
| 2 | | | | Uses up the existing Sanity first, then consumes a Sanity Potion once, totalling `2` times. Ends after using up the Sanity. |
|
||||
| _999_ | 2 | | | Uses up the existing Sanity and all Sanity Potions, then uses Originium, totalling `2` times. Ends after using up the Sanity. |
|
||||
| | | 2 | | Ends after performing the selected stage `2` times. |
|
||||
| | | | 2 | Ends after farming and obtaining `2` of the specified materials. |
|
||||
| 2 | | 4 | | Ends after performing the selected stage `4` times, using up to `2` Sanity Potions. |
|
||||
| 2 | | | 4 | Ends after farming and obtaining `4` of the specified materials, using up to `2` Sanity Potions. |
|
||||
| 2 | | 4 | 8 | Ends after performing the selected stage `4` times, using up to `2` Sanity Potions. However, if `8` of the specified materials are obtained before completing `4` times, it will end early. |
|
||||
| _999_ | 4 | 8 | 16 | Ends after performing the selected stage `8` times, using up all Sanity Potions and `4` Originium. However, if `16` of the specified materials are obtained before completing `8` times, it will end early. |
|
||||
| | 2 | | | Uses up the existing Sanity first. If there are Sanity Potions in storage, it ends; if there are no Sanity Potions, it uses `2` Originium and ends after using up the Sanity. _Not a MAA GUI behavior_ |
|
||||
| 2 | 4 | | | Uses up the existing Sanity first. If there are still some left after consuming `2` Sanity Potions, it ends; if there are no Sanity Potions after consuming ≤`2` Sanity Potions, it continues to use `4` Originium and ends after using up the Sanity. _Not a MAA GUI behavior_ |
|
||||
| :---------------: | :-----------: | :-------------: | :------: | ------ |
|
||||
| | | | | Uses current sanity and stops. |
|
||||
| 2 | | | | Uses current sanity, then uses sanity potions up to 2 times, then stops. |
|
||||
| _999_ | 2 | | | Uses current sanity, then all sanity potions, then Originium up to 2 times, then stops. |
|
||||
| | | 2 | | Runs the selected stage 2 times, then stops. |
|
||||
| | | | 2 | Farms until 2 of the specified material are obtained, then stops. |
|
||||
| 2 | | 4 | | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | | 4 | Farms until 4 of the specified material are obtained, using up to 2 sanity potions if needed, then stops. |
|
||||
| 2 | | 4 | 8 | Runs the selected stage up to 4 times, using up to 2 sanity potions if needed. Stops early if 8 of the specified material are obtained before reaching 4 runs. |
|
||||
| _999_ | 4 | 8 | 16 | Runs the selected stage up to 8 times, using all sanity potions and up to 4 Originium if needed. Stops early if 16 of the specified material are obtained before reaching 8 runs. |
|
||||
| | 2 | | | Uses current sanity, then stops if any sanity potions are available. If no potions, uses up to 2 Originium. _Not MAA GUI behavior_ |
|
||||
| 2 | 4 | | | Uses current sanity, then up to 2 sanity potions. If potions remain, stops; if no potions remain after using ≤2 potions, uses up to 4 Originium. _Not MAA GUI behavior_ |
|
||||
|
||||
:::
|
||||
|
||||
### Operations
|
||||
### Stage Selection
|
||||
|
||||
- If the stage you need is unavailable in the selection, please choose `Cur/Last` in MAA and manually locate the stage in the game.
|
||||
Ensure the screen stays on the stage detail page with the **Start** and **Auto-Deploy** buttons available.
|
||||
- If you are not on this page, `Cur/Last` will automatically navigate to the last stage played according to the record in the lower right corner of the terminal homepage.
|
||||
- You can also enable `Manual entry of stage names` in `Combat` - `Advanced` and enter the stage number manually. Currently supported stages include:
|
||||
- All main theme stages, where `-NORMAL` or `-HARD` can be added at the end to switch between standard and challenge modes.
|
||||
- LMD stages and Battle Record stages 5/6. The input must be `CE-6` or `LS-6` even if you have not unlocked it yet. In that case, the program will automatically switch to the corresponding stage 5.
|
||||
- Skill Summary, Shop Voucher, and Carbon Stages 5. The input also must be `CA-5`, `AP-5`, and `SK-5` respectively.
|
||||
- Chip stages. The input must be complete with stage number, such as `PR-A-1`.
|
||||
- Annihilation. The input must be `Annihilation`.
|
||||
- Some side story stages, now contains `OF-1`, `OF-F3` and `GT-5`.
|
||||
- The last three stages of the current SS event. This is available after downloading updates automatically from the [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) when the event is on. The prompt will be shown on the main page when this is available.
|
||||
- For the SS event rerun, you can enter `SSReopen-XX` to clear XX-1 ~ XX-9 levels once. Example `SSReopen-IC`.
|
||||
- If your desired stage isn't in the selection menu, choose `Current/Last` in MAA, then manually navigate to the stage in-game.
|
||||
Ensure you're on the stage details screen with the stage name and remaining sanity in the upper right and auto-deploy/start buttons in the lower right.
|
||||
- If you're not on this screen, `Current/Last` will automatically enter the "last operation" stage shown on the bottom right of the terminal home screen.
|
||||
- You can also enable `Manual entry of stage names` in `Task Settings` - `Sanity Farming` - `Advanced Settings` to manually input stage codes. Currently supported stages include:
|
||||
- All main story stages. You can add `-NORMAL` or `-HARD` at the end to switch between normal and challenge modes.
|
||||
- Resource stages like CE-6/LS-6 (LMD/EXP). Enter the exact code like `CE-6` or `LS-6`. MAA will automatically switch to level 5 if level 6 isn't available.
|
||||
- Skill summary, voucher, and carbon stages (level 5 only). Enter exact codes like `CA-5`, `AP-5`, or `SK-5`.
|
||||
- All chip stages. Enter complete stage codes like `PR-A-1`.
|
||||
- For Annihilation mode, use these specific values:
|
||||
|
||||
- Current annihilation: Annihilation
|
||||
- Chernobog: Chernobog@Annihilation
|
||||
- Lungmen Outskirts: LungmenOutskirts@Annihilation
|
||||
- Lungmen Downtown: LungmenDowntown@Annihilation
|
||||
|
||||
::: details Example
|
||||

|
||||
- Side story stages like `OF-1`, `OF-F3`, and `GT-5`.
|
||||
- The last three stages of the current Side Story event. These will be shown at the bottom of the interface after automatically downloading updates from the [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json).
|
||||
- Rerun Side Story events: Enter `SSReopen-<stage prefix>` to farm all stages XX-1 through XX-9 in sequence, like `SSReopen-IC`.
|
||||
|
||||
::: details Example Screen
|
||||

|
||||
:::
|
||||
|
||||
### Annihilation Mode
|
||||
|
||||
- MAA will only navigate through the Annihilation button at the top right corner of the terminal homepage. Please ensure that the current Annihilation has unlocked `Full Delegation` and that you possess a sufficient number of "PRTS Proxy Annihilation Cards".
|
||||
- After the current Annihilation refreshes or after reinstalling Arknights, returning from the Annihilation `Start Battle` page will automatically LSand `Intelligence Summary`. Please close this page in advance to prevent the task from getting stuck.
|
||||
- It is only recommended for players who have already achieved "400 kills" in the current Annihilation to use MAA for automatic Annihilation.
|
||||
- MAA navigates to Annihilation using the button at the top-right of the terminal home screen. Ensure your selected Annihilation stage has unlocked `Full Delegation` and that you have enough `PRTS Annihilation Delegation Cards`.
|
||||
- This feature is only recommended for stages where you've already achieved the 400-kill milestone.
|
||||
|
||||
## Advanced Settings
|
||||
|
||||
### Alternative Stage
|
||||
### Alternative Stages
|
||||
|
||||
The alternative stage is determined based on the availability of stages on the given day, i.e., the first available stage will be selected for battle.
|
||||
This is a function similar to a schedule and cannot be used as a backup stage when the stage selection task fails.
|
||||
Alternative stages are selected based on daily stage availability - MAA will choose the first available stage in the list.
|
||||
This functions like a schedule, not as a fallback if the primary stage selection fails.
|
||||
|
||||
1. Example: Stage selection `CE-6/5`, alternatives `1-7` and `LS-6/5`:
|
||||
- If `CE-6/5` is available on the day, it will proceed to `CE-6/5` and not to `1-7` or `LS-6/5`. If the player has not unlocked the `CE-6/5` mission node, the sanity farming task will fail.
|
||||
- If `CE-6/5` is not available on the day, it will proceed to `1-7` and not to `CE-6/5`. If the player has not unlocked the 1-7 mission node, the sanity farming task will fail.
|
||||
- Since `1-7` is a permanent stage before `LS-6/5`, MAA will never proceed to `LS-6/5` in this scenario.
|
||||
2. If the stage selection is `Annihilation`, then:
|
||||
- The selection logic of the remaining backup stages will not be affected by the result of the Annihilation, even if the Annihilation fails, the sanity farming task will not fail.
|
||||
- The remaining backup stages will only inherit the settings of `Use Sanity Potion` and `Series`, and will not be controlled by `Use Originium`, `Perform Battles`, or `Material`.
|
||||
1. Example: If primary stage is `CE-6/5` with alternatives `1-7` and `LS-6/5`:
|
||||
- If `CE-6/5` is open today, MAA will run it and ignore the alternatives. If you haven't unlocked auto-deploy for CE-6/5, the task will fail.
|
||||
- If `CE-6/5` is closed today, MAA will run `1-7` instead. If you haven't unlocked auto-deploy for 1-7, the task will fail.
|
||||
- Since `1-7` is a permanent stage that appears before `LS-6/5` in the list, MAA will never run `LS-6/5` in this scenario.
|
||||
2. If the primary stage is `Annihilation Mode`:
|
||||
- Annihilation results won't affect the alternative stage logic - even if Annihilation fails, the task will continue.
|
||||
- Alternative stages will only inherit the `Use Sanity Potion` and `Multiplier` settings, ignoring `Use Originium`, `Perform Battles`, and `Material` settings.
|
||||
|
||||
### Remaining Sanity
|
||||
|
||||
It starts after the `Combat` task ends and is not controlled by `Use Sanity Potion`, `Use Originium`, `Perform Battles`, `Material`, or `Series`. It ends when the current remaining sanity is exhausted.
|
||||
This option activates after the main `Sanity Farming` task ends, ignoring all `Use Sanity Potion`, `Use Originium`, `Perform Battles`, `Material`, and `Multiplier` settings. It simply uses up any remaining sanity and stops.
|
||||
|
||||
- Suitable for clearing the remaining "corner" sanity (e.g., going to 1-7) after sanity is insufficient in the `Stage Selection` stage.
|
||||
- Also suitable for automatically using single battles to use up sanity when the set number of consecutive battles is too high and sanity is insufficient (e.g., setting 1-7 to battle 6 times, but only having 30 sanity, thus automatically switching to 5 single battles of 1-7).
|
||||
- If the remaining sanity is still insufficient, the task will end (e.g., less than 6 sanity).
|
||||
- If the selected stage for remaining sanity is unopened, the sanity farming task will fail.
|
||||
- Useful for farming a low-cost stage (like 1-7) with leftover sanity after your main stage becomes unaffordable.
|
||||
- Also useful for automatically switching to single runs when you have insufficient sanity for your configured multiplier (e.g., if you set 1-7 for 6x runs but only have 30 sanity, it will automatically run five single 1-7 runs instead).
|
||||
- The task will end if remaining sanity is insufficient (e.g., less than 6 sanity).
|
||||
- If the selected remaining sanity stage is closed or unavailable, the task will fail.
|
||||
|
||||
### Series
|
||||
### Multiplier
|
||||
|
||||
MAA will fight according to the number of consecutive battles set by the user:
|
||||
MAA will use the specified battle multiplier setting:
|
||||
|
||||
- **AUTO mode** (0):
|
||||
- Automatically identify the maximum number of consecutive battles in the level, maintain the maximum number of consecutive battles and do not overflow sanity
|
||||
- Enter the `Remaining Sanity` process after completion (if set)
|
||||
- Automatically identifies and uses the maximum possible multiplier without wasting sanity
|
||||
- Proceeds to the `Remaining Sanity` option afterward (if enabled)
|
||||
|
||||
- **Numerical mode** (1~6):
|
||||
- Perform consecutive battles according to the set number of times
|
||||
- If the current sanity is not enough to complete the set number of times (such as only 5 times but set to 6 times), it will directly end the task and enter the `Remaining Sanity` process (if set)
|
||||
- **Fixed value mode** (1-6):
|
||||
- Uses exactly the specified multiplier
|
||||
- If current sanity is insufficient for the set multiplier (e.g., only enough for 5× but set to 6×), ends the task and proceeds to `Remaining Sanity` (if enabled)
|
||||
|
||||
- **Disable mode** (-1):
|
||||
- Do not adjust the number of consecutive battles in the game
|
||||
- If the sanity is not enough to complete the current set number of times in the game, directly end the task and enter the `Remaining Sanity` process (if set)
|
||||
- **Disabled mode** (-1):
|
||||
- Doesn't change the in-game multiplier setting
|
||||
- If sanity is insufficient for the current in-game multiplier setting, ends the task and proceeds to `Remaining Sanity` (if enabled)
|
||||
|
||||
### Perform Battles
|
||||
|
||||
MAA will run up to the specified number of battles.
|
||||
|
||||
Example: Assuming you have 100 sanity and the stage costs 6 sanity:
|
||||
|
||||
- If `Perform Battles` is 10 and multiplier is 4: MAA will do 2 runs × 4× multiplier = 8 battles (floor(10/4) × 4 = 8), using 48 sanity. It won't do another 4× run since that would be 12 battles, exceeding the set limit of 10.
|
||||
- If `Perform Battles` is 10 and multiplier is AUTO: MAA will do one 6× run plus one 4× run = 10 battles (6 + 4 = 10), using 60 sanity.
|
||||
|
||||
### Drop Recognition
|
||||
|
||||
- Material drops are automatically recognized and printed to the program log. The data also gets uploaded to [Penguin Stats](https://penguin-stats.io/) and [Yituliu](https://ark.yituliu.cn/).
|
||||
- You can manually set your Penguin Stats user ID in the settings.
|
||||
- Automatically recognizes and counts material drops, uploading data to both [Penguin Statistics](https://penguin-stats.cn/) and [Yituliu](https://ark.yituliu.cn/).
|
||||
- You can set a custom Penguin Statistics user ID if desired.
|
||||
|
||||
## Abnormal Detection
|
||||
## Error Handling
|
||||
|
||||
- `Auto-Deploy` will be automatically selected if not already in case you forget to do so.
|
||||
- After disconnection or forced server reset at 4 am, it will automatically reconnect and continue to play the last stage selected in the game. If you need to cross the day, please check the last stage selection.
|
||||
- An account level-up situation can be automatically handled as well as a failed operation in which case the operation will be abandoned and the battle will be retried.
|
||||
- Automatically checks `Auto Deploy` if it's available.
|
||||
- Automatically reconnects and continues tasks after disconnections or the daily 4 AM server reset.
|
||||
- Continues tasks after level-ups.
|
||||
- If auto-deploy fails, abandons the current operation and retries the battle.
|
||||
|
||||
@@ -3,45 +3,43 @@ order: 9
|
||||
icon: ph:sword-bold
|
||||
---
|
||||
|
||||
# Copilot
|
||||
# Auto Combat
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
|
||||
You're welcome to share your tasks with [prts.plus](https://prts.plus)!
|
||||
Welcome to use and share operation files on [prts.plus](https://prts.plus).
|
||||
|
||||
::: warning
|
||||
All features involving auto-battle require a stable game frame rate of at least 60 frames, including but not limited to Copilot and Auto I.S..
|
||||
All features involving automatic combat require a stable game frame rate of at least 60 FPS, including but not limited to Auto Combat and Integrated Strategy.
|
||||
:::
|
||||
|
||||
## Load Tasks
|
||||
## Using Operations
|
||||
|
||||
Supports automatic combat for any `Squad Formation Stage` and `Stationary Security Service` mode.
|
||||
|
||||
- Please run it on the screen with the `Start Operation` button.
|
||||
Then, import the task by `Import Local JSON Task File` or `Enter Task Station Secret Code` in the upper left box of MAA.
|
||||
- The `Auto Squad` feature will **clear the current squad** and automatically form a squad based on the operators required for the task.
|
||||
- You need to cancel the special focus on the operators for Auto Squad.
|
||||
- You can add `custom operators` and `low-trust operators` for auto squad formation as needed.
|
||||
- You can disable `Auto Squad` and manually form the squad before starting if you need to use `Friend Support` or for other personal preferences.
|
||||
- For "Paradox Simulation" stages, you must disable `Auto Squad`, manually select skills, and start automatic combat on the screen with the **Start Simulation** button.
|
||||
- For "Stationary Security Service" stages, `Auto Squad` is ineffective. You must manually complete the **initial** task preparation until the **Start Deployment** button appears on the stage details screen to start automatic combat.
|
||||
- You can set `Loop Times`, such as for Stationary Security Service. However, MAA will not borrow operators. Do not use this feature if you need to borrow operators.
|
||||
- You can use the `Battle list` feature for automatic continuous combat in the same area stages.
|
||||
- The three buttons below the Battle list from left to right are `Batch Import`, `Add Stage`, and `Clear Stages`.
|
||||
Right-click `Add Stage` to add a raid stage, and right-click `Clear Stages` to clear unchecked stages.
|
||||
- After importing the task, the stage names will appear below the battle list. Confirm they are correct before adding the stage. You can drag and adjust the order of the stages in the list and check whether to execute them.
|
||||
- After enabling this feature, start automatic combat on the **map screen where the stages are located**. The automatic combat queue will stop if sanity is insufficient, combat fails, or the settlement is not three stars.
|
||||
- Ensure that the stages in the list are in the same area (can be navigated by swiping the map screen left or right).
|
||||
- Remember to like the tasks that you found helpful!
|
||||
- This feature should be started from the squad selection screen where the `Start Operation` button is visible.
|
||||
Then, import an operation by either `Import Local JSON Operation File` or `Enter Operation Code` in the upper left box of MAA.
|
||||
- The `Auto Squad` feature will **clear the current squad** and automatically form a squad based on the operators required by the operation.
|
||||
- You need to unmark any specially focused operators that will be used in the auto squad.
|
||||
- You can add `custom operators` and `low-trust operators` to the auto squad as needed.
|
||||
- You can disable `Auto Squad` and manually form the squad before starting if needed (for example, when using `Friend Support`).
|
||||
- For "Paradox Simulation" stages, you must disable `Auto Squad`, manually select skills, and start automatic combat from the screen with the **Start Simulation** button.
|
||||
- For "Stationary Security Service" stages, `Auto Squad` is ineffective. You must manually complete the **initial** task preparation until the screen with the **Start Deployment** button appears before starting automatic combat.
|
||||
- You can set `Loop Times`, such as for Stationary Security Service. However, MAA will not borrow operators, so don't use this if you need to borrow operators.
|
||||
- You can use the `Battle List` feature for automatic continuous combat across stages in the same area.
|
||||
- The three buttons below the Battle List from left to right are `Batch Import`, `Add Stage`, and `Clear Stages`.
|
||||
Right-clicking `Add Stage` adds a challenge mode stage; right-clicking `Clear Stages` clears all unchecked stages.
|
||||
- After importing an operation, the stage name will appear below the battle list. Confirm it's correct before adding the stage. You can drag stages to reorder them and check/uncheck to control execution.
|
||||
- When using this feature, start automatic combat from the **map screen where the stages are located**. The automatic combat queue will stop if sanity is insufficient, combat fails, or you don't achieve three stars.
|
||||
- Ensure all stages in the list are in the same area (navigable by swiping the map screen left or right).
|
||||
- **Please remember to like high-quality operations to boost their ratings and encourage their creators.**
|
||||

|
||||
|
||||
## Create Tasks
|
||||
## Creating Operations
|
||||
|
||||
- Please use the [Task Editor](https://prts.plus/create) to create tasks. A tool for creating tasks is provided in the directory of MAA. See also: [Copilot Schema](../../protocol/copilot-schema.md) for help.
|
||||
- Get map coordinates:
|
||||
- After filling in the stage in the Task Editor, a draggable and zoomable coordinate map will automatically load in the lower left corner, where you can click to set the current operator positions.
|
||||
- Start an operation after filling in `stage_name`. A file under `debug\map` named `map.png` will be generated for your reference.
|
||||
- Refer to [PRTS.map](https://map.ark-nights.com/), with the `coordinates` set to `MAA` mode.
|
||||
- Drill plan is available for testing.
|
||||
- It is recommended to write your name, video walkthrough URL, or other things that you think are helpful in the description.
|
||||
- Please use the [Operation Editor](https://prts.plus/create) to create operations. You can refer to the [Combat Operation Protocol](../../protocol/copilot-schema.md) for guidance.
|
||||
- Getting map coordinates:
|
||||
- After entering the stage name in the Operation Editor, a draggable and zoomable coordinate map will automatically load in the lower left corner, where you can click to set operator positions.
|
||||
- If you export the JSON after entering the stage name and then start an operation, a map image with coordinate information will be generated in the `debug\map` folder in your MAA directory.
|
||||
- Use [PRTS.Map](https://map.ark-nights.com/areas) and change the `Coordinate Display` to `MAA` in settings.
|
||||
- Practice plans are supported.
|
||||
- We recommend including your name (as author), reference video links, and other helpful information in the operation description.
|
||||
- You're welcome to join the QQ group [1169188429](https://jq.qq.com/?_wv=1027&k=QZcGcJ9G) to discuss operation creation and related topics.
|
||||
|
||||
@@ -5,15 +5,13 @@ icon: solar:shop-2-bold
|
||||
|
||||
# Credit Store
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
|
||||
- Automatically visit friends to obtain credit points and go to the credit store for shopping.
|
||||
- With the help of combat credit:
|
||||
- Use a support operator to clear the `OF-1` stage in Heart of Surging Flame. If the stage is not unlocked, please do not select this option.
|
||||
- It does not take effect when the stage selection is set to `Cur/Last`.
|
||||
- Automatically visits friends to obtain credit points and shops at the credit store.
|
||||
- Support for earning credits through combat:
|
||||
- MAA will use a support operator to clear the `OF-1` stage from Heart of Surging Flame. Please ensure this stage is unlocked.
|
||||
- This feature won't activate when the stage selection is set to `Current/Last`.
|
||||
|
||||
## Advanced Settings
|
||||
|
||||
- Whitelist and Blacklist are keyword matches, for example, filling in `碳` (Carbon Stick) will match `碳` (Carbon Stick) and `碳素` (Carbon Brick). May still require only the original Chinese as input.
|
||||
- `Stop purchasing items when credits are below 300` will still purchase whitelist items even when below 300.
|
||||
- Both priority purchase items and blacklist use keyword matching. For example, entering `Carbon` will match both `Carbon Stick` and `Carbon Brick`.
|
||||
- You can use either English semicolons `;` or Chinese semicolons `;` as separators.
|
||||
- When `Stop purchasing items when credits are below 300` is enabled, priority purchase items will still be bought even when below 300 credits.
|
||||
|
||||
@@ -3,29 +3,34 @@ order: 4
|
||||
icon: material-symbols:view-quilt-rounded
|
||||
---
|
||||
|
||||
# Base
|
||||
# Base Management
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
## Normal Mode
|
||||
|
||||
## Workshift Strategy
|
||||
### Shift Strategy
|
||||
|
||||
- Automatically calculate and choose the **optimal solution within a single facility**. Supports all general and special skill combinations.
|
||||
- Supports recognition of Battle Record, Pure Gold, Originium Shard, Chip and so on for different operators.
|
||||
- Automatically use drones according to the selected `drone usage`.
|
||||
- Recognizes the percentage of the Morale bar. When Morale is below some threshold, the operator will be moved to the dormitory.
|
||||
- Automatically calculates and selects the **optimal solution within a single facility**, supporting all generic skill combinations and special skill synergies.
|
||||
- Automatically identifies EXP Records, Gold Bars, Originium Shards, and Chips, deploying appropriate operator combinations for each.
|
||||
- Automatically uses drones according to the selected `Drone Usage` setting.
|
||||
- Automatically detects morale levels and assigns operators with remaining morale percentage below the `Base Facility Morale Threshold` to dormitories.
|
||||
|
||||
## Note
|
||||
### Additional Notes
|
||||
|
||||
- The work shift strategy is based on the optimal solution within a single facility instead of multiple facilities. Combinations such as: `Shamare-Tequila`, `Vermeil-Scene` within a single facility can be recognized correctly; while combinations like `Rosmontis`, `Pinus Sylvestris` among facilities are not supported yet.
|
||||
- If `Usage of Drone` is selected with the option `Trading Post-LMD`, it will recognize `Shamare` and reserve it for her.
|
||||
- Operators of the corresponding faction will be selected when only one Clue is needed in the Reception Room; otherwise, general operators will be chosen.
|
||||
- The reception Room will send out Clues only when your Clues are full. Three Clues will be sent out at most. If wanted, you can edit the number of sent Clues in the `ClueSelected` - `maxTimes` field in `resource/tasks/tasks.json`.
|
||||
- If you do not want operators like `Irene` or someone else to be put into the dormitory when the training room is not in use, you can switch off `Working operator shall not be put into the dormitory` in the settings. Note that this may cause the operators with non-full fatigue to not enter the dormitory as well.
|
||||
- Due to the complexity of the Control Center, only `Amiya`, `Swire`, `Kal'tsit`, `Team Rainbow` and other Morale+0.05 operators will be considered. To be improved in future.
|
||||
- Some alternate operators may have conflicts in Infrastructure. Please take note if there are "Operator conflict" warnings on the UI, and double check the Infrastructure to shift manually (e.g. some facilities may not have any operator).
|
||||
- You can choose the facility categories that need to be handled by MAA, with all selected by default.
|
||||
- Base shift management currently optimizes for single-facility efficiency, not cross-facility global optimization.
|
||||
- Recognizable and usable examples: `Shamare + Tequila`, `Vermeil + Scene`.
|
||||
- Unrecognizable examples: `Rosmontis System`, `Pinus Sylvestris Knights`.
|
||||
- When `Drone Usage` is set to `Trading Post - LMD`, the `Shamare Group` will be prioritized.
|
||||
- Reception Room selects operators with corresponding clue affinity when only one clue type is missing; otherwise selects generic operators.
|
||||
- Reception Room only sends clues when your collection is full, and sends only three at a time. To customize the number sent, modify the `ClueSelected` - `maxTimes` field in `resource/tasks/tasks.json` in the MAA directory.
|
||||
- Enabling `Do not place stationed operators in dormitory` prevents operators like `Irene` and `Logos` from being assigned to dormitories when not training in the Training Room, but also prevents operators with low morale in the Processing Station from being moved to dormitories.
|
||||
- Control Center strategy is complex; currently only considers `Amiya`, `Swire`, `Kal'tsit`, `Team Rainbow`, and other operators with +0.05 morale bonus. This will be gradually optimized.
|
||||
- You can select which facility types MAA should manage (all are selected by default).
|
||||
|
||||
## Custom infrastructure shift change (Beta)
|
||||
## Preset Rotation Mode
|
||||
|
||||
- Several sets of extremely efficient tasks are built-in under the MAA folder `/resource/custom_infrast/`, which can be used as a reference. Due to its high requirements for operators and their levels, it is not recommended for direct use.
|
||||
- This mode requires preset squads configured in-game. MAA will automatically rotate through them.
|
||||
|
||||
## Custom Base Mode
|
||||
|
||||
- The [Schedule Generator](https://ark.yituliu.cn/tools/schedule) created by community experts can help you create custom schedules. Refer to the [Base Facility Protocol Documentation](../../protocol/base-scheduling-schema.md) for usage.
|
||||
- The MAA folder `/resource/custom_infrast/` contains built-in theoretically maximum-efficiency presets. Not recommended for direct use due to their extreme operator and elite/skill level requirements.
|
||||
|
||||
@@ -3,59 +3,59 @@ order: 7
|
||||
icon: ri:game-fill
|
||||
---
|
||||
|
||||
# Integrated Strategy (I.S.)
|
||||
# Auto Integrated Strategy
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
|
||||
MAA selects the latest theme by default, and can be changed in `Auto I.S.` - `General`.
|
||||
MAA selects the latest theme by default, which can be changed in `Auto Integrated Strategy` - `Integrated Strategy Theme`.
|
||||
|
||||
::: warning
|
||||
All features involving auto-battle require a stable game frame rate of at least 60 frames, including but not limited to Copilot and Auto I.S..
|
||||
All features involving automatic combat require a stable game frame rate of at least 60 FPS, including but not limited to Auto Combat and Integrated Strategy.
|
||||
:::
|
||||
|
||||
- Please pin the corresponding I.S. theme to the terminal of the game. Although automatic navigation is currently available, long-term usability is not guaranteed.
|
||||
- If there is an exploration of non-target themes (such as if you plan to use MAA to auto Mizuki, but there is still an unfinished exploration of Phantom), please end it manually.
|
||||
- MAA will not automatically select the difficulty. If the difficulty is not selected, it will get stuck/repeatedly enter and exit the difficulty selection interface.
|
||||
- In the settings, you can choose the team, starting operator (only one operator name), etc.
|
||||
- Please pin the corresponding Integrated Strategy theme at the terminal in-game. Although automatic navigation is currently possible, long-term functionality is not guaranteed.
|
||||
- Please manually end explorations of **non-target themes** in advance to ensure the target theme is ready to start exploration.
|
||||
- You can select theme, difficulty, squad, starting operator (single operator name only), and more in settings.
|
||||
- MAA can use support operators to start, by first entering the target operator name in `General Settings` → `Starting Operator` and then enabling `Advanced Settings` → `Use support unit for "Starting Operator"`.
|
||||
- When playing for the **first time** in a newly installed client:
|
||||
- The difficulty selection button will not be displayed. Please manually select a difficulty once in-game, after which MAA can select it automatically.
|
||||
- Tutorials will appear after entering the map screen. Please read and close them manually.
|
||||
|
||||
## Recommended Starting Strategies
|
||||
## Recommended Starts
|
||||
|
||||
MAA can start with a support operator, which need to enable the option `Auto I.S.` → `Advanced` → `Select "Starting Operator" from support unit list`.
|
||||
::: details _Last updated 2025/8/2_
|
||||
|
||||
::: details
|
||||
| Theme | Difficulty | Squad | Strategy | Operator |
|
||||
| ------- | ----------------- | --------------------------------------- | ------------------------- | --------- |
|
||||
| Phantom | Formal Investigation·3~7 | Leader Squad / Tactical Assault Squad | Overcoming Your Weaknesses | Thorns |
|
||||
| Mizuki | Surging Waves·3~7 | People-Oriented Squad / Mind Over Matter Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
| Sami | Braving Nature·4~10 | Special Training Squad / Tactical Ranged Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
| Sarkaz | Face the Spirit·4~10 | Blueprint Mapping Squad / Tactical Ranged Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
| Garden | Enter the Garden·3~10 | Leader Squad / Tactical Ranged Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
|
||||
| Theme | Difficulty | Squad | Strategy | Operators |
|
||||
| ------- | -------------------- | ----------------------------------------------- | ----------------------------- | --------------------- |
|
||||
| Phantom | Formal Investigation | Leader Squad / Tactical Assault Squad | Overcoming Your Weaknesses | Thorns |
|
||||
| Mizuki | Surging Waves·3 | People-Oriented Squad / Mind Over Matter Squad | Overcoming Your Weaknesses | Gavial the Invincible |
|
||||
| Sami | Braving Nature·4 | Special Training Squad / Tactical Ranged Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
| Sarkaz | Face the Spirit·4 | Blueprint Mapping Squad / Tactical Ranged Squad | Slow and Steady Wins the Race | Wiš'adel |
|
||||
The recommended difficulties consider factors like `enemy difficulty`, `hope consumption`, and `score multiplier`, and have been tested to be stable with high-level operators. Feel free to adjust based on your situation and needs.
|
||||
|
||||
The recommended difficulty level is the one without the `Enemy Difficulty` and `Desired Consumption` bonuses. It is relatively stable when tested at a high level and can be adjusted freely according to actual conditions and needs.
|
||||
|
||||
| Theme | Notes |
|
||||
| ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| Phantom | In the `Face the Disaster` difficulty, you may obtain a collection that will deduct your hopes, resulting in the inability to recruit six-star operators at the beginning of the game. |
|
||||
| Mizuki | The cost of recruiting six-star operators in `Surging Waves·4` and higher difficulties is increased by 1. It may be impossible to recruit six-star operators when using `Mind over Matter Squad` at the beginning.<br>`People-Oriented Squad` work best with People-Oriented; `Mind Over Matter` Squad requires a bit of luck. |
|
||||
| Sami | The cost of recruiting six-star operators in `Braving Nature·5` and higher difficulties is increased by 1. It may be impossible to recruit six-star operators when using `Special Training Squad` at the beginning. |
|
||||
| Sarkaz | The cost of recruiting six-star operators in `Face the Spirit·5` and higher difficulties is increased by 1. It may be impossible to recruit six-star operators when using `Blueprint Mapping Squad` at the beginning.<br>Selecting the `Blueprint Mapping Squad` results in a completely stealth-oriented strategy, means that it is basically impossible to pass the ending. |
|
||||
| Theme | Notes |
|
||||
| ------- | ----- |
|
||||
| Phantom | `Formal Investigation·4` and higher difficulties may give hope-reducing collectibles at start, preventing recruitment of six-star operators. |
|
||||
| Mizuki | `Surging Waves·4` and higher difficulties increase six-star operator hope cost by +1, making it potentially impossible to recruit them with `Mind Over Matter Squad`.<br>`People-Oriented Squad` is better for high-level accounts, while `Mind Over Matter Squad` requires luck. |
|
||||
| Sami | `Braving Nature·6` and higher difficulties increase six-star operator hope cost by +1, potentially making it impossible to recruit them with `Special Training Squad`. |
|
||||
| Sarkaz | `Face the Spirit·15` and higher difficulties increase six-star operator hope cost by +1, potentially making it impossible to recruit them with `Blueprint Mapping Squad`.<br>With `Blueprint Mapping Squad`, MAA will adopt an avoidance strategy to quickly obtain `Spirit Bookmarks`, but generally cannot complete endings.<br>When using the Originium Ingot farming strategy with `Point-Stab Ingot Squad`, MAA will use shop refreshing to speed up the process. |
|
||||
| Garden | `Enter the Garden·15` and higher difficulties increase six-star operator hope cost by +1, potentially making it impossible to recruit them with `Leader Squad`.<br>When set to `Enter the Garden·3` difficulty with the Originium Ingot farming strategy and `Leader Squad`, MAA will use the `End of Time` stage-skip strategy to speed up the process. |
|
||||
|
||||
:::
|
||||
|
||||
## Battle Strategy
|
||||
## Combat Strategy
|
||||
|
||||
All operations in automatic Integrated Strategy are pre-set strategies, and all stage battles use built-in job files. When the corresponding mission for the level does not exist, a general decision tree, which is not very smart, will be used for the battle.
|
||||
All MAA operations in Integrated Strategy use preset strategies, with all combat stages using built-in operation files. When no operation exists for a specific stage, a basic (not very intelligent) decision tree handles combat.
|
||||
|
||||
For more details, please refer to the [Integrated Strategy Schema](../../protocol/integrated-strategy-schema.md).
|
||||
For details, see the [Integrated Strategy Protocol](../../protocol/integrated-strategy-schema.md).
|
||||
|
||||
- It supports automatic recognition of operators and proficiency and automatically selects better operators and skills.
|
||||
- It supports identifying store items and prioritizes purchasing more powerful relics.
|
||||
- Automatically recognizes operators and their levels, selecting optimal operators and skills.
|
||||
- Recognizes shop items and prioritizes purchasing more powerful collectibles.
|
||||
|
||||
## Abnormal Detection
|
||||
## Exception Handling
|
||||
|
||||
- It supports reconnection after disconnection and supports continuation to auto after 4 a.m. server reset.
|
||||
- Encounters longer than 5 minutes will automatically retreat all ground units, and longer than 6 minutes will automatically abandon the operation to avoid wasting time/getting stuck.
|
||||
- If the exploration gets stuck, it will automatically abandon and retry.
|
||||
- Automatically reconnects and continues tasks after disconnections or the 4 AM server reset.
|
||||
- For battles exceeding 5 minutes, automatically retreats all ground units; after 6 minutes, abandons the battle to avoid time-consuming deadlocks.
|
||||
- If a task encounters problems, automatically abandons the current exploration and retries.
|
||||
|
||||
However, if it often gets stuck in a certain place and then gives up, seriously affecting efficiency, please feel free to submit an issue for feedback.
|
||||
If the program repeatedly gets stuck at the same point, please submit an Issue with logs
|
||||
|
||||
@@ -5,45 +5,38 @@ icon: icon-park-solid:other
|
||||
|
||||
# Others
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
## GPU-Accelerated Inference
|
||||
|
||||
## GPU-accelerated inference
|
||||
Uses DirectML to call the GPU for recognition inference acceleration<sup>[PR](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/9236)</sup>, reducing CPU usage significantly with minimal GPU usage. Recommended to enable.
|
||||
|
||||
Use DirectML to call the GPU for recognition and inference acceleration.<sup>[PR](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/9236)</sup>It can reduce a significant amount of CPU usage with minimal GPU usage, and it's recommended to enable it.
|
||||
Testing has shown that some graphics cards may experience recognition issues when using this feature due to missing functionality or lower performance. MAA has built-in a blacklist for certain GPUs<sup>[PR1](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/9990)[PR2](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/12134)</sup>. If you encounter recognition issues with GPUs not on the blacklist after enabling this feature, please submit an Issue.
|
||||
|
||||
Testing has shown that some graphics cards may encounter recognition issues when using this feature due to lacking certain functions or having lower performance. MAA has already built-in a blacklist for some GPUs.<sup>[PR](https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/9990)</sup>If graphics cards not on the list also encounter recognition issues after enabling this feature, please submit an issue.
|
||||
## One-Time Only
|
||||
|
||||
## Only Once
|
||||
Configuration changes in the main interface and settings are usually saved automatically, but the following will reset after MAA restarts:
|
||||
|
||||
Configuration changes in the main interface and settings are usually saved automatically, but the following types will reset after MAA is restarted.
|
||||
- Options marked with an `*`
|
||||
- Options marked with `(One-time only)`
|
||||
- Half-selected checkboxes obtained by right-clicking
|
||||
|
||||
- Options marked with a `*`
|
||||
- Options marked with `(Only Once)`
|
||||
- Semi-selected switches obtained by right-clicking the checkbox
|
||||
## Auto-Switch Configuration at Startup
|
||||
|
||||
## Automatically switch configurations on startup
|
||||
MAA supports automatically switching configurations via launch parameters by adding `--config <configuration name>` after the MAA process name. Example: `./MAA/MAA.exe --config Official`.
|
||||
|
||||
MAA supports automatic configuration switching through launch parameters by appending `--config <configuration name>` after the MAA process name.
|
||||
Example: `./MAA/MAA.exe --config Official`.
|
||||
Some characters need to be escaped according to JSON conventions. Example: when the configuration name is `"Official"`, the parameter should be `--config \"Official\"`.
|
||||
|
||||
Some symbols need to be escaped, following Json conventions.
|
||||
Example: when the configuration name is `"Official"`, the parameter should be `--config \"Official\"`.
|
||||
## Start/End Scripts
|
||||
|
||||
## Pre/Post-Script
|
||||
|
||||
Starting from v4.13.0, it is possible to set pre/post-script that automatically executes batch files before and after the task.
|
||||
|
||||
You need to provide the absolute or relative path to the batch file, which should have a `.bat` extension.
|
||||
Since v4.13.0, MAA supports setting scripts to run before starting and after finishing tasks. Enter the absolute or relative path to a batch file (`.bat`) in the input field.
|
||||
|
||||
## Configuration Migration
|
||||
|
||||
In the Windows version, all MAA configurations are stored in the `gui.json` file within the `config` folder. Migrating this folder will transfer all MAA settings.
|
||||
In the Windows version, all MAA configurations are stored in `gui.json` inside the `config` folder. Migrating this folder transfers all MAA settings.
|
||||
|
||||
## Note
|
||||
## Additional Notes
|
||||
|
||||
- Tasks order can be changed on the UI. So can the shifting order in the infrastructure.
|
||||
- All clicking event is randomized within a region, following Poisson distribution (higher probability at the center, lower probability around).
|
||||
- Developed in C++, the core algorithm supports multi-level cache, to reduce CPU and memory usage as much as possible.
|
||||
- Our software supports auto-update ✿✿ ヽ(°▽°)ノ ✿ Beta-testers can try beta versions, which update faster and less buggy (maybe).
|
||||
- If auto-update fails, you can download the OTA package manually and put the ZIP file under the same directory. The update will start automatically.
|
||||
- Tasks on the left side of the main page can be dragged to change their order, as can facilities in the base management settings.
|
||||
- All click operations target random positions within buttons, following a Poisson distribution (higher probability at the center, decreasing with distance from center).
|
||||
- The core algorithms are developed in C++ with multi-level caching to minimize CPU and memory usage.
|
||||
- The software supports automatic updates ✿✿ ヽ(°▽°)ノ ✿. We recommend non-critical users try the beta version, which typically updates faster and has fewer bugs. (What MIUI? (╯‵□′)╯︵┻━┻)
|
||||
- If automatic downloads fail for new versions, you can manually download the OTA package and place it in the MAA directory for automatic updating.
|
||||
|
||||
@@ -3,22 +3,19 @@ order: 8
|
||||
icon: solar:streets-map-point-linear
|
||||
---
|
||||
|
||||
# Reclamation Algorithm (R.A.)
|
||||
# Reclamation Algorithm
|
||||
|
||||
::: important This page may be outdated and not yet implemented for Global.
|
||||
:::
|
||||
|
||||
Currently, the support for Reclamation Algorithm is still in the early stages, and it is not recommended to run it unattended. Stability cannot be guaranteed at this stage.
|
||||
Currently, support for Reclamation Algorithm is still in early stages and unattended operation is not recommended, as stability cannot be guaranteed at this time.
|
||||
|
||||
## Default Mode
|
||||
|
||||
1. You need to start the task on the main interface of R.A.. (navigation is not yet written)
|
||||
2. Cannot be used if there is already a save file. (just delete the existing save file)
|
||||
3. Cannot be used if there are operators in the R.A. squad. (just clear the current squad in R.A., especially after finishing a wave)
|
||||
1. You need to start the task from the Reclamation Algorithm main interface (navigation not yet implemented)
|
||||
2. Cannot be used when you already have an existing save file (delete the existing save to use)
|
||||
3. Cannot be used when operators are present in the Reclamation Algorithm squad (clear the current squad, especially after completing a wave)
|
||||
|
||||
## Points farm through crafting
|
||||
## Manufacturing Points Farm
|
||||
|
||||
1. You need to start on the page where you can see the base camp after entering R.A..
|
||||
2. If the item name is not filled in, the default is to craft Glow Sticks.
|
||||
3. Prerequisite: It is the first day after settlement, and no enemy raids are entering the base camp for the next three days.
|
||||
4. If the number that can be manufactured is exactly a multiple of 99, it will get stuck. You can use up a bit before saving, this will be fixed later.
|
||||
1. You need to start from the page where you can see the base camp after entering Reclamation Algorithm
|
||||
2. If no item name is specified, Glow Sticks will be crafted by default
|
||||
3. Prerequisite: It must be the first day after settlement, with no enemy raids entering the base camp for the next three days
|
||||
4. If the manufacturable quantity is exactly a multiple of 99, the process may get stuck. You can use up a small amount before saving; this issue will be fixed in the future
|
||||
|
||||
@@ -3,21 +3,18 @@ order: 2
|
||||
icon: fluent:people-24-filled
|
||||
---
|
||||
|
||||
# Recruit
|
||||
# Recruitment
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
Auto Recruitment and [Recruitment Recognition](./tools.md#recruitment-recognition) are two different features!
|
||||
|
||||
The Recruit option in the 'Farming' tab and [recruitment recognition](./tools.md#recruitment-recognition) are two different features, though most options from the tool are in the recruit option as well.
|
||||
## Auto Recruitment
|
||||
|
||||
## Auto-recruitment
|
||||
Supports automatic use of `Expedited Plans`, allows setting maximum recruitment times per task, and can be combined with `Auto use Expedited Plans` to quickly use up all recruitment permits.
|
||||
|
||||
Auto-recruitment supports using `Expedited Plan` to make it fully automated. Please enable `Auto use Expedited Plan` and modify `Recruit max times` in `Recruit` - `General`.
|
||||
Pop-up notifications will appear when 1★, 5★, or 6★ tags are detected.
|
||||
|
||||
Pop-up notification when 1★, 5★, 6★ operators are recruited.
|
||||
|
||||
Auto-uploading recruitment data to [Penguin Stats](https://penguin-stats.io/) and [Yituliu](https://ark.yituliu.cn/) while auto-recruitment.
|
||||
Recruitment tag data is automatically uploaded to [Penguin Statistics](https://penguin-stats.io/) and [Yituliu](https://ark.yituliu.cn/) when refreshing recruitment.
|
||||
|
||||
## Advanced Settings
|
||||
|
||||
`Auto confirm` means MAA automatically selects tags and recruits, while `Manually confirm` means no automatic selection and recruitment.
|
||||
`Auto confirm` means MAA automatically selects tags and performs recruitment, while `Manual confirm` means no automatic tag selection or recruitment is performed.
|
||||
|
||||
@@ -5,9 +5,6 @@ icon: lucide:gift
|
||||
|
||||
# Rewards
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
|
||||
Automatically claim daily rewards and weekly rewards.
|
||||
Automatically claims daily rewards and weekly rewards.
|
||||
|
||||
Other reward types are also supported, please check the settings for details.
|
||||
|
||||
@@ -5,21 +5,20 @@ icon: ic:round-rocket-launch
|
||||
|
||||
# Startup
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
Automatically starts the emulator, launches the client, and enters the game.
|
||||
|
||||
Automatically start the emulator, start the client and enter the game.
|
||||
|
||||
Additional settings are required to automatically start the emulator. For details, see the startup settings, and enable `Retry launching the emulator when ADB connection fails` in the connection settings.
|
||||
Automatic emulator startup requires additional configuration in the startup settings and enabling `Retry launching the emulator when ADB connection fails` in the connection settings.
|
||||
|
||||
## Account Switch
|
||||
|
||||
This feature needs to be used together with configuration switching or scheduled execution. An account switch operation will be performed each time the `Startup` task is executed.
|
||||
|
||||
Only supports switching to logged-in accounts. Use the login name to search. Please ensure that the input content is unique among all logged-in accounts. Does not work on the global version.
|
||||
Only supports switching to already logged-in accounts, using the login name for identification. Please ensure that the input content is unique among all logged-in accounts.
|
||||
|
||||
Example CN:`123****8901` can be input `123****8901`、`123`、`8901`、`3****8`.
|
||||
- Examples:
|
||||
- Official server: `123****8901` can be entered as `123****8901`, `123`, `8901`, or `3****8`
|
||||
- Bilibili server: `Zhang San` can be entered as `Zhang San`, `Zhang`, or `San`
|
||||
|
||||
## Connection
|
||||
## Connection Settings
|
||||
|
||||
[Click me](../connection.md)
|
||||
[Click here](../connection.md)
|
||||
|
||||
@@ -5,53 +5,46 @@ icon: octicon:tools-16
|
||||
|
||||
# Tools
|
||||
|
||||
::: important This page may be outdated.
|
||||
:::
|
||||
|
||||
## Recruitment Recognition
|
||||
|
||||
Open the Recruit tag interface and click Start Recognition to initiate.
|
||||
Open the Recruitment tag interface and click Start Recognition to initiate.
|
||||
|
||||
If you have previously run Operator recognition, potential data will be displayed after the recognized Operator's name.
|
||||
If you have previously run Operator Recognition, potential data will be displayed after the recognized operator's name.
|
||||
|
||||
## Operator Recognition (Beta)
|
||||
|
||||
Can recognize the list of owned and unowned Operators, and recognize and save potential data for display in Recruitment recognition.
|
||||
Can recognize lists of both owned and unowned operators, and identify potential levels to provide data for Recruitment Recognition.
|
||||
|
||||
## Depot Recognition (Beta)
|
||||
|
||||
Support automatically entering the depot from the main page. If the automatic jump fails, please manually switch to the `Upgrade materials` screen and slide to the far left to start the function.
|
||||
Supports automatically entering the depot from the main page. If automatic navigation fails, please manually switch to the `Upgrade Materials` screen and **scroll all the way to the left** before starting the function.
|
||||
|
||||
Currently, exporting is supported to [Penguin-Stats](https://penguin-stats.cn/planner), [Arknights Toolbox](https://arkntools.app/#/material), and [Arknights | Planner](https://ark-nights.com/settings).
|
||||
Currently supports exporting to [Penguin Statistics Planner](https://penguin-stats.io/planner), [Arknights Toolbox](https://arkntools.app/#/material), and [Arknights | Planner](https://ark-nights.com/settings).
|
||||
|
||||
Please feel free to contact us if you hope to integrate with our JSON schema.
|
||||
If you are the administrator of a data site, we welcome you to contact us to adapt your site's material JSON protocol!
|
||||
|
||||
More useful features **may** be added in the future.
|
||||
More useful features may be added in the future. (Teaser)
|
||||
|
||||
## Task Video Recognition (Alpha)
|
||||
|
||||
It can recognize strategy videos and automatically generate job files. Drag the video files into the `Copilot` tab page to start.
|
||||
Can recognize strategy videos and automatically generate operation files. Simply drag video files into the Auto Combat page to start.
|
||||
|
||||
Only 16:9 aspect ratio videos with a resolution of 720p or higher are supported. The video content must not contain any black borders, distortion correction, emulator borders or other elements.
|
||||
Requires 16:9 aspect ratio with 720p or higher resolution, with no black borders, emulator frames, notched screen adaptations, or other interfering elements.
|
||||
|
||||
## Gacha
|
||||
|
||||
**It really uses your account to draw your cards! It really uses your account to draw your cards!**
|
||||
**It really uses your account to draw your cards! It really uses your account to draw your cards!**
|
||||
**It really uses your account to draw your cards! It really uses your account to draw your cards!**
|
||||
::: center
|
||||
**It really uses your account to pull operators  It really uses your account to pull operators  It really uses your account to pull operators**  
|
||||
**It really uses your account to pull operators  It really uses your account to pull operators  It really uses your account to pull operators**  
|
||||
**It really uses your account to pull operators  It really uses your account to pull operators  It really uses your account to pull operators**  
|
||||
:::
|
||||
|
||||
Didn't get a spot in [NiuNiu Airlines](https://www.bilibili.com/opus/926129394412421126)? No problem! Now everyone has their own NiuNiu Airlines! And it will take screenshots and display them in the center of the interface during the draw!
|
||||
|
||||
<!-- markdownlint-disable -->
|
||||
|
||||
_(WTF is NiuNiu Airlines)_
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
Couldn't join the MAA Gacha Party livestreams? No problem! Now you can have your own personal gacha assistant! Screenshots will be taken during the pulling process and displayed in the center of the interface!
|
||||
|
||||
## Peep
|
||||
|
||||
Want to see the world through MAA's eyes? It's here now!
|
||||
Want to see the world through MAA's eyes? Now you can!
|
||||
|
||||
MAA will attempt to take screenshots of the emulator at the target frame rate and display the screenshots in real time in the window.
|
||||
MAA will attempt to take screenshots of the emulator at the target frame rate and display them in real-time in the window.
|
||||
|
||||
When the screenshot speed is significantly slower than the target frame rate, MAA will actively lower the target frame rate to match the screenshot speed. ~~Can be used as a stress test~~
|
||||
When the screenshot speed is significantly slower than the target frame rate, MAA will automatically reduce the target frame rate to match the screenshot speed. ~~Can be used as a stress test~~
|
||||
|
||||
@@ -5,65 +5,68 @@ icon: ri:guide-fill
|
||||
|
||||
# Getting Started
|
||||
|
||||
## Preparation
|
||||
Quick start guide!
|
||||
|
||||
## Prerequisites
|
||||
|
||||
1. Confirm system version
|
||||
|
||||
MAA only supports Windows 10 / 11. For earlier versions of Windows, please refer to [FAQ](./faq.md#SystemIssues).
|
||||
MAA on Windows only supports Windows 10 and 11. For older Windows versions, please refer to the system issues section in [FAQ](./faq.md#system-issues).
|
||||
|
||||
Non-Windows users, please refer to [Emulator and Device Supports](./device/).
|
||||
Non-Windows users, please refer to [Emulator and Device Support](./device/).
|
||||
|
||||
2. Download the correct version
|
||||
|
||||
[MAA official website](https://maa.plus/) will automatically select the correct version architecture, which for most users reading this article should be Windows x64.
|
||||
The [MAA official website](https://maa.plus/) will automatically select the correct architecture for most users reading this article, which should be Windows x64.
|
||||
|
||||
3. Unzip correctly
|
||||
3. Extract correctly
|
||||
|
||||
Verify that the extraction is complete and make sure to extract the MAA to a separate folder. Do not extract MAA to a path that requires UAC permissions such as `C:\`, `C:\Program Files\`, etc.
|
||||
Ensure the extraction is complete, and make sure to extract MAA to a separate folder. Do not extract MAA to paths requiring UAC permissions such as `C:\` or `C:\Program Files\`.
|
||||
|
||||
4. Install the runtime library
|
||||
4. Install runtime libraries
|
||||
|
||||
MAA requires VCRedist x64 and .NET 8. Please run `DependencySetup_依赖库安装.bat` in the MAA directory to install.
|
||||
MAA requires VCRedist x64 and .NET 8. Please run `DependencySetup_依赖库安装.bat` in the MAA directory to install them.
|
||||
|
||||
Refer to [FAQ](faq.md#missing-runtime-libraries) for more information
|
||||
For more information, please refer to the pinned section in [FAQ](./faq.md).
|
||||
|
||||
5. Confirm simulator support
|
||||
5. Confirm emulator support
|
||||
|
||||
Check [Emulator Supports](./device/) to confirm the support of the emulator you are using.
|
||||
Check [Emulator and Device Support](./device/) to verify the compatibility of your emulator.
|
||||
|
||||
6. Correctly set the emulator resolution
|
||||
6. Set the correct emulator resolution
|
||||
|
||||
The emulator resolution should be `1280x720` or `1920x1080` in landscape mode; for YostarEN, the only supported resolution is `1920x1080`.
|
||||
Emulator resolution should be landscape `1280x720` or `1920x1080`; for YostarEN players, it must be `1920x1080`.
|
||||
|
||||
## Initial
|
||||
## Initial Configuration
|
||||
|
||||
0. If you'd like to use automatic detection, run **one** emulator and make sure no other Android devices are connected to the computer.
|
||||
0. If you want to use automatic detection, run **one** emulator and ensure no other Android devices are connected to your computer.
|
||||
|
||||
1. Follow the setup guide to configure, and MAA will automatically detect the running emulator. If the detection fails or you'd like to run multiple emulators, please check [Connection](./connection.md).
|
||||
1. Follow the setup guide for configuration. MAA will automatically detect the running emulator. If detection fails or you need multiple instances, refer to [Connection Settings](./connection.md).
|
||||
|
||||
2. ~~A hot update will be performed when MAA is run for the first time. Please close MAA and restart after prompting in the log on the right.~~
|
||||
2. ~~When running MAA for the first time, it will perform a hot update. Please close and restart MAA when prompted in the log on the right.~~
|
||||
|
||||
3. Drag the task list on the left to sort the tasks, and check or uncheck the checkboxes to select
|
||||
the tasks to be run.
|
||||
3. Drag the task list on the left to reorder tasks, and check or uncheck the checkboxes to select tasks to run.
|
||||
|
||||
4. Link Start!
|
||||
|
||||
## Advanced configuration
|
||||
## Advanced Configuration
|
||||
|
||||
Check out the documentation.
|
||||
Read the documentation!
|
||||
|
||||
## Other
|
||||
## Other Notes
|
||||
|
||||
::: center
|
||||
**When encountering problems, read the documents please.**
|
||||
**When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**
|
||||
**When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**
|
||||
**When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**    **When encountering problems, read the documentation, read the documentation, read the documentation!**
|
||||
:::
|
||||
|
||||
1. The log files are located in the folder under the MAA folder which is named `debug`. Logs are important. When asking others for help, be sure to take `asst.log` and `gui.log` with you.
|
||||
1. The logs are located in the `debug` folder inside the MAA directory. Logs are extremely important. When seeking help from others, always bring both `asst.log` and `gui.log` with you.
|
||||
|
||||
2. To meet the various needs of all users as much as possible, MAA provides a large number of customization options. When you find that MAA lacks a certain function, it may be because it is not easily discoverable rather than non-existent, such as `Manual entry of stage names` and `Do not put stationed operators in Dormitory`.
|
||||
2. MAA provides many customization options to meet all users' various needs. If you think MAA is missing a feature, it might just be hard to find rather than non-existent, such as `Manual stage name input` and `Do not place stationed operators in dormitory`.
|
||||
|
||||
3. Placing the mouse pointer on some options will give detailed instructions, such as `Do not put stationed operators in Dormitory`.
|
||||
3. Hovering your mouse pointer over certain options will display detailed explanations, such as `Do not place stationed operators in dormitory`.
|
||||
|
||||
4. For some checkboxes, right-click on them to change them to a half-selected state. The checkboxes in this state will be automatically cleared the next time MAA is started, which can be understood as `only once`.
|
||||
4. For some checkboxes, right-clicking will change them to a half-selected state. Checkboxes in this state will automatically clear when MAA is next started, which can be understood as `one-time only`.
|
||||
|
||||
5. ~~If you're uncertain about your needs, don't select the Nightly Release.~~
|
||||
5. ~~If you don't know what you need and can't easily resolve potential problems, do not use beta versions.~~
|
||||
|
||||
@@ -3,35 +3,34 @@ order: 6
|
||||
icon: material-symbols:view-quilt-rounded
|
||||
---
|
||||
|
||||
# Infrastructure Schedule Schema
|
||||
# Base Scheduling Protocol
|
||||
|
||||
This document is primarily machine-translated. If you have the ability, please take a look at the Chinese version. We would greatly appreciate any errors or suggestions for improvement.
|
||||
|
||||
Usage and Field Description for `resource/custom_infrast/*.json` files
|
||||
Usage and field descriptions for `resource/custom_infrast/*.json`
|
||||
|
||||
::: tip
|
||||
As the JSON format does not support comments, please remove them when using the examples below.
|
||||
Please note that JSON files do not support comments. The comments in this document are for demonstration purposes only. Do not copy them directly into your JSON files.
|
||||
:::
|
||||
|
||||
[Visual Schedule Generation Tool](https://ark.yituliu.cn/tools/schedule)
|
||||
[Visual Schedule Generator Tool](https://ark.yituliu.cn/tools/schedule)
|
||||
|
||||
## Complete Field List
|
||||
## Complete Field Reference
|
||||
|
||||
```json
|
||||
{
|
||||
"title": "小号的换班方案", // Assignment name, optional
|
||||
"description": "哈哈哈哈", // Assignment description, optional
|
||||
"title": "小号的换班方案", // Task name, optional ("小号的换班方案" = "Alt Account Shift Plan")
|
||||
"description": "哈哈哈哈", // Task description, optional ("哈哈哈哈" = "Hahaha")
|
||||
"plans": [
|
||||
{
|
||||
"name": "早班", // Plan name, optional
|
||||
"description": "lol", // Plan description, optional
|
||||
"description_post": "", // The description to display after executing the plan, optional
|
||||
"period": [ // Shift change period, optional
|
||||
// If the current time is within this interval, the plan will be automatically selected (there may be multiple plans in the entire JSON file)
|
||||
// If this field does not exist, it will automatically switch to the next plan after each run.
|
||||
// Core does not process this field. If you are using interface integration with MAA, please implement this logic on your own
|
||||
"name": "早班", // Plan name, optional ("早班" = "Morning Shift")
|
||||
"description": "lol", // Plan description, optional
|
||||
"description_post": "", // Description displayed after plan execution, optional
|
||||
"period": [
|
||||
// Shift time period, optional
|
||||
// If current time is within this range, this plan will be automatically selected (JSON file may contain multiple plans)
|
||||
// If this field doesn't exist, automatically switches to the next plan after each shift ends
|
||||
// Core doesn't process this field; if you're using MAA through integration, implement this logic yourself
|
||||
[
|
||||
"22:00", // In the hh:mm format, currently only simple numerical comparison is used. If it crosses midnight, please refer to the example in this file
|
||||
"22:00", // Format required: hh:mm, currently just compares number sizes, for cross-day periods follow this example
|
||||
"23:59"
|
||||
],
|
||||
[
|
||||
@@ -39,108 +38,98 @@ As the JSON format does not support comments, please remove them when using the
|
||||
"06:00"
|
||||
]
|
||||
],
|
||||
"duration": 360, // Work duration (in minutes), reserved field, currently unused. In the future, there may be reminders or automatic shift changes when the time comes
|
||||
"Fiammetta": { // Which operator is using "Fiammetta", optional, not required if not in use
|
||||
"enable": true, // Whether to use "Fiammetta", optional, default is true
|
||||
"target": "巫恋", // Target operator, which is obtained through OCR and needs to be passed in the name of the operator in the corresponding client language
|
||||
"order": "pre", // Whether to use it before or after the entire shift change, optional, with a value range of "pre" / "post", default is "pre"
|
||||
"duration": 360, // Work duration (minutes), reserved field, currently not used. May be used for shift change reminders in the future
|
||||
"Fiammetta": {
|
||||
// Which operator to use "Fiammetta" on, optional, omit if not using
|
||||
"enable": true, // Whether to use "Fiammetta", optional, default true
|
||||
"target": "巫恋", // Target operator, uses OCR, requires operator name in client language ("巫恋" = "Shamare")
|
||||
"order": "pre" // Use before entire shift change or after, optional, values "pre"/"post", default "pre"
|
||||
},
|
||||
"drones": { // For using drones. Optional. If not specified, drones won't be used.
|
||||
"enable": true, // Whether to use drones. Optional. The default is true.
|
||||
"room": "trading", // Which type of room to use drones for. Possible values: "trading" / "manufacture"
|
||||
"index": 1, // The index of the room to use drones for. Corresponds to the tab on the left. Possible values: [1, 5].
|
||||
"rule": "all", // Usage rules. Reserved field. Currently unused, but may be used in the future to support plug-ins and other operations.
|
||||
"order": "pre" // Whether to use drones before or after changing operators. Optional. Possible values: "pre" / "post". Default is "pre".
|
||||
"drones": {
|
||||
// Drone usage, optional, omit if not using drones
|
||||
"enable": true, // Whether to use drones, optional, default true
|
||||
"room": "trading", // Which room type to use drones on, values "trading"/"manufacture"
|
||||
"index": 1, // Which instance of that room type to use drones on, corresponds to left tab number, range [1, 5]
|
||||
"rule": "all", // Usage rule, reserved field, currently not used. May support plug/unplug operations in future
|
||||
"order": "pre" // Use before operator changes or after, optional, values "pre"/"post", default "pre"
|
||||
},
|
||||
"groups":[ // For "control" / "manufacture" / "trading", operator groups can be set
|
||||
"groups": [
|
||||
// For "control"/"manufacture"/"trading", you can set operator groups
|
||||
{
|
||||
"name":"A",
|
||||
"operators":[
|
||||
"古米",
|
||||
"银灰",
|
||||
"梅"
|
||||
"name": "古+银", // ("古+银" = "Gummy+Silver")
|
||||
"operators": ["古米", "银灰", "梅"] // ("古米" = "Gummy", "银灰" = "SilverAsh", "梅" = "Plum")
|
||||
},
|
||||
{
|
||||
"name": "清流", // ("清流" = "Purestream")
|
||||
"operators": ["清流", "森蚺", "温蒂"] // ("清流" = "Purestream", "森蚺" = "Eunectes", "温蒂" = "Weedy")
|
||||
}
|
||||
],
|
||||
"rooms": {
|
||||
// Room information, required
|
||||
// Values: "control"/"manufacture"/"trading"/"power"/"meeting"/"hire"/"dormitory"/"processing"
|
||||
// Missing rooms use default algorithm for shift change.
|
||||
// To skip a room, use skip field or uncheck the facility in software Task Settings - Base Management - General Settings
|
||||
"control": [
|
||||
{
|
||||
"operators": [
|
||||
"夕", // Uses OCR, requires operator name in client language ("夕" = "Dusk")
|
||||
"令", // ("令" = "Ling")
|
||||
"凯尔希", // ("凯尔希" = "Kal'tsit")
|
||||
"阿米娅", // ("阿米娅" = "Amiya")
|
||||
"玛恩纳" // ("玛恩纳" = "Closure")
|
||||
]
|
||||
}
|
||||
],
|
||||
"manufacture": [
|
||||
{
|
||||
"operators": ["芬", "稀音", "克洛丝"], // ("芬" = "Fang", "稀音" = "Scene", "克洛丝" = "Kroos")
|
||||
"sort": false // Whether to sort (by operators order above), optional, default false
|
||||
// Example: When using Scene, Pallas, Shamare, etc. with "sort": false, operator order may be scrambled, losing warm-up effect.
|
||||
// Using "sort": true can avoid this issue
|
||||
},
|
||||
{
|
||||
"skip": true // Whether to skip current room (by array index), optional, default false
|
||||
// If true, other fields can be empty. Only skips operator change operation, other actions like drone usage, clue exchange still occur
|
||||
},
|
||||
{
|
||||
"operators": ["Castle-3"],
|
||||
"autofill": true, // Use original algorithm to auto-fill remaining positions, optional, default false
|
||||
// If operators is empty, room uses original algorithm completely
|
||||
// If operators not empty, considers only single operator efficiency, not combination efficiency
|
||||
// May conflict with custom operators defined later, e.g., using operators needed later, use cautiously or place autofill rooms last
|
||||
"product": "Battle Record" // Current manufacturing product, optional.
|
||||
// If detected facility product doesn't match task setting, UI will show red warning; may have more uses in future
|
||||
// Values: "Battle Record"|"Pure Gold"|"Dualchip"|"Originium Shard"|"LMD"|"Orundum"
|
||||
},
|
||||
{
|
||||
"operators": ["多萝西"], // ("多萝西" = "Dorothy")
|
||||
"candidates": [
|
||||
// Backup operators, optional. Uses whoever's available until positions filled
|
||||
// Incompatible with autofill=true, i.e., autofill must be false when this array not empty
|
||||
"星源", // ("星源" = "Astgenne")
|
||||
"白面鸮", // ("白面鸮" = "Ptilopsis")
|
||||
"赫默" // ("赫默" = "Silence")
|
||||
]
|
||||
},
|
||||
{
|
||||
"name":"B",
|
||||
"operators":[
|
||||
"清流",
|
||||
"森蚺",
|
||||
"温蒂"
|
||||
"use_operator_groups": true, // Set true to use operator groups from groups field, default false
|
||||
"operators": [
|
||||
// When enabled, names in operators are interpreted as group names
|
||||
"古+银", // Will select groups by mood threshold and setting order ("古+银" = "Gummy+Silver")
|
||||
"清流" // If Gummy+Silver group has operators below threshold, will use Purestream group ("清流" = "Purestream")
|
||||
]
|
||||
}
|
||||
],
|
||||
"rooms": { // Room information. Required.
|
||||
// Possible values: "control" / "manufacture" / "trading" / "power" / "meeting" / "hire" / "dormitory" / "processing".
|
||||
// If a room is not specified, the default algorithm will be used to change operators.
|
||||
// To avoid changing operators in a specific room, use the "skip" field, or uncheck the corresponding facility in the software's infrastructure settings.
|
||||
"control": [
|
||||
{
|
||||
"operators": [ // The operators assigned to this room. Identified through OCR. Must be passed in the corresponding client language.
|
||||
"夕",
|
||||
"令",
|
||||
"凯尔希",
|
||||
"阿米娅",
|
||||
"玛恩纳"
|
||||
]
|
||||
}
|
||||
],
|
||||
"manufacture": [
|
||||
{
|
||||
"operators": [ // The operators assigned to this room.
|
||||
"芬",
|
||||
"稀音",
|
||||
"克洛丝"
|
||||
],
|
||||
"sort": false, // Whether to sort the operators according to the above order. Optional. Default is false.
|
||||
// For example: if using operators like "稀音", "帕拉斯", "巫恋", etc. and "sort": false, the order of operators may be disrupted, leading to a loss of preheating effect.
|
||||
// If "sort": true is used, this issue can be avoided.
|
||||
},
|
||||
{
|
||||
"skip": true // Whether to skip this room (corresponding to the array index). Optional. Default is false.
|
||||
// If true, all other fields can be empty. Only the operator change will be skipped. Other actions, such as drone usage and clue exchange, will proceed as usual.
|
||||
},
|
||||
{
|
||||
"operators": [
|
||||
"Castle-3"
|
||||
],
|
||||
"autofill": true, // Use the original algorithm to automatically fill the remaining positions. Optional, default to false.
|
||||
// If the operator's array is empty, the scheduling of the entire room will be based on the original algorithm.
|
||||
// If the operator's array is not empty, only the efficiency of individual operators will be considered, not the efficiency of the entire combination.
|
||||
// Be careful that conflicts may arise with the custom operators defined later, for example, if the operators needed later are used here; please use it with caution, or place the autofill room order at the end.
|
||||
"product": "Battle Record" // The current manufactured product, optional.
|
||||
// If the product recognized by the facility does not match the one set in the task, the interface will display a red warning message. More functions may be added in the future.
|
||||
// Possible values: "Battle Record" | "Pure Gold" | "Dualchip" | "Originium Shard" | "LMD" | "Orundum"
|
||||
},
|
||||
{
|
||||
"operators": [
|
||||
"多萝西"
|
||||
],
|
||||
"candidates": [ // Optional backup operators. Use whoever is listed until all positions are filled.
|
||||
// Not compatible with autofill=true. When this array is not empty, autofill should be set to false.
|
||||
"星源",
|
||||
"白面鸮",
|
||||
"赫默"
|
||||
]
|
||||
},
|
||||
{
|
||||
"use_operator_groups":true, // Set to true to use the grouping of operators in groups, default is false
|
||||
"operators":[ // When enabled, names in operators will be interpreted as group names
|
||||
"A", // Grouping will be selected according to mood threshold and setting order
|
||||
"B" // If any operator in group A whose mood is below the threshold, group B will be used
|
||||
]
|
||||
}
|
||||
],
|
||||
"meeting": [
|
||||
{
|
||||
"autofill": true // Use autofill for the entire room.
|
||||
"autofill": true // Completely autofill this room
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "晚班"
|
||||
// ...
|
||||
"name": "晚班" // ("晚班" = "Night Shift")
|
||||
// ...
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -3,149 +3,166 @@ order: 3
|
||||
icon: ph:sword-bold
|
||||
---
|
||||
|
||||
# Copilot Schema
|
||||
# Combat Operation Protocol
|
||||
|
||||
Usage of `resource/copilot/*.json` and field description.
|
||||
Usage of `resource/copilot/*.json` files and field descriptions
|
||||
|
||||
## Overview
|
||||
::: tip
|
||||
Please note that JSON files do not support comments. The comments in this document are for demonstration purposes only. Do not copy them directly into your JSON files.
|
||||
:::
|
||||
|
||||
## Complete Field Reference
|
||||
|
||||
```json
|
||||
{
|
||||
"stage_name": "暴君", // Stage name, required. The Chinese name of the level, code, stageId, levelId, etc. are all acceptable as long as they are unique.
|
||||
"opers": [ // Operator list
|
||||
"stage_name": "暴君", // Stage name, required. Chinese name, code, stageId, levelId, etc. are all acceptable as long as they uniquely identify the stage. ("暴君" = "Patriot")
|
||||
"opers": [
|
||||
// Specified operators
|
||||
{
|
||||
"name": "棘刺", // Operator name
|
||||
|
||||
"skill": 3, // Skill ID with range [1, 3], optional, 1 by default
|
||||
|
||||
"skill_usage": 0, // Skill usage, optional, 0 by default
|
||||
// 0 - Used on `actions`
|
||||
// 1 - Used when ready (e.g. Thorns: Destreza, Myrtle: Support Beta)
|
||||
// 2 - Used when ready, only once (e.g. Mountain: Sweeping Stance)
|
||||
// 3 - Auto-decision (not implemented)
|
||||
// 0 for auto skills
|
||||
|
||||
"requirements": { // Requirements, Reserved field, not implemented, optional, empty by default
|
||||
"elite": 2, // Elite requirement, optional, 0 by default
|
||||
"level": 90, // Level requirement, optional, 0 by default
|
||||
"skill_level": 10, // Skill level requirement, optional, 0 by default
|
||||
"module": 1, // Module requirement, optional, 0 by default
|
||||
"potentiality": 1 // Potential requirement, optional, 0 by default
|
||||
"name": "重岳", // Operator name ("重岳" = "Chongyue")
|
||||
"skill": 3, // Skill number. Optional, default is 1, range [1, 3]
|
||||
"skill_usage": 2, // Skill usage method. Optional, default is 0
|
||||
// 0 - Do not use automatically (depends on "actions" field)
|
||||
// 1 - Use whenever ready, as many times as possible (e.g., Thorns S3, Myrtle S1, etc.)
|
||||
// 2 - Use X times (e.g., Mountain S2 once, Chongyue S3 five times, set via "skill_times" field)
|
||||
// 3 - Auto-determine usage timing (placeholder)
|
||||
// For auto-trigger skills, use 0
|
||||
"skill_times": 5, // Number of skill activations. Optional, default is 1
|
||||
"requirements": {
|
||||
// Level requirements. Reserved interface, not yet implemented. Optional, default is empty
|
||||
"elite": 2, // Elite level. Optional, default is 0, no elite requirement
|
||||
"level": 90, // Operator level. Optional, default is 0
|
||||
"skill_level": 10, // Skill level. Optional, default is 0
|
||||
"module": 1, // Module number. Optional, default is 0
|
||||
"potentiality": 1 // Potential requirement. Optional, default is 0
|
||||
}
|
||||
},
|
||||
}
|
||||
],
|
||||
"groups": [
|
||||
{
|
||||
"name": "任意正常群奶", // Group name, required
|
||||
// Any name is accepted as long as it matches the `name` field in `deploy` below
|
||||
|
||||
"opers": [ // Operators to be chosen randomly, similar to the `opers` field above. Operators with higher levels have higher priority.
|
||||
"name": "任意正常群奶", // Group name, required ("任意正常群奶" = "Any Medic")
|
||||
// Use any name that matches the "name" field in the deploy section below
|
||||
"opers": [
|
||||
// Choose any one operator, unordered, higher level operators preferred, usage same as opers field above
|
||||
{
|
||||
"name": "夜莺", // Nightingale
|
||||
"name": "夜莺", // Operator name ("夜莺" = "Nightingale")
|
||||
"skill": 3,
|
||||
"skill_usage": 2 // Skill CD may differ
|
||||
"skill_usage": 2 // For specific timing, different operators may have different skill CDs, please be aware
|
||||
},
|
||||
{
|
||||
"name": "白面鸮", // Ptilopsis
|
||||
"name": "白面鸮", // Operator name ("白面鸮" = "Ptilopsis")
|
||||
"skill": 2,
|
||||
"skill_usage": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"actions": [ // Actions in order, required. Will be executed sequentially
|
||||
"actions": [
|
||||
// Combat operations. Ordered, executes the next one only after completing the previous one. Required
|
||||
{
|
||||
"type": "部署", // Action type, optional, "Deploy" by default
|
||||
// "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon"
|
||||
// "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机"
|
||||
// Both English and Chinese are supported
|
||||
// "Deploy" will wait until the cost is enough (unless timeout)
|
||||
// "Skill" will wait until the skill is ready (unless timeout)
|
||||
// "SpeedUp" is switchable, i.e. after using it will become 2x speed, and using it again will make it back to normal speed
|
||||
// "BulletTime", Reserved field, not implemented, it is the 1/5 speed after clicking any operator. Proceeding with any other action will make it back to normal speed
|
||||
// "Output" will print out the content of the doc (for subtities, etc.)
|
||||
// "SkillDaemon" will cast skills when they are ready, and do nothing else until the end
|
||||
|
||||
// The relationship between the following three fields is AND, i.e. &&
|
||||
"kills": 0, // Waiting until the number of kills required is reached, optional, 0 by default
|
||||
|
||||
"costs": 50, // Waiting until the cost for the amount specified, optional, 0 by default
|
||||
// Note that costs can change due to potential, so this field is only for easy fights. Otherwise, please use "cost_changes"
|
||||
// Recognition is accurate when the cost is 2 digits. Not recommended for 3-digit costs.
|
||||
|
||||
"cost_changes": 5, // Waiting until the cost changes for the amount specified, optional, 0 by default
|
||||
// Note that it calculates since the action starts (based on the cost of the previous action)
|
||||
// Recognition is accurate when the cost is 2 digits. Not recommended for 3-digit costs.
|
||||
|
||||
"cooling": 2, // Waiting until the number of operators in CD reaches the number, optional, -1 by default for "ignore".
|
||||
|
||||
"type": "部署", // Operation type, optional, default is "Deploy" ("部署" = "Deploy")
|
||||
// "Deploy" | "Skill" | "Retreat" | "SpeedUp" | "BulletTime" | "SkillUsage" | "Output" | "SkillDaemon" | "MoveCamera"
|
||||
// "部署" | "技能" | "撤退" | "二倍速" | "子弹时间" | "技能用法" | "打印" | "摆完挂机" | "移动镜头"
|
||||
// Both English and Chinese are supported (e.g., "部署" for "Deploy")
|
||||
// For "Deploy", waits until enough DP is available (unless timeout)
|
||||
// For "Skill", waits until skill is ready (unless timeout)
|
||||
// "SpeedUp" toggles between normal and 2x speed
|
||||
// "BulletTime" is 1/5 speed after clicking an operator; any following action returns to normal speed
|
||||
// "name" or "location" must be specified to indicate which operator to enter bullet time with (auto-detected)
|
||||
// If next action is "Skill"/"Retreat", use the same "name" or "location" as the next action
|
||||
// If next action is "Deploy", use any operator (but avoid using the operator to be deployed as it affects recognition)
|
||||
// "Output" doesn't show this step in UI, used only to output doc content (for subtitles, etc.)
|
||||
// "SkillDaemon" only uses "use when ready" skills, does nothing else until battle ends
|
||||
// "MoveCamera" for Guide mode, requires the distance field
|
||||
// Currently the four conditions below use AND relationship
|
||||
"kills": 0, // Kill count condition, waits until reached. Optional, default is 0, executes immediately
|
||||
"costs": 50, // DP condition, waits until reached. Optional, default is 0, executes immediately
|
||||
// DP can be affected by potential, may not be entirely accurate, suitable for battles with loose timing requirements.
|
||||
// Otherwise use cost_changes below
|
||||
// Recognition is more accurate for two-digit DP; three-digit DP may be misrecognized, not recommended
|
||||
"cost_changes": 5, // DP change condition, waits until reached. Optional, default is 0, executes immediately
|
||||
// Calculated from when this action begins executing (using DP at the end of previous action as baseline)
|
||||
// Supports negative values (e.g., when operators like Jaye reduce DP)
|
||||
// Recognition is more accurate for two-digit DP; three-digit DP may be misrecognized, not recommended
|
||||
"cooling": 2, // Number of operators on cooldown condition, waits until reached. Optional, default is -1, no recognition
|
||||
// TODO: Other conditions
|
||||
// TODO: "condition_type": 0, // Condition aggregation type, optional, 0 by default
|
||||
// // 0 - AND; 1 - OR
|
||||
|
||||
"name": "棘刺", // Operator/group name, required when `type` is "Deploy", Optional when type is "Skill" or "Retreat"
|
||||
|
||||
"location": [ 5, 5 ], // Position for deployment
|
||||
// Required when `type` is "Deploy".
|
||||
// Optional when `type` is "Skill" or "Retreat",
|
||||
// "Skill": Recommended for site facilities only, using skill with location instead of name, please simply use name to use skill for normal operators
|
||||
// "Retreat": Recommended only when multiple summons exist, retreating with location instead of name, please simply use name to retreat for normal operators
|
||||
|
||||
"direction": "左", // Direction for deployment, required when `type` is "Deploy"
|
||||
// "Left" | "Right" | "Up" | "Down" | "None"
|
||||
// "左" | "右" | "上" | "下" | "无"
|
||||
// Both English and Chinese are supported
|
||||
|
||||
"skill_usage": 1, // Override skill usage settings, required when `type` is "SkillUsage"
|
||||
// E.g.: Myrtle needs to attack without using the skill at the beginning, and use the skill automatically later.
|
||||
// Set it to 1 in that case.
|
||||
|
||||
"pre_delay": 0, // Pre-delay in ms, optional, 0 by default
|
||||
// Once all condition parameters of the current action are met, a timer starts, and upon its completion, the action corresponding to the type is executed.
|
||||
"post_delay": 0, // Post-delay in ms, optional, 0 by default
|
||||
// The current action's type starts a timer upon completion of the action, and once the timer ends, the next action begins.
|
||||
|
||||
// "timeout": 999999999, // Reserved field, not implemented
|
||||
// Timeout time in ms, optional when `type` is "Deploy" | "Skill", INT_MAX by default
|
||||
// Will proceed with the next action when timeout
|
||||
|
||||
"doc": "下棘刺了!", // Description, optional, displayed on the UI with no effects
|
||||
"doc_color": "orange" // Description colour, optional, displayed on the UI with no effects
|
||||
// TODO: "condition_type": 0, // Relationship between execution conditions, optional, default is 0
|
||||
// // 0 - AND; 1 - OR
|
||||
"name": "棘刺", // Operator name or group name, required when type is "Deploy", optional for "Skill"|"Retreat" ("棘刺" = "Thorns")
|
||||
"location": [
|
||||
5,
|
||||
5
|
||||
], // Operator deployment position.
|
||||
// Required when type is "Deploy".
|
||||
// Optional when type is "Skill"|"Retreat".
|
||||
// "Skill": Recommended only for automatic devices on the field, use location without name to activate skill. For normal deployed operators, use name
|
||||
// "Retreat": Recommended only when multiple summons share the same name, use location without name to retreat. For normal deployed operators, use name
|
||||
"direction": "左", // Operator facing direction. Required when type is "Deploy" ("左" = "Left")
|
||||
// "Left" | "Right" | "Up" | "Down" | "None"
|
||||
// "左" | "右" | "上" | "下" | "无"
|
||||
// Both English and Chinese are supported (e.g., "左" for "Left")
|
||||
"skill_usage": 1, // Change skill usage method. Required when type is "SkillUsage"
|
||||
// Example: Initially need Myrtle to help attack without using skill, later need auto skill activation
|
||||
// Can set to 1 at the appropriate time
|
||||
"skill_times": 5, // Number of skill activations. Optional, default is 1
|
||||
"pre_delay": 0, // Pre-delay. Optional, default is 0, unit is milliseconds
|
||||
// After all conditions for the current action are met, starts timing, executes the corresponding action when timing ends
|
||||
"post_delay": 0, // Post-delay. Optional, default is 0, unit is milliseconds
|
||||
// After the current action is executed, starts timing, begins next action when timing ends
|
||||
//
|
||||
// "timeout": 999999999, // Reserved field, not yet implemented.
|
||||
// Timeout. Optional when type is "Deploy"|"Skill". Default INT_MAX, unit is milliseconds
|
||||
// Abandons current action and executes next action when timeout occurs
|
||||
"distance": [
|
||||
4.5,
|
||||
0
|
||||
], // Required when type is "MoveCamera"
|
||||
// [x movement in tiles, y movement in tiles], can be decimal
|
||||
// Note that during "MoveCamera", operators on field cannot be recognized, need to use sleep to cover entire animation
|
||||
"doc": "下棘刺了!", // Description, optional. Displayed in UI, no actual function ("下棘刺了!" = "Deploying Thorns!")
|
||||
"doc_color": "orange" // Description text color, optional, default is gray. Displayed in UI, no actual function
|
||||
},
|
||||
// Example 1
|
||||
// Example 1
|
||||
{
|
||||
"name": "任意正常群奶",
|
||||
"location": [ 5, 6 ],
|
||||
"direction": "右"
|
||||
"name": "任意正常群奶", // ("任意正常群奶" = "Any Medic")
|
||||
"location": [
|
||||
5,
|
||||
6
|
||||
],
|
||||
"direction": "右" // ("右" = "Right")
|
||||
},
|
||||
// Example 2
|
||||
// Example 2
|
||||
{
|
||||
"name": "史尔特尔",
|
||||
"location": [ 4, 5 ],
|
||||
"direction": "左",
|
||||
"doc": "你史尔特尔奶奶来啦!",
|
||||
"name": "史尔特尔", // ("史尔特尔" = "Silverash")
|
||||
"location": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"direction": "左", // ("左" = "Left")
|
||||
"doc": "你史尔特尔奶奶来啦!", // ("你史尔特尔奶奶来啦!" = "Here comes your Silverash grandma!")
|
||||
"doc_color": "red"
|
||||
},
|
||||
// Example 3
|
||||
// Example 3
|
||||
{
|
||||
"type": "二倍速"
|
||||
"type": "二倍速" // ("二倍速" = "SpeedUp")
|
||||
}
|
||||
],
|
||||
"minimum_required": "v4.0", // Minimum required MAA version, required, reserved field, not implemented
|
||||
"doc": { // Description, optional
|
||||
"title": "低练度高成功率作业",
|
||||
"minimum_required": "v4.0", // Minimum required MAA version, required. Reserved field, not yet implemented
|
||||
"doc": {
|
||||
// Description, optional.
|
||||
"title": "低练度高成功率作业", // ("低练度高成功率作业" = "Low-investment high-success rate operation")
|
||||
"title_color": "dark",
|
||||
"details": "对练度要求很低balabala……", // You can write your name here, video link, walkthrough link, etc.
|
||||
"details": "对练度要求很低balabala……", // ("对练度要求很低balabala……" = "Very low level requirements etc...") Recommend adding your name (author), reference video links, etc. here
|
||||
"details_color": "dark"
|
||||
},
|
||||
"difficulty": 0 // The difficulty of the task, optional, the default value is 0.
|
||||
"difficulty": 0 // Operation difficulty, optional, default value is 0.
|
||||
// 0: Default, not set
|
||||
// 1: Support normal difficulty
|
||||
// 2: Support raid difficulty
|
||||
// 3: Support normal and raid difficulty
|
||||
// 1: Supports normal difficulty
|
||||
// 2: Supports challenge mode
|
||||
// 3: Supports both normal and challenge modes
|
||||
}
|
||||
```
|
||||
|
||||
## Example
|
||||
## Examples
|
||||
|
||||
[OF-1](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/copilot/OF-1_credit_fight.json)
|
||||
|
||||
@@ -13,10 +13,12 @@ Please note that JSON files do not support comments. Comments are for demonstrat
|
||||
|
||||
- `resource/roguelike/` the files for each theme are below
|
||||
- Theme folder
|
||||
`Phantom/` for Phantom's I.S.
|
||||
`Mizuki/` for Mizuki's I.S.
|
||||
`Sami/` for Sami's I.S.
|
||||
- `autopilot/`combat json for each level
|
||||
`Phantom/` for Phantom's I.S. ("傀影" - Phantom & Crimson Solitaire)
|
||||
`Mizuki/` for Mizuki's I.S. ("水月" - Mizuki & Caerula Arbor)
|
||||
`Sami/` for Sami's I.S. ("萨米" - Expeditioner's Jǫklumarkar)
|
||||
`Sarkaz/` for Sarkaz's I.S. ("萨卡兹" - Sarkaz Endless Tale)
|
||||
`JieGarden/` for JieGarden's I.S. ("界园" - Boundary Garden)
|
||||
- `autopilot/` combat json for each level
|
||||
- `level_name_in_chinese.json` combat logic of the level
|
||||
- `encounter/` encounter nodes logic
|
||||
- `default.json` levelling mode
|
||||
@@ -24,10 +26,22 @@ Please note that JSON files do not support comments. Comments are for demonstrat
|
||||
- `recruitment.json` operators recruitment logic
|
||||
- `shopping.json` trade store purchasing logic
|
||||
|
||||
- Specifically, in `Sami/`:
|
||||
- `foldartal.json` defines the usage logic for Sami's Foldartals
|
||||
- `collapsal_paradigms.json` defines the types of Sami's Collapsal Paradigms
|
||||
- `autopilot/关卡名_collapse.json` combat logic for stages (Collapsal Paradigm farming mode)
|
||||
- `encounter/collapse.json` encounter logic for Collapsal Paradigm farming mode
|
||||
|
||||
- In `Sarkaz/`:
|
||||
- `fragments.json` stores basic information about Sarkaz's Thoughts
|
||||
- `map.json` stores template image information for Sarkaz's Blueprint navigation
|
||||
|
||||
## Integrated Strategy Step 1: Operator Recruitment
|
||||
|
||||
`resource/roguelike/theme_name/recruitment.json` describes the logic of the operator recruitment
|
||||
|
||||
The tools in `tools/RoguelikeRecruitmentTool` and `tools/RoguelikeOperSearch` can help view and edit the recruitment files.
|
||||
|
||||
```json
|
||||
{
|
||||
"theme": "Phantom", // I.S. Theme (In this case Phantom)
|
||||
@@ -42,17 +56,17 @@ Please note that JSON files do not support comments. Comments are for demonstrat
|
||||
|
||||
### Operator classification
|
||||
|
||||
Split operators in different ***groups*** according to your understanding of the game(Group, related conceptual references [Copilot Schema](./copilot-schema.md))
|
||||
Split operators in different ***groups*** according to your understanding of the game (Group concept references [Copilot Schema](./copilot-schema.md))
|
||||
|
||||
::: info
|
||||
|
||||
1. Operators and summons within the same group must be deployed in the same way (i.e. both melee or ranged)
|
||||
1. Operators and summons within the same group must be deployed in the same way (i.e. both melee or ranged) and should have **similar attack ranges**
|
||||
|
||||
2. Allows the same operator or summon to be sorted into different groups, depending on its usage.
|
||||
|
||||
3. Please do not change the name of an existing group, as this may cause previous versions of the task to be unavailable when MAA is updated!
|
||||
|
||||
4. Please try not to add new groups, instead try to implement new operators added to the task, into existing groups according to the usage
|
||||
4. Please try not to add new groups, instead try to implement new operators added to the task into existing groups according to their usage
|
||||
:::
|
||||
|
||||
::: tip
|
||||
@@ -64,15 +78,15 @@ By default, only E1 Level 55 operators will be recruited
|
||||
"theme": "Phantom",
|
||||
"priority": [ // Groups, in order
|
||||
{
|
||||
"name": "棘刺", // Group name (In this case Thorns)
|
||||
"name": "棘刺", // Group name ("棘刺" = "Thorns")
|
||||
"opers": [ // Group contains operators, ordered, representing the deployment priority
|
||||
//(e.g. if you need to deploy the group's operators, test for Thorns, deploy Thorns if it's available, test for Horn is Thorns is not available)
|
||||
// (e.g. if you need to deploy the group's operators, test for Thorns, deploy Thorns if it's available, test for Horn if Thorns is not available)
|
||||
{
|
||||
"name": "棘刺", // Operator's name (Thorns)
|
||||
"name": "棘刺", // Operator's name ("棘刺" = "Thorns")
|
||||
...
|
||||
},
|
||||
{
|
||||
"name": "号角", // Operator's name (Horn)
|
||||
"name": "号角", // Operator's name ("号角" = "Horn")
|
||||
...
|
||||
}
|
||||
]
|
||||
@@ -86,18 +100,44 @@ By default, only E1 Level 55 operators will be recruited
|
||||
|
||||
1. Introduction to existing groups
|
||||
|
||||
Take Phantom's I.S. as an example: operators are mainly divided in
|
||||
Taking Sami's I.S. as an example: operators are mainly divided into:
|
||||
|
||||
| Group | Considerations | Class | Operators |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| ***Ground block*** | 站场和清杂 | 重装, 近卫 | 奶盾, 基石, 羽毛笔, 山, M3, 令和稀音的召唤物, 斑点, 重装预备干员 |
|
||||
| ***Ground single-block*** | 单独对战精英怪 | 处决者特种 | 史尔特尔, 异德, 麒麟R夜刀, M3, 红 |
|
||||
| ***Ranged C*** | 常态和决战输出 | 狙击, 术士 | 假日威龙陈, 澄闪, 艾雅法拉, 肥鸭 |
|
||||
| ***Ranged DPS*** | 对空和常态输出 | 狙击, 术士 | 空弦, 能天使, 克洛丝, 史都华德 |
|
||||
| ***奶*** | 治疗能力 | 治疗, 辅助 | 凯尔希, 浊心斯卡蒂, 芙蓉, 安赛尔 |
|
||||
| ***回费*** | 回复cost | 先锋 | 桃金娘, 伊内丝, 芬, 香草 |
|
||||
| ***炮灰*** | 吸收炮弹, 再部署 | 特种, 召唤物 | M3, 红, 桃金娘, 预备干员 |
|
||||
| ***高台预备*** | 有一定输出能力 | | 梓兰, 预备干员 |
|
||||
| ***地面阻挡*** (Ground Blocking) | Field presence and clearing enemies | Defenders, Guards | Healing defenders, cornerstones, Blacknight, Mountain, M3, Ling and Scene's summons, Spot, Defender reserve operators |
|
||||
| ***地面单切/处决者*** (Ground Single-Target/Executors) | Solo elite enemies | Executor specialists | SilverAsh, Yato the Elegy, Kirara R Yato, M3, Red |
|
||||
| ***高台C*** (Ranged Core) | Sustained and decisive output | Snipers, Casters | Weathered, Logos, Ch'en the Holungday, Chongyue |
|
||||
| ***高台输出*** (Ranged DPS) | Anti-air and sustained output | Snipers, Casters | Archetto, Exusiai, Kroos, Steward |
|
||||
| ***速狙*** (Fast Snipers) | Physical damage, standard range | Snipers | Eyjafjalla, Exusiai, Yeye, Kroos |
|
||||
| ***术师*** (Casters) | Arts damage, standard range | Single-target Casters | Eyjafjalla, Logos, Steward |
|
||||
| ***辅助*** (Supporters) | Can hit 1 tile behind | Supporters | Suzuran, Lily of the Valley, Yeye, Orchid |
|
||||
| ***狙击*** (Long-range Snipers) | Longer range high ground | Artilleryman, Spreadshooter | Weathered, Toddifons, Rosa |
|
||||
| ***奶*** (Healers) | Healing ability | Medics, Supporters | Kal'tsit, Skadi the Corrupting Heart, Hibiscus, Ansel |
|
||||
| ***单奶*** (Single-target Healers) | Attack range depth >= 4 | Medics | Kal'tsit, Reed the Flame Shadow, Ptilopsis, Perfumer, Hibiscus, Ansel |
|
||||
| ***群奶*** (AoE Healers) | Attack range depth < 4, can heal behind | Medics, Supporters | Nightingale, Ptilopsis, Skadi the Corrupting Heart |
|
||||
| ***回费*** (DP Recovery) | Cost recovery | Vanguards | Myrtle, Ines, Fang, Vanilla |
|
||||
| ***地刺*** (Ground Traps) | No blocking, provides DPS or slowing in front of defenders | Ambushers | Gladiia, Ascalon, Manticore |
|
||||
| ***地面远程*** (Ground Ranged) | Ground long-range, can output behind shields | Instructors, Lords | Horn, Pallas, Thorns, SilverAsh |
|
||||
| ***领主*** (Lords) | Ground attack range depth > 4, can target air | Fortress, Lord | Thorns, SilverAsh, Chouyu |
|
||||
| ***盾法*** (Shield Casters) | Short attack range, some tanking ability | Arts Fighter Casters | Lin, Carnelian |
|
||||
| ***炮灰*** (Fodder) | Absorb attacks, redeploy | Specialists, summons | M3, Red, Myrtle, reserve operators |
|
||||
| ***大龙*** (Big Dragon) | Tank in front of blockers, easy to combine | Summons | Ling's dragons, Jessica the Flame Purifier's shield |
|
||||
| ***补给站*** (Supply Stations) | Accelerate main DPS operator skill rotation | Summons | Support Supply Station, Artificer operator summons |
|
||||
| ***无人机*** (Drones) | Ignore height restrictions for healing summons | Summons | Skadi's Seaborn, Silence's Medical Drone |
|
||||
| ***支援陷阱*** (Support Traps) | Deployable ground explosives | Summons | Support Mist Generator, Support Rumble-Rumble |
|
||||
| ***障碍物*** (Obstacles) | Don't take deployment slots, attract aggro or block | Summons | Cage, obstacles |
|
||||
| ***其他地面*** (Other Ground) | Ground operators not preferred for priority use | Push/pull, block-1 vanguards, swordmasters | Bagpipe, Croissant |
|
||||
| ***高台预备/其他高台*** (High Ground Reserve/Other High Ground) | High ground operators not preferred for priority use | AoE casters, chain casters, tacticians | Orchid, reserve operators |
|
||||
|
||||
::: tip
|
||||
"Ground Blocking" mainly considers an operator's overall defensive capabilities (sometimes killing everything is also a form of defense), including "Ground Ranged" and "Lord" groups.
|
||||
|
||||
"Healers" mainly considers overall healing ability, including single-target and AoE healers. Consider attack range coverage when deciding whether to use single-target healers (healing 4 tiles) or AoE healers (healing behind).
|
||||
|
||||
"Ranged DPS" only considers output ability, mainly a mixed ordering of sniper and caster professions. Consider damage type, attack range and other restrictions when using specific groups like fast snipers, casters, supporters, or shield casters.
|
||||
|
||||
For trap-type summons, because there are many of them, don't put them in the support trap group. It works better to let MAA deploy them automatically.
|
||||
:::
|
||||
|
||||
2. Groups requiring special handling
|
||||
|
||||
@@ -105,26 +145,39 @@ By default, only E1 Level 55 operators will be recruited
|
||||
|
||||
| Group | Operators | Features |
|
||||
| :--- | :--- | :--- |
|
||||
| Thorns | Thorns, Horn | Long-range melee, many maps have good spots |
|
||||
| Summoners | Kal'tsit, Ling, Scene | Melee blocking, some maps need deployment prioritization, summons can be used as blocks or fodder |
|
||||
| Agent | Cantabile, Ines | Has DP recovery, deals DPS and is single block |
|
||||
| Skadi Alter | Skadi the Corrupting Heart | Low DP cost, special range, some maps have optimal spots |
|
||||
| Reed Alter | Reed the Flame Shadow | In Sami I.S. she's commonly used as an opening caster, DPS and healing, some maps have optimal spots |
|
||||
| SilverAsh | SilverAsh, Młynar | Ground operators with large range, very useful against bosses |
|
||||
| Surtr | Surtr | Since Surtr always carries the 3rd skill, her positioning ability is almost zero and deployment priority is extremely low |
|
||||
| Dice | Dice | In Mizuki I.S. the dice needs to be operated separately |
|
||||
| 益达 (Weathered) | 维什戴尔 (Weathered) | High ground DPS, prioritizing deployment can reduce pressure |
|
||||
| 棘刺 (Thorns) | 棘刺 (Thorns), 号角 (Horn) | Ground ranged output, Phantom I.S. has some maps with very suitable positions |
|
||||
| 召唤类 (Summoners) | 凯尔希 (Kal'tsit), 令 (Ling), 稀音 (Scene) | Self-contained ground blocking, some maps need priority deployment, summons can be used as blockers or fodder |
|
||||
| 情报官 (Agents) | 晓歌 (Cantabile), 伊内丝 (Ines) | Can recover DP, provide side output, and can single cut |
|
||||
| 浊心斯卡蒂 (Skadi Alter) | 浊心斯卡蒂 (Skadi the Corrupting Heart) | Decent healing under low pressure, but special range, some maps have suitable positions |
|
||||
| 焰苇 (Reed Alter) | 焰影苇草 (Reed the Flame Shadow) | Commonly used opening operator in Sami I.S., combines healing and output, some maps have optimal positions |
|
||||
| 玛恩纳 (SilverAsh) | 玛恩纳 (Closure), 银灰 (SilverAsh) | Ground large-area decisive output, can be deployed against bosses |
|
||||
| 史尔特尔 (Surtr) | 史尔特尔 (Surtr) | Since Surtr always carries S3 at E2, field presence ability is almost zero, deployment priority is extremely low |
|
||||
| 骰子 (Dice) | 骰子 (Dice) | In Mizuki I.S. the dice needs to be operated separately |
|
||||
|
||||
::: info
|
||||
Currently fixed to group unidentified ground crews behind the penultimate formation (other ground), and unidentified high-platform crews behind the penultimate formation (other high-platform)
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Newly implemented operators need to be manually added to each theme's `recruitment.json`, and developers may not always remember to make adaptations.
|
||||
If you notice this issue, you can open an issue to remind developers, or you can submit a PR directly.
|
||||
:::
|
||||
|
||||
### Preset groups--Complete line-up testing
|
||||
|
||||
In a team that you expect to pass or reach the top, what are the basic core players? Are they essential? How many do you need?
|
||||
|
||||
::: info
|
||||
The current script's recruiting logic is to only recruit 0 hope and key agents before the lineup meets the lineup readiness level, and save hope for high star key agents.
|
||||
So don't set the threshold number too high, it is recommended that the number of all the operators needed (the basic core lineup) should add up to 4-8 digits.
|
||||
The current script's recruiting logic is to only recruit 0 hope and key agents before the lineup meets the lineup readiness level, and save hope for high star key agents. So don't set the threshold number too high, it is recommended that the number of all the operators needed (the basic core lineup) should add up to 4-8 operators.
|
||||
|
||||
(The current implementation manually marks high-strength operators and three-star operators as key operators, and only recruits key operators during recruitment) (TODO: Identify 0 hope operators)
|
||||
|
||||
After the team meets the lineup completeness check, each time you get a recruitment ticket, it will recruit based on the operator's rating and E2 priority, so to avoid wasting hope, operators you don't want to recruit can be set with no rating or set below the same profession's three-star/reserve operator rating. (For operators you definitely want or absolutely don't want, you can specially assign extremely high or extremely low scores, see `Sami`'s `止颂` (Heidi) as an example)
|
||||
|
||||
When forming combat squads, the default sorting of the operator selection interface (from top to bottom, left to right) will be read and stored in order. Based on this order, keeping the relative order, the first operators that meet the lineup completeness will be moved to the beginning until the lineup completeness is all satisfied or there are no operators that meet the lineup completeness. Then reserve operators will be moved to the end, forming a new order, and selection will be based on this new order. In particular, since six-star temporary recruited operators are at the very beginning of the squad by default, it's easy to include six-star temporary recruited operators in the actual squad. (TODO: Exclude temporary recruited E1 operators that can't be used)
|
||||
|
||||
For beginner accounts: If 10 recruitments don't satisfy half the team's key operators, the completeness check will be abandoned, and operators will be used based on their ratings, so beginner accounts without trained three-stars may end up with just two or three six-stars and a bunch of reserve operators.
|
||||
:::
|
||||
|
||||
```json
|
||||
@@ -134,93 +187,119 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
...
|
||||
],
|
||||
"team_complete_condition": [ // Formation completness test
|
||||
{
|
||||
{ // A strategy group (condition)
|
||||
"groups": [ // Which group members are needed?
|
||||
"C-team"
|
||||
"高台输出" // ("高台输出" = "Ranged DPS") (This indicates a need for a Ranged DPS operator)
|
||||
],
|
||||
"threshold": 1 // How many of these operators are needed?
|
||||
}, //(This indicates a need for an operator from the C-team on the high platform)
|
||||
{
|
||||
},
|
||||
{ // Can have multiple strategy groups
|
||||
"groups": [
|
||||
"Thorns", //(A minimum of 2 operators are required from Thorns, GroundBlock, Ground1Block, Fodder)
|
||||
"GroundBlock",
|
||||
"Ground1Block",
|
||||
"Fodder"
|
||||
"棘刺", // ("棘刺" = "Thorns") (This indicates a minimum of 2 operators needed from Thorns, Ground Blocking, Ground Single-Cut, Fodder groups)
|
||||
"地面阻挡", // ("地面阻挡" = "Ground Blocking")
|
||||
"地面单切", // ("地面单切" = "Ground Single-Cut")
|
||||
"炮灰" // ("炮灰" = "Fodder")
|
||||
],
|
||||
"threshold": 2
|
||||
},
|
||||
{
|
||||
"groups": [
|
||||
"奶" // ("奶" = "Healers") (This indicates a need for 1 healer)
|
||||
],
|
||||
"threshold": 1
|
||||
}
|
||||
...
|
||||
]
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
::: caution
|
||||
When an operator appears in multiple operator groups, it is only counted once.
|
||||
For example: Operator `棘刺` (Thorns) may appear in both the `棘刺` (Thorns) group and the `地面阻挡` (Ground Blocking) group. Within this strategy group, operator `棘刺` (Thorns) is only counted once.
|
||||
|
||||
But each strategy group counts separately.
|
||||
For example: Operator `焰影苇草` (Reed the Flame Shadow) may appear in both the `高台输出` (Ranged DPS) group and the `奶` (Healers) group. In this case, both strategy groups can count operator `焰影苇草` (Reed the Flame Shadow).
|
||||
:::
|
||||
|
||||
### Adjusting parameters for operator recruitment
|
||||
|
||||
1. The order within a group represents the priority of the deployment detection
|
||||
|
||||
2. Meaning of each field and script-related logic for group members
|
||||
2. Temporary recruited operators get a +600 score bonus to their original rating
|
||||
|
||||
3. Random direct promotion operators' scores are calculated by adding recruitment score and E2 score together
|
||||
|
||||
4. Meaning of each field and script-related logic for group members
|
||||
|
||||
```json
|
||||
{
|
||||
"theme": "Phantom",
|
||||
"theme": "Phantom",
|
||||
"priority": [
|
||||
"name": "GroundBlocking", // Group name (in this case GroundBlocking)
|
||||
"doc": "The standard line is 1st gear (clearing ability or field ability is better than mountain) > Mountain > 2nd gear (block>2, can return to itself) > Spot, field ability is less than spot to single cut or cannon fodder group",
|
||||
// Doc field are just notes. Has no effect on the program
|
||||
"name": "地面阻挡", // Group name ("地面阻挡" = "Ground Blocking")
|
||||
"doc": "标准线为1档(清杂能力或者站场能力比山强)>山>2档(阻挡>2,可自回)>斑点,站场能力小于斑点放到单切或者炮灰组",
|
||||
// Doc fields are just notes. Has no effect on the program
|
||||
"opers": [ // What operators should be included, in ordered, represents deployment priority.
|
||||
{
|
||||
"name": "Gavial the Invincible", // Operator name (Gavial the Invincible, the first position in the group indicates that
|
||||
//when it is necessary to deploy a ground blocking group, the first thing to check is whether it is a Gavial Alter or not.)
|
||||
"name": "百炼嘉维尔", // Operator name ("百炼嘉维尔" = "Gavial the Invincible", the first position in the group indicates that
|
||||
// when it is necessary to deploy a ground blocking group, the first thing to check is whether it is Gavial Alter or not.)
|
||||
"skill": 3, // Which skill to use (In this case skill 3)
|
||||
"skill_usage": 2, // Skill usage mode, refer to 3.3COPILOT_SCHEMA, default to 1 if empty, 2 is only put x times
|
||||
// (x is set by "skill_times" field), 3 is not supported for now.
|
||||
"skill_times": 2, // Skill usage, default is 1, effective when "skill_usage" field is 2.
|
||||
"skill_usage": 2, // Skill usage mode, refer to Combat Operation Protocol, difference is default is 1 if empty
|
||||
// (0 is don't use automatically, 1 is use when ready, 2 is use x times (x is set by "skill_times" field), 3 is not supported for now)
|
||||
"skill_times": 2, // Skill usage times, default is 1, effective when "skill_usage" field is 2
|
||||
"alternate_skill": 2, // Alternative skills used when there is no designated skill, usually 6-star operators who have not
|
||||
// E2'd and use 3 skills after promotion
|
||||
// (in this case, 2 skills are used when there is no 3 skills).
|
||||
"alternate_skill_usage": 1 // Skill use mode for alternative skills (this field has not yet been implemented)
|
||||
"alternate_skill_times": 1 // Number of skill uses for alternative skills (this field has not yet been implemented)
|
||||
// (in this case, use skill 2 when skill 3 is not available)
|
||||
"alternate_skill_usage": 1, // Skill use mode for alternative skills (this field has not yet been implemented)
|
||||
"alternate_skill_times": 1, // Number of skill uses for alternative skills (this field has not yet been implemented)
|
||||
"recruit_priority": 900, // Recruitment priority, bigger number, higher priority, more than 900 belongs to must be recruited
|
||||
// 400 below the recruitment priority than some of the key operator essence of the second priority is still low
|
||||
// Temporarily recruited operator priority automatically +800
|
||||
// 400 or below recruitment priority is lower than the recruitment of ordinary three-star operators
|
||||
// Temporarily recruited operators get priority automatically +600
|
||||
"promote_priority": 600, // Advancement priority, bigger number, higher priority, above 900 is a guaranteed E2 if there's enough hope
|
||||
// below 400 recruitment priority is lower than the recruitment of ordinary three-star operators
|
||||
// Tip: When you lower your recruitment priority or don't write it in, and raise the priority of some of
|
||||
// your E2, you're actually raising the priority of the E2 who temporarily recruited these operators.
|
||||
// Below 400 recruitment priority is lower than the recruitment of ordinary three-star operators
|
||||
// Tip: When you lower recruitment priority or don't write it, and raise the priority of some of
|
||||
// your E2, you're actually raising the priority of the E2 for these operators when temporarily recruited
|
||||
"is_key": true, // If true, the operator is a key element. Default to false if empty.
|
||||
// If the lineup completeness test is not passed, only key and 0 hope are recruited, saving hope.
|
||||
"is_start": true, // If true, the operator is a stater. Default to false if empty. If there is no start player in the team,
|
||||
// only start players and 0 hopeful players will be recruited, and user-filled players will be recruited.
|
||||
"is_start": true, // If true, the operator is a starter. Default to false if empty. If there is no start player in the team,
|
||||
// only start players and 0 hope players will be recruited, and user-filled players will be recruited.
|
||||
"auto_retreat": 0, // Auto-retreat after a few full-seconds of deployment, takes effect when greater than 0, mainly used for specialists and vanguards,
|
||||
// since I.S. usually starts at 2x speed, it is recommended to set it to skill duration divided by 2
|
||||
"promote_priority_when_team_full": 850,
|
||||
"recruit_priority_offsets": [ // Prioritise recruitment according to current line-up
|
||||
"recruit_priority_when_team_full": 850, // No need to set separately, recruitment priority when lineup completeness is met, default is recruitment priority -100
|
||||
"promote_priority_when_team_full": 850, // No need to set separately, promotion priority when lineup completeness is met, default is E2 priority +300
|
||||
"recruit_priority_offsets": [ // Adjust recruitment priority based on current lineup
|
||||
{
|
||||
"groups": [ // Which groups are required to fulfil the conditions
|
||||
"Kaltsit",
|
||||
"GroundBlocking",
|
||||
"Thorns"
|
||||
"groups": [ // Which groups are required to fulfill the conditions, counted by group
|
||||
// Don't have duplicate operators in these groups or they will be counted multiple times
|
||||
"凯尔希", // ("凯尔希" = "Kal'tsit")
|
||||
"地面阻挡", // ("地面阻挡" = "Ground Blocking")
|
||||
"棘刺" // ("棘刺" = "Thorns")
|
||||
],
|
||||
"is_less": false, // True is less than or equal, false is greater than or equal. Default to false if empty.
|
||||
"is_less": false, // Whether the condition is greater than or less than, false is greater than or equal to, true is less than or equal to. Default to false if empty.
|
||||
"threshold": 2, // Number of conditions met. Default to 0 if empty.
|
||||
"offset": -300 // Adjustments to recruitment priorities after fulfilment. Default to 0 if empty.
|
||||
// (This means that when there are 2 or more operators in Kaltsit, GroundBlocking and Thorns,
|
||||
// the recruitment priority of Gavial the Invincible is reduced by 300)
|
||||
"offset": -300 // Adjustments to recruitment priorities after fulfillment. Default to 0 if empty.
|
||||
// (This means that when there are 2 or more operators from Kal'tsit, Ground Blocking, and Thorns groups,
|
||||
// Gavial the Invincible's recruitment priority is reduced by 300)
|
||||
}
|
||||
]
|
||||
},
|
||||
...
|
||||
],
|
||||
],
|
||||
"team_complete_condition": [
|
||||
"team_complete_condition": [
|
||||
...
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
3. Add groups and operators as you see fit
|
||||
::: info
|
||||
The groups in `recruit_priority_offsets` should not have duplicate operators.
|
||||
|
||||
When you add a new group, you can copy the operator from an existing group. Refer to the ratings already given by the devs, and modify them on that basis
|
||||
After setting `auto_retreat`, you generally don't need to set `retreat_plan` for it in the battle plan.
|
||||
:::
|
||||
|
||||
5. Add groups and operators as you see fit
|
||||
|
||||
When you add a new group, you can copy operators from existing groups. Refer to the ratings already given by the devs, and modify them on that basis.
|
||||
|
||||
## Integrated Strategy Step 2: Battle Logic
|
||||
|
||||
@@ -228,11 +307,13 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
|
||||
### Basic I.S. fighting logic of MAA
|
||||
|
||||
(Effective when the combat logic file for the level name does not exist)
|
||||
|
||||
1. Perform basic combat operations based on the tile grid of the map
|
||||
|
||||
- MAA performs basic combat operations based on whether the grid on the map is a blue or red box, whether it's a high platform or ground, and whether it can be deployed or not.
|
||||
|
||||
- MAA decides which job to use based on the name or number of the map only, and does not judge the map's **Standard**, **Emergency**, **Road Network**, **Classified Board Use**, etc.
|
||||
- MAA decides which job to use based on the name or number of the map only, and does not judge the map's **Standard**, **Emergency**, **Road Network**, **Foldartal Use**, etc.
|
||||
|
||||
- MAA does not judge **in combat the situation of undefined squares on the map**, e.g. the position of the altar in the `Taming Hut`, the `follower effect` of monsters coming out of the left side or the right side.
|
||||
|
||||
@@ -256,13 +337,13 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
|
||||
At this point, you'll need to open the [map wiki](https://map.ark-nights.com/areas?coord_override=maa) while imagining the battle in your head
|
||||
|
||||
Use this link, otherwise switch the `Coordinate Display` to `MAA` in `Settings`
|
||||
First switch the `Coordinate Display` to `MAA` in `Settings`
|
||||
|
||||
Then, based on your experience, find the coordinates and orientation of the points that need to be prioritised for defence, and write them into the `replacement_home` of the json.
|
||||
|
||||
```json
|
||||
{
|
||||
"stage_name": "蓄水池", // Level name (In chinese)
|
||||
"stage_name": "蓄水池", // Level name ("蓄水池" = "Cistern")
|
||||
"replacement_home": [ // Entry points (blue boxes replacement points),
|
||||
// at least 1 to be complete
|
||||
{
|
||||
@@ -274,12 +355,16 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
"direction_Doc2": "Default is none, i.e. there is no recommended direction, it is entirely up to the algorithm to decide",
|
||||
"direction_Doc3": "none / left / right / up / down / 无 / 上 / 下 / 左 / 右",
|
||||
"direction": "left" // (This indicates priority deployment of operators
|
||||
//to the grid at coordinates 6,4 to the left.)
|
||||
// to the grid at coordinates 6,4 to the left.)
|
||||
}
|
||||
],
|
||||
...
|
||||
```
|
||||
|
||||
::: tip
|
||||
The blue box alternative will take effect when all steps in `deploy_plan` are completed but there are still operators to deploy in the waiting area, following the same logic as the general combat strategy
|
||||
:::
|
||||
|
||||
2. Deployment tile blacklist
|
||||
|
||||
There are points of priority for defence and points of priority for not deploying operators, such as where the fireball passes through, under the boss's feet, and some locations that are not good for output.
|
||||
@@ -291,7 +376,7 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
|
||||
```json
|
||||
...
|
||||
"blacklist_location_Doc": "This is an example of usage, not that the map "Cistern" needs ban.",
|
||||
"blacklist_location_Doc": "This is an example of usage, not that the map 'Cistern' needs ban.",
|
||||
"blacklist_location": [ // Locations where the deployment of the operators is prohibited
|
||||
[
|
||||
0,
|
||||
@@ -313,7 +398,7 @@ So don't set the threshold number too high, it is recommended that the number of
|
||||
"not_use_dice": false,
|
||||
```
|
||||
|
||||
### Or is it an Emergency Operation? It's time to show your true while skills - customised combat strategies!
|
||||
### Or is it an Emergency Operation? It's time to show your true white skills - customised combat strategies
|
||||
|
||||
Customisation using `"deploy_plan"` and `"retreat_plan"`
|
||||
|
||||
@@ -327,18 +412,18 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
"deploy_plan": [ // Deployment logic: order from top-to-bottom, left-to-right
|
||||
// Tries to deploy the first operator it finds, or skips it if it doesn't.
|
||||
{
|
||||
|
||||
"groups": ["GavialAlter", "Mudrock", "GroundC", "Horn", "Vanguard"], // Looks for operators from these groups
|
||||
"groups": ["百嘉", "基石", "地面C", "号角", "挡人先锋"], // Looks for operators from these groups
|
||||
// ("百嘉" = "Gavial Alter", "基石" = "Cornerstone", "地面C" = "Ground C", "号角" = "Horn", "挡人先锋" = "Blocking Vanguard")
|
||||
"location": [ 6, 4 ], // Deploys the first agent it finds to coordinates 6,4 and faces left.
|
||||
"direction": "left", // If it doesn't find it, proceed to the next deployment operation.
|
||||
},
|
||||
{
|
||||
"groups": [ "Summoner" ],
|
||||
"groups": [ "召唤" ], // ("召唤" = "Summoner")
|
||||
"location": [ 6, 3 ],
|
||||
"direction": "left"
|
||||
},
|
||||
{
|
||||
"groups": [ "单奶", "群奶" ],
|
||||
"groups": [ "单奶", "群奶" ], // ("单奶" = "Single-target Healer", "群奶" = "AoE Healer")
|
||||
"location": [ 6, 2 ],
|
||||
"direction": "down"
|
||||
}
|
||||
@@ -347,8 +432,20 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
|
||||
::: info
|
||||
MAA flattens all deployment commands and then executes the highest-priority deployment operations
|
||||
Example: deploys [ "Gavial", "Cornerstone", "GroundC"] on [6,4], deploys [ "Cornerstone", "GroundC"] on [6,3], then MAA will flatten the deployment commands to [ "Gavial", "Cornerstone", "GroundC", "Cornerstone", "GroundC"]
|
||||
If a "Gavial" operator on [6,4] is retreated during battle, the "Cornerstone" operator in hand, if available, will be deployed on [6,4], instead of [6,3]
|
||||
Example: deploys [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C)] on [6,4], deploys [ "基石" (Cornerstone), "地面C" (Ground C)] on [6,3], then MAA will flatten the deployment commands to [ "百嘉" (Gavial), "基石" (Cornerstone), "地面C" (Ground C), "基石" (Cornerstone), "地面C" (Ground C)]
|
||||
If a "百嘉" (Gavial) operator on [6,4] is retreated during battle, the "基石" (Cornerstone) operator in hand, if available, will be deployed on [6,4], instead of [6,3]
|
||||
|
||||
This means that from a macro perspective, after each deployment action is completed, it will start checking for executable strategies from the beginning (the current step's position has no already placed operators, and there are operators in the deployment area belonging to this step's operator group)
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Some commonly used operator group usages:
|
||||
|
||||
1. In many operations, the main defensive point combination is [ "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)], which means when the main tanking operator dies, it will try to use an executor to delay the CD; when there's too much survival pressure on this point, consider using [ "重装" (Heavy Defender), "地面阻挡" (Ground Blocking), "处决者" (Executor), "炮灰" (Fodder), "其他地面" (Other Ground)]; for positions behind defenders, prioritize [ "地面远程" (Ground Ranged), "地面阻挡" (Ground Blocking), "处决者" (Executor), "其他地面" (Other Ground)]; to purely attract aggro or sacrifice, use [ "炮灰" (Fodder), "障碍物" (Obstacles), "其他地面" (Other Ground)]
|
||||
|
||||
2. High ground position combinations commonly use [ "高台输出" (Ranged DPS), "其他高台" (Other High Ground)], if you want any high ground to be placed you can use [ "高台输出" (Ranged DPS), "狙击" (Sniper), "辅助" (Supporter), "盾法" (Shield Caster), "其他高台" (Other High Ground)]
|
||||
|
||||
3. Some ground positions are suitable for both SilverAsh and ground trap operators [ "玛恩纳" (SilverAsh), "地刺" (Ground Traps)]
|
||||
:::
|
||||
|
||||
2. Deployment of operators at a point in time
|
||||
@@ -359,13 +456,14 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
```json
|
||||
"deploy_plan": [
|
||||
{
|
||||
"groups": [ "StrangeVirtue", "Assasin", "Vanguard", "OtherFloors" ],
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
// ("异德" = "Strange Virtue", "刺客" = "Assassin", "挡人先锋" = "Blocking Vanguard", "其他地面" = "Other Ground")
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 0, 3 ] // This operation is only performed when the number of kills is 0 - 3
|
||||
},
|
||||
{
|
||||
"groups": [ "StrangeVirtue", "Assassin", "Vanguard", "OtherFloors" ],
|
||||
"groups": [ "异德", "刺客", "挡人先锋", "其他地面" ],
|
||||
"location": [ 5, 3 ],
|
||||
"direction": "left",
|
||||
"condition": [ 6, 10 ]
|
||||
@@ -377,6 +475,8 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
3. Retrieval of the operators at some point
|
||||
::: tip
|
||||
Sometimes the fodder is too strong to hold the field or you need to deploy to move the lineup. What should I do? Retreat!
|
||||
|
||||
Deployment and retreat commands for the same position should have non-overlapping condition numbers, otherwise it will instantly retreat after deploying
|
||||
:::
|
||||
|
||||
```json
|
||||
@@ -438,6 +538,12 @@ There is no need to set up too many customised plans when there is a problem. It
|
||||
],
|
||||
```
|
||||
|
||||
::: info
|
||||
When MAA cannot find a customized combat strategy for the current level, it will automatically execute the general combat strategy.
|
||||
|
||||
When MAA fails to recognize the current level name, it will not execute any combat logic.
|
||||
:::
|
||||
|
||||
### Have a special understanding of an operator's playing style? -- Refined operation of specific operators
|
||||
|
||||
Please group this operator separately
|
||||
@@ -448,7 +554,7 @@ Or you could just forget about it, and write a combat logic for this agent alone
|
||||
|
||||
It's also possible to use just one operator! Use MAA to clear the level (due to other imperfections in logic, the possibility is very low)
|
||||
|
||||
Reference examples: 1. Thorns in Phantom I.S. 2. Texas the Omertosa in Mizuki I.S. 3. Reed the Flame Shadow in Sami I.S.
|
||||
Reference examples: 1. Thorns in Phantom I.S. 2. Strange Virtue in Mizuki I.S. 3. Reed the Flame Shadow/Weathered in Sami I.S. 4. Weathered in Sarkaz I.S.
|
||||
|
||||
## Integrated Strategy Step 3: Encounters Node logic
|
||||
|
||||
@@ -464,6 +570,8 @@ If the Encounter is not recognized, it will click the choice at the bottom
|
||||
|
||||
Generally, it only requires slight adjustment or no adjustment at all (the devs have already taken care of this)
|
||||
|
||||
A common reason for getting stuck is when there's an option type icon but the option is not selectable (TODO)
|
||||
|
||||
### Optimise the priority of the Encounter options
|
||||
|
||||
Please refer to [prts.wiki](https://prts.wiki/w/%E9%9B%86%E6%88%90%E6%88%98%E7%95%A5) to see the effects of each Encouter's options, note that the options are not necessarily fixed.
|
||||
@@ -475,25 +583,25 @@ The Encounter options can be modified to guide MAA towards special endings
|
||||
"theme": "Sami", // I.S. Theme
|
||||
"stage": [ // Encounter event
|
||||
{
|
||||
"name": "低地市集", // Name of the Encounter
|
||||
"name": "低地市集", // Name of the Encounter ("低地市集" = "Lowland Market")
|
||||
"option_num": 3, // There are several options in total (In this case: 3)
|
||||
"choose": 3, // Which option should you choose first (the third one is preferred here)
|
||||
// If you can't choose it, choose the escape option (basically the last one)
|
||||
|
||||
"choice_require": [ // Requirements for selecting options
|
||||
"choices": [ // Requirements for selecting options
|
||||
// (it does not affect program operation for the time being
|
||||
// only marking applicable situations for easy modification)
|
||||
{
|
||||
"name": "Selection of herbs", // Option name
|
||||
"name": "选择碎草药", // Option name ("选择碎草药" = "Selection of herbs")
|
||||
"ChaosLevel": { // Immunity / Light level
|
||||
"value": "3", // Required number
|
||||
"type": ">" // Is it greater than or less than
|
||||
//(here it means that the Immunity / Light level is greater than 3
|
||||
// (here it means that the Immunity / Light level is greater than 3
|
||||
// only when the option of "Selection of herbs" is activated)
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Choosing good-looking fabrics",
|
||||
"name": "选择好看的织物", // ("选择好看的织物" = "Choosing good-looking fabrics")
|
||||
"ChaosLevel": {
|
||||
"value": "3",
|
||||
"type": ">"
|
||||
@@ -512,62 +620,179 @@ The Encounter options can be modified to guide MAA towards special endings
|
||||
{
|
||||
"theme": "Phantom", // I.S. Theme
|
||||
"priority": [ // Order is the priority
|
||||
// The higher the order, the higher the priority to buy.,
|
||||
// The higher the order, the higher the priority to buy,
|
||||
// However, the priority judgment is before the screening of chars and roles.
|
||||
//high-priority products may be screened out and nothing is purchased.
|
||||
// high-priority products may be screened out and nothing is purchased.
|
||||
{
|
||||
"name": "Golden Chalice", // Collectible name (In this case Golden Caliche)
|
||||
"name": "金酒之杯", // Collectible name ("金酒之杯" = "Golden Chalice")
|
||||
"no_longer_buy": true, // true means don't spend money on the item after getting it
|
||||
// false or empty means continue to spend money on the item
|
||||
"ignore_no_longer_buy": true, // True means that "no_longer_buy" is ignored when the store has the collectible
|
||||
// that is, it will be bought
|
||||
// False or omitted, means that the store has it.
|
||||
"effect": "每有5源石锭, 所有我方单位的攻击速度+7", // Collectible effect (does not affect the operation, useful for convenient sorting)
|
||||
"effect": "每有5源石锭, 所有我方单位的攻击速度+7", // Collectible effect ("For every 5 Originium Ingots, all friendly units get +7 ASPD")
|
||||
// (does not affect the operation, useful for convenient sorting)
|
||||
"no": 167 // Collectible number (can be found in the wiki, does not affect the operation)
|
||||
},
|
||||
|
||||
...
|
||||
{
|
||||
"name": "Hand of Diffusion",
|
||||
"name": "扩散之手", // ("扩散之手" = "Hand of Diffusion")
|
||||
"chars": [ // Buy this item when you have these operators in the team
|
||||
"Passenger" // (This means that if you have Passenger in your team,
|
||||
"异客" // ("异客" = "Passenger") (This means that if you have Passenger in your team,
|
||||
// you will try to buy the Hand of Diffusion when you encounter it)
|
||||
],
|
||||
"effect": "[Diffusion Artist], [Chain Artist], and [Blast Artist] regain 2 SP for each unit they deal damage to.",
|
||||
"effect": "【扩散术师】、【链术师】和【轰击术师】每对一个单位造成伤害就回复2点技力值", // ("[Diffusion Artist], [Chain Artist], and [Blast Artist] regain 2 SP for each unit they deal damage to.")
|
||||
"no": 136
|
||||
},
|
||||
...
|
||||
|
||||
{
|
||||
"name": "Folding the halberd - Breaking the cauldron",
|
||||
"name": "折戟-破釜沉舟", // ("折戟-破釜沉舟" = "Folding the halberd - Breaking the cauldron")
|
||||
"roles": [ // Buy this collectible when you have these classes in your team
|
||||
"WARRIOR" // (This means that if you have a Guard operator in your team
|
||||
// you will try to buy a Halberd-Breaker when you encounter it)
|
||||
],
|
||||
"effect": "All [Guard] Operators members have -40% Defence, but +40% Attack Power and +30% Attack Speed.",
|
||||
"effect": "所有【近卫】干员的防御力-40%,但攻击力+40%,攻击速度+30", // ("All [Guard] Operators members have -40% Defence, but +40% Attack Power and +30% Attack Speed.")
|
||||
"no": 16
|
||||
},
|
||||
...
|
||||
|
||||
{
|
||||
"name": "Miss.Christine Touch coupon",
|
||||
"name": "Miss.Christine摸摸券", // ("Miss.Christine摸摸券" = "Miss.Christine Touch coupon")
|
||||
"promotion": 2, // Purchased when there are 2 operators in the team to be promoted
|
||||
"effect": "Immediate promote two operators (Does not consume Hope)",
|
||||
"effect": "立即进阶两个干员(不消耗希望)", // ("Immediate promote two operators (Does not consume Hope)")
|
||||
"no": 15
|
||||
},
|
||||
...
|
||||
|
||||
{
|
||||
"name": "警戒篱木", // ("警戒篱木" = "Alert Fence")
|
||||
"effect": "坍缩值-2,目标生命上限+2", // ("Collapse value -2, target max life +2")
|
||||
"No": 198,
|
||||
"decrease_collapse": true // true means getting this collectible will reduce collapse value. Will not be purchased when mode is 5
|
||||
},
|
||||
...
|
||||
|
||||
"others": // MAA won't buy these collectibles, like ending collectibles and the crane
|
||||
{
|
||||
"name": "无人起重机" // ("无人起重机" = "Unmanned Crane")
|
||||
},
|
||||
```
|
||||
|
||||
## Desired Logic(todo)
|
||||
## Integrated Strategy Special Mechanisms
|
||||
|
||||
### Sami Integrated Strategy - Foldartals
|
||||
|
||||
`resource/roguelike/Sami/foldartal.json` describes the strategy for Sami's Foldartals
|
||||
|
||||
```json
|
||||
{
|
||||
"theme": "Sami", // I.S. Theme (Sami)
|
||||
"groups": [ // Groups for usage situations and methods
|
||||
{
|
||||
"usage": "SkipBattle", // Usage (Skip battle, used for money farming and hot water mode combat nodes, use plates to skip battles to save time)
|
||||
"doc": "跳过战斗,刷钱和烧开水模式", // ("Skip battle, money farming and hot water mode")
|
||||
"pairs": [ // Plate pairs (when encountering corresponding nodes, will check if there are matching plate pairs as defined below,
|
||||
// if yes, will use all available ones, if no, will enter the node directly)
|
||||
{ // (Here "伤痕" (Scar) can only link with "空无" (Void))
|
||||
"up": [ // Upper plate
|
||||
"伤痕" // ("伤痕" = "Scar")
|
||||
],
|
||||
"down": [ // Lower plate
|
||||
"空无" // ("空无" = "Void")
|
||||
]
|
||||
},
|
||||
{ // (Here will search in order "黜人"+"惊讶","黜人"+"疑惑","黜人"+...,"猎手"+"惊讶","猎手"+"疑惑","猎手"+... , ...)
|
||||
"up": [
|
||||
"黜人", // ("黜人" = "Ejection")
|
||||
"猎手", // ("猎手" = "Hunter")
|
||||
...
|
||||
],
|
||||
"down": [
|
||||
"惊讶", // ("惊讶" = "Surprise")
|
||||
"疑惑", // ("疑惑" = "Doubt")
|
||||
...
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"usage": "Boss", // (Here indicates plate pairs to be used when encountering boss nodes)
|
||||
"doc": "有的用全用了", // ("Use all available ones")
|
||||
...
|
||||
}
|
||||
],
|
||||
"foldartal": [ // Foldartal effects notes (these are just notes for easy reference of plate effects, do not affect program operation)
|
||||
{
|
||||
"name": "布局", // Foldartal type (upper or lower plate)
|
||||
"foldartal": [
|
||||
{
|
||||
"name": "黜人", // Foldartal name ("黜人" = "Ejection")
|
||||
"effect": "选择所有右侧邻近的战斗节点" // Foldartal effect ("Select all combat nodes adjacent to the right")
|
||||
},
|
||||
```
|
||||
|
||||
### Sami Integrated Strategy - Collapsal Paradigms
|
||||
|
||||
When `check_collapsal_paradigms` is `true`, MAA will check for Collapsal Paradigms in two different ways:
|
||||
|
||||
- Click on the upper middle of the screen at the level selection interface to expand the collapse status bar, hereinafter referred to as Panel Check;
|
||||
- Observe whether there is a Collapsal Paradigm notification on the right side of the screen, hereinafter referred to as Banner Check.
|
||||
|
||||
There are various ways to get collapse values, we have considered the following situations:
|
||||
|
||||
1. After combat, the collapse value increases due to imperfect combat, perform Banner Check.
|
||||
2. After combat, the collapse value changes due to obtaining collectibles, perform Banner Check.
|
||||
3. In encounter nodes, etc., the collapse value changes due to selection options, perform Banner Check.
|
||||
4. In the trader node, the collapse value changes due to purchasing collectibles, perform Banner Check.
|
||||
5. The collapse value decreases due to using Foldartals, perform Banner Check.
|
||||
6. The collapse value increases due to entering a new floor, perform Panel Check.
|
||||
7. If during Banner Check it is found that the Collapsal Paradigm has receded, since we don't know if two layers can recede at once (even if they can, the probability is extremely low), an additional Panel Check will be triggered the next time we return to the level selection interface.
|
||||
8. When `double_check_collapsal_paradigms` is `true`, an additional Panel Check will be triggered each time we return to the level selection interface to verify whether there were any missed or extra recorded Collapsal Paradigms.
|
||||
|
||||
Here is an example task configuration for farming hidden Collapsal Paradigms:
|
||||
|
||||
```json
|
||||
{
|
||||
"theme": "Sami",
|
||||
"mode": 5,
|
||||
"investment_enabled": false,
|
||||
"squad": "远程战术分队", // ("远程战术分队" = "Ranged Tactics Squad")
|
||||
"roles": "稳扎稳打", // ("稳扎稳打" = "Steady Approach")
|
||||
"core_char": "维什戴尔", // ("维什戴尔" = "Weathered")
|
||||
"expected_collapsal_paradigms": ["目空一些", "睁眼瞎", "图像损坏", "一抹黑"]
|
||||
// ("目空一些" = "Blank Somewhat", "睁眼瞎" = "Blind Eye", "图像损坏" = "Image Distortion", "一抹黑" = "Pitch Black")
|
||||
}
|
||||
```
|
||||
|
||||
When `mode` is `5`:
|
||||
|
||||
- Priority is given to using combat strategies with `stage_name` as `关卡名_collapse`, for example `resource/roguelike/Sami/autopilot/事不过四_collapse.json`;
|
||||
- Uses the encounter event selection strategy described in `resource/roguelike/Sami/encounter/collapse.json`,
|
||||
- Will not purchase collectibles with `decrease_collapse` set to `true`.
|
||||
|
||||
When `mode` is not `5` but `check_collapsal_paradigms` is `true`, it will still detect Collapsal Paradigms and stop the task when encountering Collapsal Paradigms in the `expected_collapsal_paradigms` list, but will not restart when encountering other Collapsal Paradigms.
|
||||
|
||||
For farming hidden Collapsal Paradigms, N10 difficulty is recommended, with the following teams suggested:
|
||||
|
||||
- Weathered + Spot + Steward;
|
||||
- Reed the Flame Shadow + Orchid + Popukar;
|
||||
- Toddifons + Spot + Steward.
|
||||
|
||||
## Desired Logic (todo)
|
||||
|
||||
### Automatic Formation Logic
|
||||
|
||||
1. Different map formation completeness tests and skill priorities can be set for different map
|
||||
1. Different map formation completeness tests and skill priorities can be set for different maps
|
||||
|
||||
2. You can avoid some difficult battles based on the available lineups
|
||||
|
||||
### Optimising the pathfinding algorithm
|
||||
### Optimising the pathfinding algorithm (already initially implemented)
|
||||
|
||||
For example, you can achieve more battles in the first three levels and fewer battles in the later ones, so that the development will be better
|
||||
For example, more battles in the first three levels and fewer battles in the later ones, so that the development will be better
|
||||
|
||||
For example, identify connections between nodes to determine a more optimal path
|
||||
|
||||
### Skill Retention
|
||||
|
||||
@@ -576,5 +801,3 @@ The operator deployed in a certain frame, wait x seconds for the skill to turn o
|
||||
### Skills Shutdown
|
||||
|
||||
Useful for operators who have ammo skills
|
||||
|
||||
<!-- markdownlint-disable-file MD026 -->
|
||||
|
||||
@@ -43,9 +43,13 @@ Appends a task.
|
||||
// Corresponding task parameters
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, true by default
|
||||
"client_type": string, // Client version, optional, empty by default
|
||||
"client_type": string, // Client version, required
|
||||
// Options: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR"
|
||||
"start_game_enabled": bool // Whether to launch client automatically, optional, false by default
|
||||
"start_game_enabled": bool, // Whether to launch client automatically, optional, false by default
|
||||
"account_name": string // Switch account, optional, don't switch by default
|
||||
// Only supports switching to already logged-in accounts, using login name for identification
|
||||
// Official server: 123****4567, can input 123****4567, 4567, 123, or 3****4567
|
||||
// Bilibili server: Zhang San, can input Zhang San, Zhang, or San
|
||||
}
|
||||
```
|
||||
|
||||
@@ -68,13 +72,13 @@ Appends a task.
|
||||
// Corresponding task parameters
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, true by default
|
||||
"stage": string, // Stage name, optional, by default crrent / last stage. Editing in run-time is not supported.
|
||||
"stage": string, // Stage name, optional, by default current/last stage. Editing in run-time is not supported.
|
||||
// Supports all mainline stages, such as "1-7", "S3-2", etc.
|
||||
// At the end of the level, enter Normal/Hard to switch between Normal and Tough difficulty
|
||||
// Annihilation. The input should be `Annihilation`.
|
||||
// Certain side story stages. The input should be complete with stage number.
|
||||
"medicine": int, // Maximum number Sanity Potion used, optional, by default 0
|
||||
"expiring_medicine": int, // Maximum number of expired Sanity Potion within 48 hours, optional, by default 0
|
||||
// For current SS event last three stages, must input complete stage code.
|
||||
"medicine": int, // Maximum number of Sanity Potions used, optional, by default 0
|
||||
"expiring_medicine": int, // Maximum number of expired Sanity Potions within 48 hours, optional, by default 0
|
||||
"stone": int, // Maximum number of Originite Prime used, optional, by default 0
|
||||
"times": int, // Fight times, optional, by int32.max
|
||||
"series": int, // Number of series, optional, -1~6
|
||||
@@ -87,18 +91,18 @@ Appends a task.
|
||||
},
|
||||
/* Items are combined with OR operators, i.e. the task stops when any condition meets. */
|
||||
|
||||
"report_to_penguin": bool, // Whether to upload data to Pengiun Stats, optional, by default false
|
||||
"penguin_id": string, // Penguin Stats ID, optional, by default empty. Available only when `report_to_penguin` is `true`.
|
||||
"report_to_penguin": bool, // Whether to upload data to Penguin Statistics, optional, by default false
|
||||
"penguin_id": string, // Penguin Statistics ID, optional, by default empty. Available only when `report_to_penguin` is `true`.
|
||||
"server": string, // Server, optional, by default "CN", will affect the drop recognition and upload
|
||||
// Options:"CN" | "US" | "JP" | "KR"
|
||||
"client_type": string, // Client versino, optional, empty by default. Used to reconnect after the game crashed. Empty means to disable this feature
|
||||
"client_type": string, // Client version, optional, empty by default. Used to reconnect after the game crashed. Empty means to disable this feature
|
||||
// Options: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR"
|
||||
"DrGrandet": bool, // Save sanity by using Originites, Optional, false by default. effective only when Originites may be used
|
||||
"DrGrandet": bool, // Save sanity by using Originites, optional, false by default. effective only when Originites may be used
|
||||
// Wait in the using Originites confirmation screen until the 1 point of sanity has been restored and then immediately use the Originite.
|
||||
}
|
||||
```
|
||||
|
||||
Supports some of the special stages,Please refer to [autoLocalization example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/tools/AutoLocalization/example/en-us.xaml#L260).
|
||||
Supports some of the special stages, please refer to [autoLocalization example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/tools/AutoLocalization/example/en-us.xaml#L260).
|
||||
|
||||
- `Recruit`
|
||||
Recruitment
|
||||
@@ -120,10 +124,10 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
string, // When Tag is level-3, as many Tags here as possible (if any) will be selected.
|
||||
... // It's a forced selection, i.e. it ignores all "unselect 3★ Tags" settings.
|
||||
],
|
||||
"extra_tags_mode": int, // Select more tags, optional
|
||||
// 0 - default
|
||||
// 1 - click 3 tags anyway, even if they are in conflict
|
||||
// 2 - select more combinations if possible, even if their tags are in conflict
|
||||
"extra_tags_mode": int, // Select more tags, optional, default is 0
|
||||
// 0 - default behavior
|
||||
// 1 - select 3 tags even if they may conflict
|
||||
// 2 - select more high star tag combinations if possible, even if they might conflict
|
||||
"times": int, // The times of recruitment, optional, by default 0. Can be set to 0 for calculation only.
|
||||
"set_time": bool, // Whether to set time to 9 hours, available only when `times` is 0, optional, by default true
|
||||
"expedite": bool, // Whether to use expedited plans, optional, by default false
|
||||
@@ -135,11 +139,12 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
"4": int,
|
||||
...
|
||||
},
|
||||
"report_to_penguin": bool, // Whether to report to Penguin Stats, optional, by default false.
|
||||
"penguin_id": string, // Penguin Stats user id, optional, by default empty. Valid only if report_to_penguin is true.
|
||||
"report_to_penguin": bool, // Whether to report to Penguin Statistics, optional, by default false.
|
||||
"penguin_id": string, // Penguin Statistics user id, optional, by default empty. Valid only if report_to_penguin is true.
|
||||
"report_to_yituliu": bool, // Whether to report to YITULIU, optional, by default false.
|
||||
"yituliu_id": string, // YITULIU user id, optional, by default empty. Valid only if report_to_yituliu is true.
|
||||
"server": string, // Server, optional, by default "CN", will affect upload
|
||||
// Options: "CN" | "US" | "JP" | "KR"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -148,30 +153,36 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
|
||||
```json5
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, by default true
|
||||
"enable": bool, // Whether to enable this task, optional, by default true
|
||||
"mode": int, // Shift mode, optional. Editing in run-time is not supported.
|
||||
// 0 - By Default, auto shift
|
||||
// 10000 - Custom Mode, please refer 3.6-INFRASTRUCTURE_SCHEDULING_SCHEMA
|
||||
// 0 - Default: Default shift mode, single facility optimal solution
|
||||
// 10000 - Custom: Custom shift mode, reads user configuration, see protocol/base-scheduling-schema.md
|
||||
// 20000 - Rotation: One-key rotation mode, skips control center, power station, dormitory and office, other facilities do not change shifts but retain basic operations (such as using drones, reception room logic)
|
||||
"facility": [ // Facilities for shifting, required. Editing in run-time is not supported.
|
||||
"facility": [ // Facilities for shifting (ordered), required. Editing in run-time is not supported.
|
||||
string, // Facility name: "Mfg" | "Trade" | "Power" | "Control" | "Reception" | "Office" | "Dorm"
|
||||
...
|
||||
],
|
||||
"drones": string, // Usage of drones, optional, by default "_NotUse"
|
||||
// "_NotUse"、"Money"、"SyntheticJade"、"CombatRecord"、"PureGold"、"OriginStone"、"Chip"
|
||||
// This field is ignored when mode = 10000
|
||||
// "_NotUse" | "Money" | "SyntheticJade" | "CombatRecord" | "PureGold" | "OriginStone" | "Chip"
|
||||
"threshold": float, // Morale threshold with range [0, 1.0], optional, by default 0.3
|
||||
"replenish": bool, // Whether to replenish Originium Shard, optional, by default false
|
||||
"dorm_notstationed_enabled": bool, // Whether to enbale Not Stationed in Dorm, by default false
|
||||
"dorm_trust_enabled": bool, // Whether to fill operators in dorm by trust, by default false
|
||||
// When mode = 10000, this field is only effective for "autofill"
|
||||
// This field is ignored when mode = 20000
|
||||
"replenish": bool, // Whether to replenish Originium Shard in trading post, optional, by default false
|
||||
|
||||
/* The following is only valid when mode == 10000 */
|
||||
"filename": string, // Custom config json file path
|
||||
"plan_index": int, // custom config plan index
|
||||
"dorm_notstationed_enabled": bool, // Whether to enable "Not Stationed in Dorm" option, optional, by default false
|
||||
"dorm_trust_enabled": bool, // Whether to fill dormitory with operators not at max trust, optional, by default false
|
||||
"reception_message_board": bool, // Whether to collect credits from reception room message board, optional, by default true
|
||||
"reception_clue_exchange": bool, // Whether to perform clue exchange, optional, by default true
|
||||
|
||||
/* The following parameters are only effective when mode = 10000, otherwise they are ignored */
|
||||
"filename": string, // Custom config path, required. Editing in run-time is not supported.
|
||||
"plan_index": int, // Plan index number in the configuration, required. Editing in run-time is not supported.
|
||||
}
|
||||
```
|
||||
|
||||
- `Mall`
|
||||
Collecting Credits and auto-purchasing
|
||||
Collecting Credits and auto-purchasing.
|
||||
Will buy items in order following `buy_first` list, buy other items from left to right ignoring items in `blacklist`, and buy other items from left to right ignoring the `blacklist` while credit overflows.
|
||||
|
||||
```json5
|
||||
@@ -187,19 +198,25 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
string, // Item name, e.g. "加急许可" (Expedited Plan), "家具零件" (Furniture Part), etc.
|
||||
...
|
||||
],
|
||||
"force_shopping_if_credit_full": bool // Whether to ignore the Blacklist if credit overflows, by default true
|
||||
"only_buy_discount": bool // Whether to purchase only discounted items, applicable only on the second round of purchases, by default false.
|
||||
"reserve_max_credit": boll // Whether to stop purchasing when credit points fall below 300, applicable only on the second round of purchases, by default false.
|
||||
"force_shopping_if_credit_full": bool, // Whether to ignore the Blacklist if credit overflows, by default true
|
||||
"only_buy_discount": bool, // Whether to purchase only discounted items, applicable only on the second round of purchases, by default false
|
||||
"reserve_max_credit": bool // Whether to stop purchasing when credit points fall below 300, applicable only on the second round of purchases, by default false
|
||||
}
|
||||
```
|
||||
|
||||
- `Award`
|
||||
Collecting daily awards.
|
||||
Collecting various rewards
|
||||
|
||||
```json5
|
||||
// Corresponding task parameters
|
||||
{
|
||||
"enable": bool // Whether to enable this task, optional, by default true
|
||||
"enable": bool, // Whether to enable this task, optional, by default true
|
||||
"award": bool, // Collect daily/weekly task rewards, default true
|
||||
"mail": bool, // Collect all mail rewards, default false
|
||||
"recruit": bool, // Collect daily free pulls from limited banners, default false
|
||||
"orundum": bool, // Collect Originium from lucky drop wall, default false
|
||||
"mining": bool, // Collect Originium from limited mining licenses, default false
|
||||
"specialaccess": bool // Collect monthly card rewards from 5th anniversary, default false
|
||||
}
|
||||
```
|
||||
|
||||
@@ -211,10 +228,11 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, default is true
|
||||
"theme": string, // Theme, optional, default is "Phantom"
|
||||
// Phantom - Phantom & Crimson Solitaire
|
||||
// Mizuki - Mizuki & Caerula Arbor
|
||||
// Sami - Expeditioner's Jǫklumarkar
|
||||
// Sarkaz - 萨卡兹的无终奇语
|
||||
// Phantom - Phantom & Crimson Solitaire
|
||||
// Mizuki - Mizuki & Caerula Arbor
|
||||
// Sami - Expeditioner's Jǫklumarkar
|
||||
// Sarkaz - 萨卡兹的无终奇语 (Sarkaz Endless Tale)
|
||||
// JieGarden - 界园 (Boundary Garden)
|
||||
"mode": int, // Mode, optional, default is 0
|
||||
// 0 - Score farming/reward points, aiming to consistently reach higher levels
|
||||
// 1 - Source stone farming, exit after investing in the first layer
|
||||
@@ -224,8 +242,10 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
// the opening reward. If not a specific item, restart at difficulty 0; in the Phantom theme, retry only in the current difficulty
|
||||
// 5 - Collapsal Paradigm farming; only for the Sami theme; accelerates collapsal buildup via missed enemies;
|
||||
// if the first collapsal paradigm encountered is in the `expected_collapsal_paradigms` list, stops the task; otherwise, restarts
|
||||
"squad": string, // Starting squad name, optional, default is "Command Squad";
|
||||
"roles": string, // Starting role group, optional, default is "Complementary Strength";
|
||||
// 6 - Monthly squad rewards farming, same as mode 0 except for specific mode adaptations
|
||||
// 7 - Deep Dive rewards farming, same as mode 0 except for specific mode adaptations
|
||||
"squad": string, // Starting squad name, optional, default is "指挥分队" (Command Squad);
|
||||
"roles": string, // Starting role group, optional, default is "取长补短" (Complementary Strength);
|
||||
"core_char": string, // Starting operator name, optional; supports only single operator **in Chinese**, regardless of server;
|
||||
// leave empty or set to "" to auto-select based on level
|
||||
"use_support": bool, // Whether the starting operator is a support operator, optional, default is false
|
||||
@@ -238,7 +258,7 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
"investment_enabled": bool, // Whether to invest source stones, optional, default is true
|
||||
"investments_count": int, // Number of source stone investments, optional, default is INT_MAX; stops automatically upon reaching limit
|
||||
"stop_when_investment_full": bool, // Whether to stop automatically when investment limit is reached, optional, default is false
|
||||
"investment_with_more_score": bool, // Whether to try shopping after investment, optional, default if false; only applicable to mode 1
|
||||
"investment_with_more_score": bool, // Whether to try shopping after investment, optional, default is false; only applicable to mode 1
|
||||
"start_with_elite_two": bool, // Whether to start with an Elite 2 operator reset, optional, default is false; only applicable to mode 4
|
||||
"only_start_with_elite_two": bool, // Whether to reset only for Elite 2 operator while ignoring other starting conditions, optional, default is false;
|
||||
// only effective when mode is 4 and `start_with_elite_two` is true
|
||||
@@ -246,23 +266,46 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
"first_floor_foldartal": string, // Desired Foldartal to acquire in the first floor foresight phase, optional; only applicable to the Sami theme, any mode;
|
||||
// task stops once obtained successfully
|
||||
"start_foldartal_list": [ // Desired Foldartals for the starting reward phase during opening reset, optional, default is []; effective only for Sami theme and mode 4;
|
||||
string, // Reset is successful only when all Foldartals in the list are present in the opening rewards;
|
||||
... // Note: This parameter must be used with the "Life-Sustaining Squad" as other squads do not obtain Foldartals in the opening reward phase;
|
||||
string, // Reset is successful only when all Foldartals in the list are present in the opening rewards;
|
||||
... // Note: This parameter must be used with the "生活至上分队" (Life-Sustaining Squad) as other squads do not obtain Foldartals in the opening reward phase;
|
||||
],
|
||||
"start_with_two_ideas": bool, // Whether to start with 2 ideas, optional, default is false;effective only for Sarkaz theme and mode 4
|
||||
"collectible_mode_start_list": { // Desired starting rewards (optional), all false by default; only valid in mode 4
|
||||
"hot_water": bool, // Hot Water reward, typically used to trigger boiling mechanism (universal)
|
||||
"shield": bool, // Shield reward, equivalent to extra HP (universal)
|
||||
"ingot": bool, // Originium Ingot reward (universal)
|
||||
"hope": bool, // Hope reward (universal, note: not available in JieGarden theme)
|
||||
"random": bool, // Random reward option: consumes all Ingots for a random collectible (universal)
|
||||
"key": bool, // Key reward, only available in Mizuki theme
|
||||
"dice": bool, // Dice reward, only available in Mizuki theme
|
||||
"ideas": bool, // 2 Ideas reward, only available in Sarkaz theme
|
||||
},
|
||||
"use_foldartal": bool, // Whether to use Foldartals, default is false in mode 5 and true in other modes; only applicable to the Sami theme
|
||||
"check_collapsal_paradigms": bool, // Whether to check obtained Collapsal Paradigms, default is true in mode 5 and false in other modes
|
||||
"double_check_collapsal_paradigms": bool, // Whether to perform additional checks to prevent missed Collapsal Paradigms, default is true in mode 5 and false in other modes;
|
||||
// only effective when theme is Sami and `check_collapsal_paradigms` is true
|
||||
"expected_collapsal_paradigms": [ // Desired Collapsal Paradigms to trigger, default is ["Blank Somewhat", "Blind Eye", "Image Distortion", "Pitch Black"];
|
||||
"expected_collapsal_paradigms": [ // Desired Collapsal Paradigms to trigger, default is ["目空一些" (Blank Somewhat), "睁眼瞎" (Blind Eye), "图像损坏" (Image Distortion), "一抹黑" (Pitch Black)];
|
||||
string, // only effective when theme is Sami and mode is 5
|
||||
...
|
||||
]
|
||||
],
|
||||
"monthly_squad_auto_iterate": bool, // Whether to enable automatic monthly squad rotation
|
||||
"monthly_squad_check_comms": bool, // Whether to also check monthly squad communications as rotation criteria
|
||||
"deep_exploration_auto_iterate": bool, // Whether to enable automatic deep exploration rotation
|
||||
"collectible_mode_shopping": bool, // Whether to enable shopping in hot water mode, default false
|
||||
"collectible_mode_squad": string, // Squad to use in hot water mode, default synced with squad, when squad is empty and collectible_mode_squad not specified, uses Command Squad
|
||||
"collectible_mode_start_list": { // Desired rewards for hot water mode, all false by default, key options:
|
||||
"hot_water": bool, // [hot_water: Hot water, shield: Shield, ingot: Originium Ingot, hope: Hope, random: Random reward, key: Key, dice: Dice, ideas: Ideas]
|
||||
...
|
||||
},
|
||||
"start_with_seed": bool, // Use seed for money farming, effective when true
|
||||
// Only possible to be true in Sarkaz theme, Investment mode, with "点刺成锭分队" (Point-Stab Ingot Squad) or "后勤分队" (Logistics Squad)
|
||||
// Uses fixed seed
|
||||
}
|
||||
```
|
||||
|
||||
For specific information about the Collapsal Paradigm farming feature, please refer to [Integrated Strategy Schema](./integrated-strategy-schema.md#sami-integrated-strategy-collapsal-paradigms)
|
||||
|
||||
- `Copilot`
|
||||
Copilot auto-combat feature
|
||||
Auto combat feature
|
||||
|
||||
```json5
|
||||
{
|
||||
@@ -272,20 +315,20 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
|
||||
}
|
||||
```
|
||||
|
||||
For more details about auto-copilot JSON, please refer to [Copilot Schema](./copilot-schema.md)
|
||||
For more details about auto-combat JSON, please refer to [Combat Operation Protocol](./copilot-schema.md)
|
||||
|
||||
- `SSSCopilot`
|
||||
Copilot auto-combat feature for STATIONARY SECURITY SERVICE
|
||||
Auto combat feature for Stationary Security Service
|
||||
|
||||
```json5
|
||||
{
|
||||
"enable": bool, // Whether to enable this task, optional, by default true
|
||||
"filename": string, // Filename and path of the task JSON, supporting absolute/relative paths. Editing in run-time is not supported.
|
||||
"loop_times": int
|
||||
"loop_times": int // Number of times to loop execution
|
||||
}
|
||||
```
|
||||
|
||||
For more details about auto-copilot JSON, please refer to [Copilot Schema](./copilot-schema.md)
|
||||
For more details about Stationary Security Service JSON, please refer to [SSS Schema](./sss-schema.md)
|
||||
|
||||
- `Depot`
|
||||
Depot recognition
|
||||
@@ -308,12 +351,12 @@ For more details about auto-copilot JSON, please refer to [Copilot Schema](./cop
|
||||
```
|
||||
|
||||
- `Reclamation`
|
||||
ReclamationAlgorithm
|
||||
Reclamation Algorithm
|
||||
|
||||
```json5
|
||||
{
|
||||
"enable": bool,
|
||||
"theme": string, // Theme, optional, 1 by default
|
||||
"theme": string, // Theme, optional, Fire by default
|
||||
// Fire - *Fire Within the Sand*
|
||||
// Tales - *Tales Within the Sand*
|
||||
"mode": int, // Mode, optional, 0 by default
|
||||
@@ -324,7 +367,7 @@ For more details about auto-copilot JSON, please refer to [Copilot Schema](./cop
|
||||
string, // Automatically crafted items, optional, glow stick by default
|
||||
...
|
||||
]
|
||||
// Suggested fill in the substring
|
||||
// Suggested to fill in the substring
|
||||
"increment_mode": int, // Click type, optional. 0 by default
|
||||
// 0 - Rapid Click
|
||||
// 1 - Long Press
|
||||
@@ -357,7 +400,7 @@ For more details about auto-copilot JSON, please refer to [Copilot Schema](./cop
|
||||
// "stage" to set stage name, eg: "details": { "stage": "xxxx" }
|
||||
// "start" to start mission, without details
|
||||
// "action": single battle action, details is single action in Copilot,
|
||||
// eg: "details": { "name": "史尔特尔", "location": [ 4, 5 ], "direction": "左" },详情参考 3.3-战斗流程协议.md
|
||||
// eg: "details": { "name": "史尔特尔", "location": [ 4, 5 ], "direction": "左" }, see protocol/copilot-schema.md for details
|
||||
"details": {
|
||||
...
|
||||
}
|
||||
@@ -370,7 +413,7 @@ For more details about auto-copilot JSON, please refer to [Copilot Schema](./cop
|
||||
```json5
|
||||
{
|
||||
"enable": bool,
|
||||
"filename": string,
|
||||
"filename": string, // Video file path, supporting absolute/relative paths. Editing in run-time is not supported.
|
||||
}
|
||||
```
|
||||
|
||||
@@ -427,7 +470,7 @@ Set process-level parameters
|
||||
|
||||
##### List of Key and value
|
||||
|
||||
None
|
||||
None currently
|
||||
|
||||
### `AsstSetInstanceOption`
|
||||
|
||||
@@ -466,9 +509,9 @@ Set instance-level parameters
|
||||
// "1" - on, "0" - off
|
||||
TouchMode = 2, // Touch mode, minitouch by default
|
||||
// minitouch | maatouch | adb
|
||||
DeploymentWithPause = 3, // Deployment with Pause (Works for IS, Copilot and 保全派驻)
|
||||
DeploymentWithPause = 3, // Deployment with Pause (Works for IS, Copilot and Stationary Security Service)
|
||||
// "1" | "0"
|
||||
AdbLiteEnabled = 4, // Enable AdbLite or not, "0" | "1"
|
||||
KillAdbOnExit = 5, // Release Adb on exit, "0" | "1"
|
||||
KillAdbOnExit = 5, // Release Adb on exit, "0" | "1"
|
||||
};
|
||||
```
|
||||
|
||||
@@ -5,145 +5,156 @@ icon: mdi:remote-desktop
|
||||
|
||||
# Remote Control Schema
|
||||
|
||||
To achieve remote control of MAA, you need to provide a service that must be an HTTP(S) service and provide the following two anonymously accessible endpoints. These endpoints must be HTTP(S) web endpoints.
|
||||
To implement remote control of MAA, you need to provide a service that must be an HTTP(S) service and offer the following two anonymously accessible endpoints. These endpoints must be HTTP(S) web endpoints.
|
||||
|
||||
::: warning
|
||||
If the endpoint is an HTTP protocol, MAA will issue a security warning with each connection. **Deploying plaintext transmission services on the public network is highly discouraged and dangerous, for testing purposes only.**
|
||||
If the endpoint uses HTTP protocol, MAA will issue a security warning with each connection. **Deploying plaintext transmission services on public internet is highly discouraged and dangerous, for testing purposes only.**
|
||||
:::
|
||||
|
||||
::: tip
|
||||
Please note that JSON files do not support comments. The comments in the text are for demonstration purposes only and should NOT be copied directly.
|
||||
Please note that JSON files do not support comments. The comments in this document are for demonstration purposes only. Do not copy them directly.
|
||||
:::
|
||||
|
||||
## Task Retrieval Endpoint
|
||||
|
||||
MAA will continuously poll this endpoint at 1-second intervals, attempting to retrieve tasks it needs to perform and execute them in the order they are retrieved.
|
||||
MAA continuously polls this endpoint at 1-second intervals, attempting to retrieve tasks to execute and executing them in the order received.
|
||||
|
||||
The endpoint path is arbitrary but must be an HTTP(S) endpoint. For example: `https://your-control-host.net/maa/getTask`
|
||||
|
||||
The controlled MAA needs to fill this endpoint into the `Task Retrieval Endpoint` text box in the MAA configuration.
|
||||
The controlled MAA must enter this endpoint in the `Task Retrieval Endpoint` text box in MAA's configuration.
|
||||
|
||||
This endpoint must be able to accept a `Content-Type=application/json` POST request and must be able to accept the following JSON as the request content:
|
||||
This endpoint must accept a POST request with `Content-Type=application/json` and must accept the following JSON as request content:
|
||||
|
||||
```json
|
||||
{
|
||||
"tasks": // A list of Tasks that need to be allowed to be executed by the MAA, the types supported currently are shown in the example, and the connection is considered invalid if the tasks do not exist.
|
||||
[
|
||||
// Sequential tasks: the following tasks are queued for execution in the order in which they are issued.
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", //A unique uuid for the task, type : string, which will be used when reporting on the task.
|
||||
"type": "CaptureImage", //A screenshot task that takes a screenshot of the current emulator and puts it in the payload of the reporting task as a Base64 string. If you need to issue this type of task, be sure to pay attention to the maximum request size that your endpoint can accept, as the screenshot size will lager than 10MB and exceed the default size limit of a typical gateway.
|
||||
},
|
||||
{
|
||||
"id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", //A unique uuid for the task, type : string, which will be used when reporting on the task.
|
||||
"type": "LinkStart", //LinkStart😄
|
||||
},
|
||||
{
|
||||
"id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", // A unique uuid, used in the same way as above.
|
||||
"type": "LinkStart-Recruiting", // Immediately executes the corresponding sub-function of "LinkStart" individually according to the current configuration, ignoring the tick box of this function on the GUI. The optional values for this type of Type are detailed below.
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Same as "id" above
|
||||
"type": "Toolbox-GachaOnce", //The Gacha function in the toolbox, with optional values for this class Type:Toolbox-GachaOnce, Toolbox-GachaTenTimes
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // A unique uuid, used in the same way as above.
|
||||
"type": "Settings-ConnectionAddress", //The task of modifying a configuration item is equivalent to executing the ConfigurationHelper.SetValue("ConnectionAddress", params); For security reasons, not every configuration can be modified, and those that can are detailed below.
|
||||
"params": "value" //The value you want to config
|
||||
},
|
||||
// Immediate Execution Tasks: these following tasks can be executed in a Sequential Execution Task run and the MAA guarantees that any of the following tasks will return results as soon as possible, and are typically used for control of the remote control function itself.
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // A unique uuid, used in the same way as above.
|
||||
"type": "CaptureImageNow", //The Immediate Screenshot task is basically the same as the Screenshot task above, the only difference is that this task will be run immediately without waiting for other tasks.
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // A unique uuid, used in the same way as above.
|
||||
"type": "StopTask", //The "Stop current task" task will attempt to end the currently running task. If there are other tasks in the task list it will continue with the next one. This task does not wait to confirm that the current task has stopped before returning, so use the "HeartBeat" task to confirm that the stop command has taken effect.
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // A unique uuid, used in the same way as above.
|
||||
"type": "HeartBeat", // "Heartbeat" task, the task will immediately return the current "sequential task" queue in the task is executing as the Payload, if there is currently no task execution, return the empty string.
|
||||
},
|
||||
],
|
||||
... // If you have other uses for this endpoint, you can add other return values of your own, but MAA will only read tasks.
|
||||
"user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // User identifier entered in MAA settings
|
||||
"device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec" // Device identifier automatically generated by MAA
|
||||
... // If your endpoint has other uses, you can add optional parameters, but MAA only transmits user and device
|
||||
}
|
||||
```
|
||||
|
||||
This endpoint must return a JSON formatted Response and must at least meet the following format:
|
||||
This endpoint must return a JSON-formatted response that meets at least the following format:
|
||||
|
||||
```json
|
||||
{
|
||||
"tasks": // List of tasks for MAA to execute, currently supported types shown in example, if tasks doesn't exist connection is considered invalid
|
||||
[
|
||||
// Sequential execution tasks: these tasks are queued for execution in the order issued
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "CaptureImage", // Screenshot task, captures current emulator screen and includes as Base64 string in task report payload. If issuing this task type, note your endpoint's maximum request size limit, as screenshots can be tens of MB, exceeding typical gateway defaults
|
||||
},
|
||||
{
|
||||
"id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", // Unique task ID, string type, used when reporting task status
|
||||
"type": "LinkStart", // Start one-click farming
|
||||
},
|
||||
{
|
||||
"id": "15be4725-5bd3-443d-8ae3-0a5ae789254c", // Unique task ID, string type, used when reporting task status
|
||||
"type": "LinkStart-Recruiting", // Immediately execute specific one-click farming sub-function based on current configuration, ignoring main interface checkbox. Optional values detailed below
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "Toolbox-GachaOnce", // Toolbox gacha task, optional values: Toolbox-GachaOnce, Toolbox-GachaTenTimes
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "Settings-ConnectionAddress", // Configuration modification task, equivalent to ConfigurationHelper.SetValue("ConnectionAddress", params); For security, not all settings can be modified, see below for allowed settings
|
||||
"params": "value" // Value to modify
|
||||
},
|
||||
// Immediate execution tasks: these tasks can execute during sequential tasks and MAA guarantees any of these will return results quickly, typically used for controlling the remote control function itself
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "CaptureImageNow", // Immediate screenshot task, similar to screenshot task above but executes immediately without waiting for other tasks
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "StopTask", // "Stop current task" task, attempts to end currently running task. If task list contains other tasks, continues with next task. This task doesn't wait to confirm current task has stopped before returning, use heartbeat task to confirm stop command effectiveness
|
||||
},
|
||||
{
|
||||
"id": "b353c469-b902-4357-bd8f-d133199eea31", // Unique task ID, string type, used when reporting task status
|
||||
"type": "HeartBeat", // Heartbeat task, returns immediately with currently executing sequential task's ID as payload, or empty string if no task executing
|
||||
}
|
||||
],
|
||||
... // If your endpoint has other uses, you can add optional return values, but MAA only reads tasks
|
||||
}
|
||||
```
|
||||
|
||||
These tasks execute in sequence, meaning if you first send a recruitment task followed by a screenshot task, the screenshot will execute after the recruitment task completes.
|
||||
The endpoint should be reentrant and repeatedly return tasks to execute, as MAA automatically tracks task IDs and won't re-execute tasks with the same ID.
|
||||
|
||||
::: note
|
||||
|
||||
- The `LinkStart-[TaskName]` series of tasks have optinal `type` : `LinkStart-Base`,`LinkStart-WakeUp`,`LinkStart-Combat`,`LinkStart-Recruiting`,`LinkStart-Mall`,`LinkStart-Mission`,`LinkStart-AutoRoguelike`,`LinkStart-ReclamationAlgorithm`
|
||||
- The `Settings-[SettingsName]` series of tasks have optinal `type` : `Settings-ConnectionAddress`, `Settings-Stage1`
|
||||
- The Settings series of tasks are still meant to be executed sequentially, not immediately upon receipt, but after the previous task.
|
||||
- Multiple immediately executable tasks are also executed in the order in which they are issued, except that they are all executed so quickly that, in general, it is not necessary to be concerned about their order.
|
||||
:::
|
||||
- LinkStart-[TaskName] task types include LinkStart-Base, LinkStart-WakeUp, LinkStart-Combat, LinkStart-Recruiting, LinkStart-Mall, LinkStart-Mission, LinkStart-AutoRoguelike, LinkStart-Reclamation
|
||||
- Settings-[SettingsName] task types include Settings-ConnectionAddress, Settings-Stage1
|
||||
- Settings series tasks still execute sequentially rather than immediately, queuing behind previous tasks
|
||||
- Multiple immediate execution tasks also execute in issued order, though since these tasks execute quickly, their order generally doesn't matter
|
||||
:::
|
||||
|
||||
## Report Status Endpoint
|
||||
## Task Reporting Endpoint
|
||||
|
||||
When MAA completes a task, it will report the result to this endpoint.
|
||||
When MAA completes a task, it reports the execution result to the remote server through this endpoint.
|
||||
|
||||
The endpoint path is arbitrary but must be an HTTP(S) endpoint. For example: `https://your-control-host.net/maa/reportStatus`
|
||||
|
||||
The controlled MAA needs to fill this endpoint into the `Report Status Endpoint` text box in the MAA configuration.
|
||||
The controlled MAA must enter this endpoint in the `Task Reporting Endpoint` text box in MAA's configuration.
|
||||
|
||||
This endpoint must be able to accept a `Content-Type=application/json` POST request and must be able to accept the following JSON as the request content:
|
||||
This endpoint must accept a POST request with `Content-Type=application/json` and must accept the following JSON as request content:
|
||||
|
||||
```json
|
||||
{
|
||||
"user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // The "User Identifier" you filled in the MAA settings.
|
||||
"device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec", // The "Device Identifier" automatically generated in the MAA.
|
||||
"task":"15be4725-5bd3-443d-8ae3-0a5ae789254c", // The Id of the task to be reported on, corresponding to the Id when 'getTask'.
|
||||
"status":"SUCCESS", // The result of the task execution, SUCCESS or FAILED. generally, regardless of the success of the task execution will only return SUCCESS, only in special circumstances will return FAILED, will return FAILED situation, will be explicitly described in the above task introduction.
|
||||
"payload":"", //The data to carry when reporting, string type. Depends on the task type, for example, when reporting on a screenshot task, the Base64 string of the screenshot will be carried here.
|
||||
... // If you have other uses for this endpoint, you can add other return values of your own, but MAA will only post upper value.
|
||||
"user":"ea6c39eb-a45f-4d82-9ecc-33a7bf2ae4dc", // User identifier entered in MAA settings
|
||||
"device":"f7cd9682-3de9-4eef-9137-ec124ea9e9ec", // Device identifier automatically generated by MAA
|
||||
"task":"15be4725-5bd3-443d-8ae3-0a5ae789254c", // Task ID being reported, corresponding to ID from task retrieval
|
||||
"status":"SUCCESS", // Task execution result, SUCCESS or FAILED. Generally returns SUCCESS regardless of task execution success, FAILED only in special cases noted in task descriptions
|
||||
"payload":"", // Data included in report, string type. Depends on task type, e.g., screenshot task includes Base64 string of screenshot
|
||||
... // If your endpoint has other uses, you can add optional parameters, but MAA only transmits user and device
|
||||
}
|
||||
```
|
||||
|
||||
The content returned by this endpoint is arbitrary, but if you do not return `200 OK`, a notification will pop up on the MAA side displaying `Upload failed`.
|
||||
This endpoint's response content is arbitrary, but if not returning 200 OK, a notification will appear in MAA displaying "Upload failed"
|
||||
|
||||
## Example Workflow : Controlling MAA with QQBot
|
||||
## Example Workflow - Controlling MAA with QQ Bot
|
||||
|
||||
A developer wants to control MAA with their QQBot (QQ is an instant messaging software,like WhatsApp or Telegram), so they develop a backend exposed on the public network, providing two endpoints:
|
||||
Developer A wants to control MAA with their QQ Bot, so they developed a backend exposed on public internet providing two endpoints:
|
||||
|
||||
```text
|
||||
https://myqqbot.com/maa/getTask
|
||||
https://myqqbot.com/maa/reportStatus
|
||||
```
|
||||
|
||||
To make it more convenient for users, their `getTask` interface always returns `200 OK` and an empty tasks list regardless of the parameters received.
|
||||
Each time they receive a request, they check the database for duplicate devices, and if none, they record the device and user in the database.
|
||||
In this workflow, this interface also serves as a user registration function.
|
||||
For user convenience, their getTask interface returns 200 OK and an empty tasks list regardless of received parameters.
|
||||
Each time they receive a request, they check the database for duplicate devices, and if none found, record the device and user in the database.
|
||||
In this workflow, this interface also serves as user registration.
|
||||
|
||||
They provide a command on the QQBot for users to submit their deviceId.
|
||||
They provide a command on their QQ Bot for users to submit deviceId.
|
||||
|
||||
In the QQBot's usage instructions, they tell users to fill in their QQ number in the `User Identifier` field of MAA and send the `Device Identifier` to the Bot via QQ chat.
|
||||
In the QQ Bot's usage instructions, they tell users to enter their QQ number in MAA's `User Identifier` field and send their `Device Identifier` to the Bot via QQ chat.
|
||||
|
||||
Upon receiving the identifier, the QQBot checks the database for corresponding data based on the user's QQ number in the message. If none is found, it tells the user to configure MAA first.
|
||||
Upon receiving the identifier, the QQ Bot checks the database for corresponding data based on the message's QQ number, instructing the user to configure MAA if not found.
|
||||
|
||||
Since MAA continuously sends requests once configured, if the user has configured MAA, there should be matching records in the database when they submit via QQ.
|
||||
Since MAA continuously sends requests once configured, if the user has properly configured MAA, matching records should exist in the database when they submit via QQ.
|
||||
|
||||
At this point, the Bot marks the record in the database as verified, so future requests from getTask with this device and user will return the real task list.
|
||||
The Bot then marks the database record as verified, so future getTask requests with this device and user combination will return actual task lists.
|
||||
|
||||
When the user submits a command via QQBot, the Bot writes a task into the database. Shortly after, getTask will return this task. Additionally, the QQBot thoughtfully adds a screenshot task each time the user submits a command.
|
||||
When users submit commands via QQ Bot, the Bot writes a task to the database, which getTask will return shortly. Additionally, the Bot thoughtfully adds a screenshot task after each user command.
|
||||
|
||||
MAA will call reportStatus to report the result after completing the task. The Bot will send a message notifying the user and display the screenshot on QQ.
|
||||
After executing tasks, MAA calls reportStatus to report results, and the Bot sends QQ messages notifying users and displaying screenshots.
|
||||
|
||||
## Example Workflow : Controlling MAA with a Website
|
||||
## Example Workflow - Controlling MAA with Website
|
||||
|
||||
Developer B wrote a website to manage MAA in bulk through a website, so they have their own user management system. However, their backend is publicly accessible, providing two anonymously accessible endpoints:
|
||||
Developer B created a website for batch MAA management with their own user management system. Their backend is publicly accessible with two anonymously accessible endpoints:
|
||||
|
||||
```text
|
||||
https://mywebsite.com/maa/getTask
|
||||
https://mywebsite.com/maa/reportStatus
|
||||
```
|
||||
|
||||
On the website, there is an interface to connect MAA instances, will generate a random string called `User Key`, along with a text box for entering the `Device Identifier`.
|
||||
On the website, a MAA instance connection interface displays what Developer B calls a `User Key` (random string) and has a text box for entering device ID.
|
||||
|
||||
The website requires users to fill in their `User Key` in the `User Identifier` field of MAA GUI and then enter the `Device Identifier` on the website.
|
||||
The website instructs users to enter their user key in MAA's `User Identifier` field and their `Device Identifier` on the website.
|
||||
|
||||
Only after successfully creating a connection to MAA on the website, `getTask` will return `200 OK`. Otherwise, it returns `401 Unauthorized`.
|
||||
Only after successfully creating a MAA connection on the website will getTask return 200 OK; otherwise it returns 401 Unauthorized.
|
||||
|
||||
If the user fills it incorrectly on MAA and presses the test connection button, they will get a test failure prompt.
|
||||
If users enter incorrect information in MAA and press the test connection button, they'll receive a connection test failure notification.
|
||||
|
||||
Users can issue tasks on the website, queue tasks, view screenshots, and more. The implementation of these functions is similar to the QQBot example above, achieved through a combination of `getTask` and `reportStatus`.
|
||||
Users can issue tasks on the website, queue tasks, view screenshots, etc., with implementation similar to the QQ Bot example, using getTask and
|
||||
|
||||
@@ -3,76 +3,97 @@ order: 7
|
||||
icon: game-icons:prisoner
|
||||
---
|
||||
|
||||
# Security Presence Schema
|
||||
|
||||
This document is machine-translated. If you have the ability, please refer to the Chinese version. We would greatly appreciate any errors or suggestions for improvement.
|
||||
# Stationary Security Service Schema
|
||||
|
||||
::: tip
|
||||
As the JSON format does not support comments, please remove them when using the examples below.
|
||||
Please note that JSON files do not support comments. The comments in this document are for demonstration purposes only. Do not copy them directly into your JSON files.
|
||||
:::
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "SSS", // Protocol type, SSS means a stationed preservation, required, unchangeable
|
||||
"stage_name": "Duos Lore building site", // The name of the preservation location, required
|
||||
"minimum_required": "v4.9.0", // The minimum required version of MAA, required
|
||||
"doc": { // Description, optional
|
||||
"title": "Low-skill high-success-rate operation",
|
||||
"type": "SSS", // Protocol type, SSS indicates Stationary Security Service, required, cannot be modified
|
||||
"stage_name": "多索雷斯在建地块", // Map name, required ("多索雷斯在建地块" = "Dossoles Under Construction")
|
||||
"minimum_required": "v4.9.0", // Minimum required MAA version, required
|
||||
"doc": {
|
||||
// Description, optional
|
||||
"title": "低练度高成功率作业", // ("低练度高成功率作业" = "Low-investment high-success rate operation")
|
||||
"title_color": "dark",
|
||||
"details": "Low skill requirements balabala... It is suggested to write your name (author's name), reference to video strategy links, etc. here.",
|
||||
"details": "对练度要求很低balabala……", // Recommend adding your name (author), reference video links, etc. here ("对练度要求很低balabala……" = "Very low level requirements etc...")
|
||||
"details_color": "dark"
|
||||
},
|
||||
"buff": "Adaptive Supply Component", // The choice of starting navigation element, optional
|
||||
"equipment": [ // The choice of starting equipment, counted horizontally, optional
|
||||
// Not implemented in the current version, only displayed on the interface
|
||||
"A", "A", "A", "A",
|
||||
"B", "B", "B", "B"
|
||||
"buff": "自适应补给元件", // Starting navigation element selection, optional ("自适应补给元件" = "Adaptive Supply Component")
|
||||
"equipment": [
|
||||
// Starting equipment selection, read horizontally, optional
|
||||
// Not implemented in current version, only displayed in interface
|
||||
"A",
|
||||
"A",
|
||||
"A",
|
||||
"A",
|
||||
"B",
|
||||
"B",
|
||||
"B",
|
||||
"B"
|
||||
],
|
||||
"strategy": "Optimized strategy", // Or "Free strategy", optional
|
||||
// Not implemented in the current version, only displayed on the interface
|
||||
"opers": [ // Specified operator, optional
|
||||
"strategy": "优选策略", // Or "自由策略" ("Free strategy"), optional
|
||||
// Not implemented in current version, only displayed in interface
|
||||
"opers": [
|
||||
// Specified operators, optional
|
||||
{
|
||||
"name": "Thorns",
|
||||
"name": "棘刺", // ("棘刺" = "Thorns")
|
||||
"skill": 3,
|
||||
"skill_usage": 1
|
||||
}
|
||||
],
|
||||
"tool_men": { // The remaining number of personnel of each profession needed, sorted by cost, optional
|
||||
// Not implemented in the current version, only displayed on the interface
|
||||
"tool_men": {
|
||||
// Remaining required operators by profession, picked by cost, optional
|
||||
// Not implemented in current version, only displayed in interface
|
||||
"Pioneer": 13,
|
||||
"Guards": 2,
|
||||
"近卫": 2, // Both Chinese and English supported ("近卫" = "Guard")
|
||||
"Medic": 2
|
||||
},
|
||||
"drops": [ // Priority of recruiting operators and obtaining equipment at the beginning and during the battle
|
||||
"Silence",
|
||||
"Exusiai",
|
||||
"Vanguard",
|
||||
"drops": [
|
||||
// Recruitment priority for operators and equipment at battle start and during battle
|
||||
"空弦", // ("空弦" = "Archetto")
|
||||
"能天使", // Supports operator names, class names ("能天使" = "Exusiai")
|
||||
"先锋", // Class names in Chinese or English ("先锋" = "Vanguard")
|
||||
"Support",
|
||||
"No need to increase the adjustment operator", // Not recruiting anyone
|
||||
"Reorganization Navigation Module", // Supports the name of the equipment, written together
|
||||
"Counter Navigation Module",
|
||||
"Combat Preparation Actuator", // Optional equipment in the middle of the level, also put here
|
||||
"Modified Device Signal",
|
||||
"无需增调干员", // Don't recruit anyone ("无需增调干员" = "No recruitment needed")
|
||||
"重整导能组件", // Supports equipment names ("重整导能组件" = "Reorganization Navigation Component")
|
||||
"反制导能组件", // ("反制导能组件" = "Counter Navigation Component")
|
||||
"战备激活阀", // In-stage optional equipment, also listed here ("战备激活阀" = "Combat Preparation Actuator")
|
||||
"改派发讯器" // ("改派发讯器" = "Modified Device Signal")
|
||||
],
|
||||
"blacklist": [ // Blacklist, optional. These people will not be selected in drops.
|
||||
// In subsequent versions, the formation tool people will not choose these people either.
|
||||
"Midnight",
|
||||
"Mayer"
|
||||
"blacklist": [
|
||||
// Blacklist, optional. These won't be selected in drops.
|
||||
// In future versions with squad formation, these won't be selected as tool operators either
|
||||
"夜半", // ("夜半" = "Nightingale")
|
||||
"梅尔" // ("梅尔" = "Mayer")
|
||||
],
|
||||
"stages": [
|
||||
{
|
||||
"stage_name": "Swarm", // Name of a single-level stage, required
|
||||
// Supports name, stageId, levelId, recommended stageId or levelId
|
||||
// Please do not use codes (e.g. LT-1), that conflict with other preservation stages
|
||||
|
||||
|
||||
"strategies": [ // Required
|
||||
// It will deploy the tool_men in each object according to the order.
|
||||
// If the current hand does not have any tool_men, it will deploy the next object.
|
||||
"stage_name": "蜂拥而上", // Single stage name, required ("蜂拥而上" = "Swarming Advance")
|
||||
// Supports name, stageId, levelId; recommend stageId or levelId
|
||||
// Don't use code (e.g., LT-1) as it conflicts with other SSS stages
|
||||
"strategies": [
|
||||
// Required
|
||||
// Each check processes from top to bottom in sequence, skipping completed strategies
|
||||
// If current strategy's tool operators are fully deployed:
|
||||
// If no core, consider strategy complete
|
||||
// If core exists and can be deployed, deploy core and consider strategy complete
|
||||
// If core is converting DP, wait and skip subsequent strategies
|
||||
// If current strategy's tool operators aren't fully deployed:
|
||||
// If deployment area has no required tool operators, check next strategy
|
||||
// If deployment area has required tool operators:
|
||||
// If none can be deployed immediately, wait
|
||||
// If some can be deployed immediately, prioritize lower cost ones
|
||||
// For strategies at same location:
|
||||
// If no core, allows checking subsequent strategies at same location when needed tool operators unavailable
|
||||
// If core exists, ignores subsequent strategies at same location until current one completes
|
||||
// Multiple core operators can be written for same location; non-last core operators act as passthrough after strategy completes
|
||||
{
|
||||
"core": "Thorns",
|
||||
"core": "棘刺", // ("棘刺" = "Thorns")
|
||||
"tool_men": {
|
||||
"Pioneer": 1, // Both Chinese and English names are acceptable.
|
||||
"Pioneer": 1, // Both Chinese and English supported
|
||||
"Warrior": 1,
|
||||
"Medic": 1
|
||||
},
|
||||
@@ -83,7 +104,7 @@ As the JSON format does not support comments, please remove them when using the
|
||||
"direction": "Left"
|
||||
},
|
||||
{
|
||||
"core": "Mudrock",
|
||||
"core": "泥岩", // ("泥岩" = "Mudrock")
|
||||
"tool_men": {
|
||||
"Pioneer": 1,
|
||||
"Warrior": 1,
|
||||
@@ -96,7 +117,7 @@ As the JSON format does not support comments, please remove them when using the
|
||||
"direction": "Left"
|
||||
},
|
||||
{
|
||||
// If "core" is not provided, it can be used to deploy tool_men that assist with passing.
|
||||
// No core field, can be used to deploy auxiliary passthrough operators
|
||||
"tool_men": {
|
||||
"Support": 100
|
||||
},
|
||||
@@ -107,42 +128,43 @@ As the JSON format does not support comments, please remove them when using the
|
||||
"direction": "Left"
|
||||
}
|
||||
],
|
||||
"draw_as_possible": true, // "Deploy Operator" button. Whether to use it when available. Optional, default is true.
|
||||
"actions": [ // Optional
|
||||
// It reuses the logic of copying homework.
|
||||
// If the condition of the action is met, the action is executed. Otherwise, the strategies above are executed.
|
||||
"draw_as_possible": true, // "Deploy Operator" button, whether to use when ready, optional, default true
|
||||
"actions": [
|
||||
// Optional
|
||||
// Reuses copywriting logic, refer to protocol/copilot-schema.md
|
||||
// Executes action when conditions met, otherwise executes strategies logic above
|
||||
{
|
||||
"type": "Deploy Operator" // New type. Click the "Deploy Operator" button. It is invalid when "draw_as_possible" is true.
|
||||
"type": "调配干员" // New type, "Deploy Operator" button, clicks once, ineffective when "draw_as_possible" is true ("调配干员" = "Deploy Operator")
|
||||
},
|
||||
{
|
||||
"type": "CheckIfStartOver", // New type. Check if the operator is available. If not, exit and restart.
|
||||
"name": "Thorns"
|
||||
"type": "CheckIfStartOver", // New type, checks if operator is present, exits and restarts if not
|
||||
"name": "棘刺" // ("棘刺" = "Thorns")
|
||||
},
|
||||
{
|
||||
"name": "Firewatch",
|
||||
"name": "桃金娘", // ("桃金娘" = "Myrtle")
|
||||
"location": [
|
||||
4,
|
||||
5
|
||||
],
|
||||
"direction": "Left"
|
||||
"direction": "左" // ("左" = "Left")
|
||||
},
|
||||
{
|
||||
"kills": 10,
|
||||
"type": "Retreat",
|
||||
"name": "Firewatch"
|
||||
"type": "撤退", // ("撤退" = "Retreat")
|
||||
"name": "桃金娘" // ("桃金娘" = "Myrtle")
|
||||
}
|
||||
],
|
||||
"retry_times": 3 // The number of times to retry when the battle fails. If it exceeds this limit, it will give up on the entire stage.
|
||||
"retry_times": 3 // Battle failure retry count, abandons entire run if exceeded
|
||||
},
|
||||
{
|
||||
"stage_name": "Grani and the Knights' Treasure"
|
||||
"stage_name": "见者有份" // ("见者有份" = "Share the Spoils")
|
||||
// ...
|
||||
}
|
||||
// Write as many stages as you want to play. For example, if only 4 is written, it will automatically restart after completing stage 4.
|
||||
// Write as many stages as you want to play, e.g., if only up to stage 4 is written, automatically restarts after completing stage 4
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Example
|
||||
## Example Files
|
||||
|
||||
<https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/resource/copilot/>
|
||||
|
||||
@@ -7,154 +7,189 @@ icon: material-symbols:task
|
||||
|
||||
Usage of `resource/tasks` and description of each field
|
||||
|
||||
## Overview
|
||||
::: tip
|
||||
Please note that JSON files do not support comments. The comments in this document are for demonstration purposes only. Do not copy them directly into your JSON files.
|
||||
:::
|
||||
|
||||
## Complete Field Reference
|
||||
|
||||
```json
|
||||
{
|
||||
"TaskName" : { // Task name
|
||||
"TaskName": { // Task name, using @ may indicate a special task, default values will differ, see Special Task Types below
|
||||
|
||||
"baseTask": "xxx", // use xxx task as a template to generate tasks, see Base Task in the special task type below for details
|
||||
"baseTask": "xxx", // Use xxx task as template to generate tasks, see Base Task in Special Task Types for details
|
||||
|
||||
"algorithm": "MatchTemplate", // Optional, indicating the type of recognition algorithm
|
||||
// defaults to MatchTemplate when not filled in
|
||||
// - JustReturn: Execute the action directly without recognition
|
||||
// - MatchTemplate: match the image
|
||||
// - OcrDetect: text recognition
|
||||
// - Hash: Hash calculation
|
||||
"algorithm": "MatchTemplate", // Optional, indicates the recognition algorithm type
|
||||
// Default is MatchTemplate when not specified
|
||||
// - JustReturn: No recognition, directly execute action
|
||||
// - MatchTemplate: Match image
|
||||
// - OcrDetect: Text recognition
|
||||
// - FeatureMatch: Feature matching
|
||||
|
||||
"action": "ClickSelf", // Optional, indicates the action after recognition
|
||||
// defaults to DoNothing if not filled in
|
||||
// - ClickSelf: Click on the recognized location (a random point within the recognized target range)
|
||||
// - ClickRand: Click on a random position in the whole screen
|
||||
// - ClickRect: Click on the specified area, that corresponds to the specificRect field, not recommended to use this option
|
||||
// - DoNothing: Do nothing
|
||||
// - Stop: Stop the current task
|
||||
// - Swipe: slide, corresponds to the specificRect and rectMove fields
|
||||
"action": "ClickSelf", // Optional, indicates action after recognition
|
||||
// Default is DoNothing when not specified
|
||||
// - ClickSelf: Click on recognized position (random point within target area)
|
||||
// - ClickRect: Click on specified area, corresponds to specificRect field, not recommended
|
||||
// - DoNothing: Do nothing
|
||||
// - Stop: Stop current task
|
||||
// - Swipe: Swipe, corresponds to specificRect and rectMove fields
|
||||
// - Input: Input text, requires algorithm to be JustReturn, corresponds to inputText field
|
||||
|
||||
"sub": [ "SubTaskName1", "SubTaskName2" ],
|
||||
// Optional, subtasks. Will execute each subtask in turn after the current task is executed
|
||||
// Optional, sub-tasks and then sub-tasks. But be careful not to write a dead loop
|
||||
"sub": ["SubTaskName1", "SubTaskName2"],
|
||||
// Optional, subtasks, not recommended. Will execute each subtask after completing current task
|
||||
// Can be nested, with subtasks having their own subtasks. Be careful not to create infinite loops
|
||||
|
||||
"subErrorIgnored": true, // Optional, if or not to ignore subtask errors.
|
||||
// default false if not filled
|
||||
// If false, if a subtask has an error, it will not continue to execute subsequent tasks (equivalent to this task having an error)
|
||||
// When true, it does not affect whether a subtask has an error or not
|
||||
"subErrorIgnored": true, // Optional, whether to ignore subtask errors
|
||||
// Default false when not specified
|
||||
// When false, if a subtask errors, subsequent tasks won't execute (equivalent to current task erroring)
|
||||
// When true, subtask errors don't affect execution
|
||||
|
||||
"next": [ "OtherTaskName1", "OtherTaskName2" ],
|
||||
// Optional, indicating the next task to be executed after the current task and the subtask are executed
|
||||
// will be identified from front to back, and the first matching one will be executed
|
||||
// default stop after the current task is executed
|
||||
// For the same task, the second time will not be recognized after the first recognition.
|
||||
// "next": [ "A", "B", "A", "A" ] -> "next": [ "A", "B" ]
|
||||
// Do not allow JustReturn type tasks to be located in a non-last item
|
||||
"next": ["OtherTaskName1", "OtherTaskName2"],
|
||||
// Optional, indicates tasks to execute after completing current task and subtasks
|
||||
// Will check from first to last and execute first matching task
|
||||
// Default is to stop after completing current task when not specified
|
||||
// For identical tasks, second recognition won't occur after first:
|
||||
// "next": [ "A", "B", "A", "A" ] -> "next": [ "A", "B" ]
|
||||
// JustReturn type tasks must not be in non-last positions
|
||||
|
||||
"maxTimes": 10, // Optional, indicates the maximum number of times the task can be executed
|
||||
// default infinite if not filled
|
||||
// When the maximum number of times is reached, if the exceededNext field exists, the task will be executed as exceededNext; otherwise, the task will be stopped.
|
||||
"maxTimes": 10, // Optional, maximum execution count for this task
|
||||
// Default is infinity when not specified
|
||||
// After reaching max count, will execute exceededNext if present, otherwise stop
|
||||
|
||||
"exceededNext": [ "OtherTaskName1", "OtherTaskName2" ],
|
||||
// Optional, indicates the task to be executed when the maximum number of executions is reached
|
||||
// If not filled in, it will stop when the maximum number of executions is reached; if filled in, it will be executed here, not in next
|
||||
"onErrorNext": [ "OtherTaskName1", "OtherTaskName2" ],
|
||||
// Optional, indicating the subsequent tasks to be performed in case of execution errors
|
||||
"exceededNext": ["OtherTaskName1", "OtherTaskName2"],
|
||||
// Optional, tasks to execute after reaching maximum execution count
|
||||
// When not specified, stops after max count; when specified, executes these instead of next
|
||||
|
||||
"preDelay": 1000, // Optional, indicates how long the action will be executed after it is recognized, in milliseconds; default 0 if not filled in
|
||||
"postDelay": 1000, // Optional, indicates how long the action is delayed after execution before it is recognized next, in milliseconds; default 0 if not filled in
|
||||
"onErrorNext": ["OtherTaskName1", "OtherTaskName2"],
|
||||
// Optional, tasks to execute when an error occurs
|
||||
|
||||
"roi": [ 0, 0, 1280, 720 ], // Optional, indicating the range of recognition, in the format [ x, y, width, height ]
|
||||
// Auto-scaling to 1280x720; default when not filled [ 0, 0, 1280, 720 ]
|
||||
// Fill in as much as possible, reducing the recognition range can reduce performance consumption and speed up recognition
|
||||
"preDelay": 1000, // Optional, delay in milliseconds after recognition before executing action; default 0
|
||||
"postDelay": 1000, // Optional, delay in milliseconds after executing action before recognizing next; default 0
|
||||
|
||||
"cache": false, // Optional, indicates whether the task uses caching or not, default is false;
|
||||
// After the first recognition, only the first recognized position will be recognized forever, enable to save performance significantly
|
||||
// but only for tasks where the location of the target to be recognized will not change at all, set to false if the location of the target to be recognized will change
|
||||
"roi": [0, 0, 1280, 720], // Optional, recognition area in format [x, y, width, height]
|
||||
// Auto-scales to 1280 * 720 resolution; default [0, 0, 1280, 720] when not specified
|
||||
// Try to specify this to reduce recognition area, improve performance and recognition speed
|
||||
|
||||
"rectMove": [ 0, 0, 0, 0 ], // Optional, target movement after recognition, not recommended Auto-scaling with 1280 * 720 as base
|
||||
// For example, if A is recognized, but the actual location to be clicked is somewhere in the 10 pixel 5 * 2 area below A.
|
||||
//Then you can fill in [ 0, 10, 5, 2 ], and try to recognize the position to be clicked directly if you can, this option is not recommended
|
||||
// Additional, valid and mandatory when action is Swipe, indicates the end of the slide.
|
||||
"cache": true, // Optional, whether to use cache for this task, default true
|
||||
// After first recognition, will always check at same position, greatly improves performance
|
||||
// Only suitable for targets whose position never changes, set false if target position may change
|
||||
|
||||
"reduceOtherTimes": [ "OtherTaskName1", "OtherTaskName2" ],
|
||||
// Optional; executes to reduce the execution count of other tasks.
|
||||
// For example, if you take a sanity pill, it means that the last click on the blue start action button did not take effect, so the blue start action is -1
|
||||
"rectMove": [0, 0, 0, 0], // Optional, target movement after recognition, not recommended. Auto-scales to 1280 * 720
|
||||
// For example, if A is recognized but actual click target is 10 pixels below in 5 * 2 area,
|
||||
// can use [0, 10, 5, 2], but if possible try to directly recognize target position instead
|
||||
// Additionally, when action is Swipe, indicates endpoint (required)
|
||||
|
||||
"specificRect": [ 100, 100, 50, 50 ],
|
||||
// Valid and mandatory when action is ClickRect, indicates the specified click position (a random point in the range).
|
||||
// Valid and mandatory when action is Swipe, it means the starting point of swipe.
|
||||
// Auto-scaling with 1280 * 720 as base
|
||||
// When the algorithm is "OcrDetect", specificRect[0] and specificRect[1] represent the grayscale upper and lower threshold values.
|
||||
"reduceOtherTimes": ["OtherTaskName1", "OtherTaskName2"],
|
||||
// Optional, reduces execution count of other tasks after execution
|
||||
// For example, if you used a sanity potion, previous blue start button click didn't work, so reduce by 1
|
||||
|
||||
"specialParams": [ int, ... ], // Parameters needed for some special recognizers
|
||||
// extra, optional when action is Swipe, [0] for duration, [1] for whether to enable extra sliding
|
||||
"specificRect": [100, 100, 50, 50],
|
||||
// Required when action is ClickRect, indicates specified click area (random point within)
|
||||
// Required when action is Swipe, indicates starting point
|
||||
// Auto-scales to 1280 * 720 resolution
|
||||
// When algorithm is "OcrDetect", specificRect[0] and specificRect[1] represent grayscale threshold limits
|
||||
|
||||
/* The following fields are only valid if the algorithm is MatchTemplate */
|
||||
"specialParams": [int, ...], // Parameters for special recognizers
|
||||
// Optional when action is Swipe, [0] for duration, [1] for extra swipe toggle
|
||||
|
||||
"template": "xxx.png", // Optional, the name of the image file to be matched
|
||||
// default "TaskName.png"
|
||||
"highResolutionSwipeFix": false, // Optional, whether to enable high-resolution swipe fix
|
||||
// Currently only needed for stage navigation which doesn't use unity swipe method
|
||||
// Default is false
|
||||
|
||||
/* Fields below only valid when algorithm is MatchTemplate */
|
||||
|
||||
"templThreshold": 0.8, // Optional, a threshold value for image template matching score, above which the image is considered recognized.
|
||||
// default 0.8, you can check the actual score according to the log
|
||||
"template": "xxx.png", // Optional, image file to match, can be string or string list
|
||||
// Default "TaskName.png"
|
||||
// Template files can be in template folder or subfolders, recursive search when loading
|
||||
|
||||
"maskRange": [ 1, 255 ], // Optional, the grayscale mask range.
|
||||
// For example, the part of the image that does not need to be recognized will be painted black (grayscale value of 0)
|
||||
// Then set "maskRange" to [ 1, 255 ], to instantly ignore the blacked-out parts when matching
|
||||
"templThreshold": 0.8, // Optional, threshold score for image template matching, can be number or number list
|
||||
// Default 0.8, check actual score in logs
|
||||
|
||||
"colorScales": [ // Effective and required when method is HSVCount or RGBCount, color mask range.
|
||||
[ // list<array<array<int, 3>, 2> | array<int, 2>>
|
||||
"maskRange": [1, 255], // Optional, grayscale mask range for matching. array<int, 2>
|
||||
// For example, paint parts of image that shouldn't be recognized black (grayscale 0)
|
||||
// Then set [1, 255] to ignore black parts during matching
|
||||
|
||||
"colorScales": [ // Required when method is HSVCount or RGBCount, color mask ranges
|
||||
[ // list<array<array<int, 3>, 2>> / list<array<int, 2>>
|
||||
[23, 150, 40], // Structure is [[lower1, upper1], [lower2, upper2], ...]
|
||||
[25, 230, 150] // Inner layer is int if grayscale,
|
||||
], // is array<int, 3> if three-channel color, method determines whether it is RGB or HSV;
|
||||
... // Middle layer array<*, 2> is the color (or grayscale) lower and upper limits:
|
||||
], // Outer layer represents different color ranges, the region to be identified is the union of their corresponding masks on the template image.
|
||||
[25, 230, 150] // Inner layer is int for grayscale,
|
||||
], // or array<int, 3> for three-channel color (RGB or HSV based on method)
|
||||
... // Middle layer array<*, 2> is color (or grayscale) lower and upper limits
|
||||
], // Outer layer represents different color ranges, recognition area is their union on template image
|
||||
|
||||
"colorWithClose": true, // Optional, effective when method is HSVCount or RGBCount, default is true
|
||||
// Whether to first apply morphological closing to the mask range when counting colors.
|
||||
// Morphological closing can fill small black spots, generally improving color counting matching results, but if the image contains text, it is recommended to set it to false
|
||||
"colorWithClose": true, // Optional when method is HSVCount or RGBCount, default true
|
||||
// Whether to use morphological closing on mask range for color counting
|
||||
// Closing fills small black dots, generally improves color matching but set false for text
|
||||
|
||||
"method": "Ccoeff", // Optional, template matching algorithm, can be a list
|
||||
// Default is Ccoeff if not specified
|
||||
// - Ccoeff: Template matching algorithm insensitive to color, corresponds to cv::TM_CCOEFF_NORMED
|
||||
// - RGBCount: Template matching algorithm sensitive to color,
|
||||
// First binarize the region to be matched and the template image based on colorScales,
|
||||
// Calculate the similarity in RGB color space using F1-score as the indicator,
|
||||
// Then dot the result with the Ccoeff result
|
||||
// - HSVCount: Similar to RGBCount, but the color space is changed to HSV
|
||||
"method": "Ccoeff", // Optional, template matching algorithm, can be list
|
||||
// Default is Ccoeff when not specified
|
||||
// - Ccoeff: Color-insensitive template matching, corresponds to cv::TM_CCOEFF_NORMED
|
||||
// - RGBCount: Color-sensitive template matching,
|
||||
// Binary thresholds target area and template using colorScales,
|
||||
// Calculates similarity using F1-score in RGB color space,
|
||||
// Then dot products result with Ccoeff result
|
||||
// - HSVCount: Similar to RGBCount, but uses HSV color space
|
||||
|
||||
/* The following fields are only valid if the algorithm is OcrDetect */
|
||||
/* Fields below only valid when algorithm is OcrDetect */
|
||||
|
||||
"text": [ "接管作战", "代理指挥" ], // Required, the text content to be recognized, as long as any match is considered to be recognized
|
||||
"text": [ "接管作战", "代理指挥" ], // Required, text to recognize, match is successful if any one matches ("接管作战" = "Take over operation", "代理指挥" = "Proxy command")
|
||||
|
||||
"ocrReplace": [ // Optional, a replacement for commonly misidentified text (regular support)
|
||||
[ "千员", "干员" ],
|
||||
[ ".+击干员", "狙击干员" ]
|
||||
"ocrReplace": [ // Optional, replacements for commonly misrecognized text (supports regex)
|
||||
[ "千员", "干员" ], // ("千员" = "thousand staff", "干员" = "operator")
|
||||
[ ".+击干员", "狙击干员" ] // (".+击干员" = "any-hit operator", "狙击干员" = "sniper operator")
|
||||
],
|
||||
|
||||
"fullMatch": false, // optional, whether the text recognition needs to match all words (not multiple words), default is false
|
||||
// false, as long as it is a substring: for example, text: [ "start" ], the actual recognition to "start action", is also considered successful.
|
||||
//If true, "start" must be recognized, not one more word
|
||||
"fullMatch": false, // Optional, whether text recognition requires exact match (no extra characters), default false
|
||||
// When false, substring is sufficient: e.g., text: [ "开始" ], recognized "开始行动" is success
|
||||
// When true, must recognize exactly "开始", not one character more
|
||||
|
||||
"isAscii": false, // optional, whether the text content to be recognized is ASCII characters
|
||||
// default false if not filled
|
||||
"isAscii": false, // Optional, whether text content is ASCII characters
|
||||
// Default false
|
||||
|
||||
"withoutDet": false // Optional, whether to not use the detection model
|
||||
// default false if not filled
|
||||
"withoutDet": false, // Optional, whether to skip detection model
|
||||
// Default false
|
||||
|
||||
/* The following fields are only valid when the algorithm is Hash */
|
||||
// The algorithm is not mature, and is only used in some special cases, so it is not recommended for now
|
||||
// Todo
|
||||
/* Fields below only valid when algorithm is OcrDetect and withoutDet is true */
|
||||
|
||||
"useRaw": true, // Optional, whether to use original image for matching
|
||||
// Default true, false for grayscale matching
|
||||
|
||||
"binThreshold": [140, 255], // Optional, threshold for grayscale binarization (default [140, 255])
|
||||
// Pixels with grayscale out of range are considered background, excluded from text area
|
||||
// Final text foreground includes pixels in [lower, upper] range
|
||||
|
||||
/* Fields below only valid when algorithm is JustReturn and action is Input */
|
||||
|
||||
"inputText": "A string text.", // Required, text to input as string
|
||||
|
||||
/* Fields below only valid when algorithm is FeatureMatch */
|
||||
|
||||
"template": "xxx.png", // Optional, image file to match, can be string or string list
|
||||
// Default "TaskName.png"
|
||||
|
||||
"count": 4, // Required feature point count (threshold), default = 4
|
||||
|
||||
"ratio": 0.6, // KNN matching algorithm distance ratio, [0 - 1.0], higher means looser matching, easier line connection. Default 0.6
|
||||
|
||||
"detector": "SIFT", // Feature point detector type, options: SIFT, ORB, BRISK, KAZE, AKAZE, SURF; default = SIFT
|
||||
// SIFT: High computational complexity, has scale and rotation invariance. Best effect.
|
||||
// ORB: Very fast computation, has rotation invariance but no scale invariance.
|
||||
// BRISK: Very fast computation, has scale and rotation invariance.
|
||||
// KAZE: Suitable for 2D and 3D images, has scale and rotation invariance.
|
||||
// AKAZE: Fast computation, has scale and rotation invariance.
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Special Task Type
|
||||
## Special Task Types
|
||||
|
||||
### Template Task(`@` Type Task)
|
||||
### Template Task (`@` Type Task)
|
||||
|
||||
Template task and base task are collectively called **Template task**.
|
||||
Template task and base task are collectively called **template tasks**.
|
||||
|
||||
Allows a task "A" to be used as a template, and then "B@A" to represent the task generated by "A".
|
||||
Allows using task "A" as template, with "B@A" representing a task generated from "A".
|
||||
|
||||
- If task "B@A" is not explicitly defined in `tasks.json`, then add `B@` prefix to the `sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes` fields (or `B` if the task name starts with `#`) and the rest of the parameters are the same as for task "A". That is, if task "A" has the following parameters.
|
||||
- If task "B@A" is not explicitly defined in `tasks.json`, then add `B@` prefix to `sub`, `next`, `onErrorNext`, `exceededNext`, `reduceOtherTimes` fields (or `B` if task name begins with `#`), all other parameters match task "A". For example, if task "A" has:
|
||||
|
||||
```json
|
||||
"A": {
|
||||
@@ -164,7 +199,7 @@ Allows a task "A" to be used as a template, and then "B@A" to represent the task
|
||||
}
|
||||
```
|
||||
|
||||
is equivalent to defining both
|
||||
This would be equivalent to defining:
|
||||
|
||||
```json
|
||||
"B@A": {
|
||||
@@ -174,59 +209,59 @@ Allows a task "A" to be used as a template, and then "B@A" to represent the task
|
||||
}
|
||||
```
|
||||
|
||||
- If task "B@A" is defined in `tasks.json`, then
|
||||
1. if the `algorithm` field of `B@A` is different from that of `A`, the derived class parameters are not inherited (only the parameters defined by `TaskInfo` are inherited)
|
||||
2. for image matching task, `template` is `B@A.png` if not explicitly defined (instead of inheriting the `template` name of "A"), otherwise any derived class parameters are inherited directly from "A" task if not explicitly defined
|
||||
3. for the parameters defined in the `TaskInfo` base class (any type of task parameters, such as `algorithm`, `roi`, `next`, etc.), if not explicitly defined in "B@A", all parameters are inherited directly from the "A" task parameters, except for the five fields mentioned above, such as `sub`, which will be prefixed with "B@" when inherited
|
||||
- If task "B@A" is defined in `tasks.json`, then:
|
||||
1. If "B@A" has different `algorithm` from "A", derived class parameters are not inherited (only `TaskInfo` parameters inherited)
|
||||
2. For image matching tasks, if `template` not explicitly defined, uses `B@A.png` (not inheriting "A" template name); otherwise any derived parameters not explicitly defined inherit directly from "A"
|
||||
3. For `TaskInfo` base class parameters (common to all task types like `algorithm`, `roi`, `next`, etc.), if not explicitly defined in "B@A", inherit directly from "A" except for the five fields mentioned above which get "B@" prefixed when inherited
|
||||
|
||||
### Base Task
|
||||
|
||||
Base task and template task are collectively called **template task**.
|
||||
Base task and template task are collectively called **template tasks**.
|
||||
|
||||
A task with the field `baseTask` is a base task.
|
||||
Tasks with `baseTask` field are base tasks.
|
||||
|
||||
Base task takes precedence over template task. This means that `"B@A": { "baseTask": "C", ... }` has no relevance to task A.
|
||||
Base task logic takes precedence over template task. This means `"B@A": { "baseTask": "C", ... }` has no relation to task A.
|
||||
|
||||
Any parameter that is not explicitly defined uses the value of the `baseTask` parameter for the corresponding task without a prefix, except for `template` which remains `"taskName.png"` if it is not explicitly defined.
|
||||
Any parameter not explicitly defined uses the corresponding parameter from `baseTask` without prefix, except `template` which remains `"TaskName.png"` when not explicitly defined.
|
||||
|
||||
#### Multi-File Task
|
||||
#### Multi-File Tasks
|
||||
|
||||
If a task defined in a later loaded task file (e.g. `tasks.json` for foreign services; hereinafter called File 2) also has a task of the same name defined in a earlier loaded task file (e.g. `tasks.json` for official services; hereinafter called File 1), then.
|
||||
If a task defined in a later-loaded file (e.g., foreign server `tasks.json`, called File 2) is also defined in an earlier-loaded file (e.g., CN server `tasks.json`, called File 1), then:
|
||||
|
||||
- if the task in File 2 does not have a `baseTask` field, then it inherits the fields of the task with the same name in File 1 directly.
|
||||
- If the task in File 2 has a `baseTask` field, then it does not inherit the fields of the task with the same name in File 1, but overwrites them.
|
||||
- If File 2's task has no `baseTask` field, it directly inherits fields from File 1's same-name task.
|
||||
- If File 2's task has a `baseTask` field, it doesn't inherit fields from File 1's same-name task, but overwrites them instead.
|
||||
|
||||
### Virtual Task
|
||||
### Virtual Task (`#` Task)
|
||||
|
||||
Virtual task is also called sharp task (`#` type task).
|
||||
Virtual tasks are also called sharp tasks (`#` type tasks).
|
||||
|
||||
A task with `#` in its name is a virtual task. `#` can be followed by `next`, `back`, `self`, `sub`, `on_error_next`, `exceeded_next`, `reduce_other_times`。
|
||||
Tasks with `#` in name are virtual tasks. `#` can be followed by `next`, `back`, `self`, `sub`, `on_error_next`, `exceeded_next`, `reduce_other_times`.
|
||||
|
||||
| Virtual Task Type | Meaning | Simple example |
|
||||
|:---------:|:---:|:--------:|
|
||||
| self | Parent Task Name | `"A": {"next": "#self"}` in `"#self"` is interpreted as `"A"`<br>`"B": {"next": "A@B@C#self"}` in `"A@B@C#self"` is interpreted as `"B"`.<sup>1</sup> |
|
||||
| back | # Preceding task name | `"A@B#back"` is interpreted as `"A@B"`<br>`"#back"` will be skipped if it appears directly |
|
||||
| next, sub, etc. | # The field corresponding to the previous task name | Take `next` for example:<br>`"A#next"` is interpreted as `Task.get("A")->next`<br>`"#next"` will be skipped if it appears directly |
|
||||
| Virtual Task Type | Meaning | Simple Example |
|
||||
| :----------: | :----------------: | :--------------------------------------------------------------------------------------------------------------------------------------: |
|
||||
| self | Parent task name | `"A": {"next": "#self"}` where `"#self"` interpreted as `"A"`<br>`"B": {"next": "A@B@C#self"}` where `"A@B@C#self"` interpreted as `"B"`<sup>1</sup> |
|
||||
| back | Task name before # | `"A@B#back"` interpreted as `"A@B"`<br>`"#back"` directly appears will be skipped |
|
||||
| next, sub, etc. | Field of task name before # | For example with `next`:<br>`"A#next"` interpreted as `Task.get("A")->next`<br>`"#next"` directly appears will be skipped |
|
||||
|
||||
_Note<sup>1</sup>: `"XXX#self"` has the same meaning as `"#self"`._
|
||||
_Note<sup>1</sup>: `"XXX#self"` has same meaning as `"#self"`._
|
||||
|
||||
#### Simple example
|
||||
#### Simple Example
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": [ "N1", "N2" ] },
|
||||
"C": { "next": [ "B@A#next" ] },
|
||||
"A": { "next": ["N1", "N2"] },
|
||||
"C": { "next": ["B@A#next"] },
|
||||
|
||||
"Loading": {
|
||||
"next": [ "#self", "#next", "#back" ]
|
||||
"next": ["#self", "#next", "#back"]
|
||||
},
|
||||
"B": {
|
||||
"next": [ "Other", "B@Loading" ]
|
||||
"next": ["Other", "B@Loading"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Available.
|
||||
Results in:
|
||||
|
||||
```cpp
|
||||
Task.get("C")->next = { "B@N1", "B@N2" };
|
||||
@@ -236,30 +271,30 @@ Task.get("Loading")->next = { "Loading" };
|
||||
Task.get_raw("B@Loading")->next = { "B#self", "B#next", "B#back" };
|
||||
```
|
||||
|
||||
#### Some uses
|
||||
#### Some Use Cases
|
||||
|
||||
- When several tasks have `"next": [ "#back" ]`, `"Task1@Task2@Task3"` represents the sequential execution of `Task3`, `Task2`, `Task1`。
|
||||
- When several tasks have `"next": [ "#back" ]`, `"Task1@Task2@Task3"` means execute `Task3`, then `Task2`, then `Task1` in sequence.
|
||||
|
||||
#### Other related
|
||||
#### Other Related Cases
|
||||
|
||||
```json
|
||||
{
|
||||
"A": { "next": [ "N0" ] },
|
||||
"B": { "next": [ "A#next" ] },
|
||||
"C@A": { "next": [ "N1" ] }
|
||||
"A": { "next": ["N0"] },
|
||||
"B": { "next": ["A#next"] },
|
||||
"C@A": { "next": ["N1"] }
|
||||
}
|
||||
```
|
||||
|
||||
In this case above, `"C@B" -> next` (i.e. `C@A#next`) is `["N1"]` instead of `["C@N0"]`.
|
||||
In this case, `"C@B" -> next` (i.e., `C@A#next`) is `[ "N1" ]`, not `[ "C@N0" ]`.
|
||||
|
||||
## Runtime task modification
|
||||
## Runtime Task Modification
|
||||
|
||||
- `Task.lazy_parse()` loads the json task configuration file at runtime. The lazy_parse rules are the same as for [multi-file task](#multi-file task).
|
||||
- `Task.set_task_base()` modifies the `baseTask` field of a task.
|
||||
- `Task.lazy_parse()` loads JSON task configuration files at runtime. Lazy_parse rules match [Multi-File Tasks](#multi-file-tasks).
|
||||
- `Task.set_task_base()` modifies a task's `baseTask` field.
|
||||
|
||||
### Usage Example
|
||||
|
||||
Suppose you have the following task configuration file:
|
||||
Consider this task configuration:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -267,23 +302,23 @@ Suppose you have the following task configuration file:
|
||||
"baseTask": "A_default"
|
||||
},
|
||||
"A_default": {
|
||||
"next": [ "xxx" ]
|
||||
"next": ["xxx"]
|
||||
},
|
||||
"A_mode1": {
|
||||
"next": [ "yyy" ]
|
||||
"next": ["yyy"]
|
||||
},
|
||||
"A_mode2": {
|
||||
"next": [ "zzz" ]
|
||||
"next": ["zzz"]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The following code enables changing task "A" based on the value of `mode`, and will also change other tasks that depend on task "A", e.g. "B@A":
|
||||
The following code changes task "A" based on mode value, also affecting tasks that depend on "A", like "B@A":
|
||||
|
||||
```cpp
|
||||
switch (mode) {
|
||||
case 1:
|
||||
Task.set_task_base("A", "A_mode1"); // This is basically the same as replacing A with the contents of A_mode1, as follows
|
||||
Task.set_task_base("A", "A_mode1"); // Basically equivalent to directly replacing A with A_mode1 content
|
||||
break;
|
||||
case 2:
|
||||
Task.set_task_base("A", "A_mode2");
|
||||
@@ -296,25 +331,25 @@ default:
|
||||
|
||||
## Expression Calculation
|
||||
|
||||
| Symbol | Meaning | Example |
|
||||
|:---------:|:---:|:--------:|
|
||||
| `@` | Template task | `Fight@ReturnTo` |
|
||||
| `#` (unary) | Virtual task | `#self` |
|
||||
| `#` (binary) | Virtual task | `StartUpThemes#next` |
|
||||
| `*` | Repeat tasks | `(ClickCornerAfterPRTS+ClickCorner)*5` |
|
||||
| `+` | Task list merge | `A+B` |
|
||||
| `^` | Task list difference (in the former but not in the latter, the order remains the same) | `(A+A+B+C)^(A+B+D)` (= `C`) |
|
||||
| Symbol | Meaning | Example |
|
||||
| :---------: | :------------------------------------------------------: | :------------------------------------: |
|
||||
| `@` | Template task | `Fight@ReturnTo` |
|
||||
| `#` (unary) | Virtual task | `#self` |
|
||||
| `#` (binary) | Virtual task | `StartUpThemes#next` |
|
||||
| `*` | Repeat multiple tasks | `(ClickCornerAfterPRTS+ClickCorner)*5` |
|
||||
| `+` | Task list merge (in next-type attributes, only first occurrence of same-name tasks kept) | `A+B` |
|
||||
| `^` | Task list difference (in first but not second, order preserved) | `(A+A+B+C)^(A+B+D)` (result is `C`) |
|
||||
|
||||
The operators `@`, `#`, `*`, `+`, `^` have priority: `#` (unary) > `@` = `#` (binary) > `*` > `+` = `^`.
|
||||
Operators `@`, `#`, `*`, `+`, `^` have precedence: `#` (unary) > `@` = `#` (binary) > `*` > `+` = `^`.
|
||||
|
||||
## Schema Check
|
||||
## Schema Validation
|
||||
|
||||
This project configures a json schema check for `tasks.json`, the schema file is `docs/maa_tasks_schema.json`.
|
||||
This project configures JSON schema validation for `tasks.json`, schema file is `docs/maa_tasks_schema.json`.
|
||||
|
||||
### Visual Studio
|
||||
|
||||
It is configured in `MaaCore.vcxporj` and works right out of the box. The hint effect is more obscure and some information is missing.
|
||||
Configured in `MaaCore.vcxporj`, works out of the box. Prompts are somewhat cryptic with some missing information.
|
||||
|
||||
### Visual Studio Code
|
||||
|
||||
It is configured in `.vscode/settings.json`, open that **project folder** with vscode and you are ready to use it. The hint works better.
|
||||
Configured in `.vscode/settings.json`, use VSCode to open the **project folder** to use. Better prompt quality.
|
||||
|
||||
@@ -9,7 +9,7 @@ dir:
|
||||
|
||||
::: center
|
||||
|
||||

|
||||

|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
# MaaAssistantArknights
|
||||
@@ -19,34 +19,34 @@ dir:
|
||||
 
|
||||
 
|
||||
|
||||
MAA means MAA Assistant Arknights
|
||||
MAA stands for MAA Assistant Arknights
|
||||
|
||||
An Arknights assistant
|
||||
|
||||
Based on image recognition, helps you to complete daily quests efficiently!
|
||||
Based on image recognition technology, complete all daily tasks with one click!
|
||||
|
||||
Development in progress ✿✿ヽ(°▽°)ノ✿
|
||||
Development actively in progress ✿✿ヽ(°▽°)ノ✿
|
||||
|
||||
:::
|
||||
|
||||
## Download and Install
|
||||
## Download and Installation
|
||||
|
||||
Please read the [documentation](./manual/newbie.md) and then go to the [official website](https://maa.plus) or [Releases](https://github.com/MaaAssistantArknights/MaaAssistantArknights/releases) to download. Refer to [Getting Started](./manual/newbie.md) for installation instructions.
|
||||
Please read the [documentation](./manual/newbie.md) and then visit the [official website](https://maa.plus) or [Releases](https://github.com/MaaAssistantArknights/MaaAssistantArknights/releases) to download. Refer to [Getting Started](./manual/newbie.md) for installation instructions.
|
||||
|
||||
## Features
|
||||
## Key Features
|
||||
|
||||
- Auto-battle, drop items recognition, auto-uploading to [Penguin Stats](https://penguin-stats.io/), [Yituliu](https://ark.yituliu.cn/).
|
||||
- Auto-shifting in the Base, auto efficiency calculation of operators, optimal solution in a single room; also supports [customized schedule](./protocol/base-scheduling-schema.md).
|
||||
- Auto-recruitment, support for expedited plan. Auto-uploading recruitment data to [Penguin Stats](https://penguin-stats.io/result/stage/recruit/recruit), [Yituliu](https://ark.yituliu.cn/survey/maarecruitdata).
|
||||
- Supports manual identification of the public recruitment interface to facilitate selection of high-star public recruitment.
|
||||
- Supports identifying operator lists, counting existing and unavailable operators and their potential, and displaying them in the open recruitment identification interface.
|
||||
- Depot recognition and supports exporting to [Penguin Stats Planner](https://penguin-stats.cn/planner)、[Arknight Tools](https://arkntools.app/#/material)、[ARK-NIGHTS Operator Builds](https://ark-nights.com/settings).
|
||||
- Visiting friends, collecting credits and purchasing items, collecting daily rewards, and completing daily quests in one click!
|
||||
- Auto-battle for Integrated Strategy (I.S.) for collecting originium ingots and candles.
|
||||
- Importing JSON task file for auto-battle! [Video](https://www.bilibili.com/video/BV1H841177Fk/)
|
||||
- Support C, Python, Java, Rust, Golang, Java HTTP, Rust HTTP and other interfaces, easy to integrate and call, customize your MAA!
|
||||
- Auto-farming sanity, drop item recognition and auto-uploading to [Penguin Stats](https://penguin-stats.io/), [Yituliu](https://ark.yituliu.cn/).
|
||||
- Intelligent base shift management, auto-calculating operator efficiency for optimal solutions within facilities; also supports [customized scheduling](./protocol/base-scheduling-schema.md).
|
||||
- Auto-recruitment with option to use expedited plans, clearing all at once! Auto-uploading recruitment data to [Penguin Stats](https://penguin-stats.io/result/stage/recruit/recruit), [Yituliu](https://ark.yituliu.cn/survey/maarecruitdata).
|
||||
- Manual recruitment tag identification for better high-star recruitment decisions ~~(Will that Senior Operator tag give you SilverAsh or SilverAsh?)~~
|
||||
- Operator list recognition, counting owned and missing operators and their potentials, displayed during recruitment identification.
|
||||
- Material recognition and export to [Penguin Stats Planner](https://penguin-stats.io/planner), [Arknights Toolbox](https://arkntools.app/#/material), [ARK-NIGHTS Operator Builds](https://ark-nights.com/settings).
|
||||
- Visiting friends, collecting credits and shopping, collecting daily rewards, etc. - one-click daily automation.
|
||||
- Fully automatic Integrated Strategy (IS) for farming Originium Ingots and levels, auto-farming and direct upgrades, smart operator recognition.
|
||||
- Select JSON copilot files for automatic stage clearing, [Video demonstration](https://www.bilibili.com/video/BV1H841177Fk/).
|
||||
- Support for C, Python, Java, Rust, Golang, Java HTTP, Rust HTTP and other interfaces, easy integration and customization for your MAA!
|
||||
|
||||
Talk is cheap. Show me the pictures!
|
||||
See it in action!
|
||||
|
||||
```component Image4
|
||||
{
|
||||
@@ -71,59 +71,56 @@ Talk is cheap. Show me the pictures!
|
||||
}
|
||||
```
|
||||
|
||||
## How to Use
|
||||
## Usage Instructions
|
||||
|
||||
### Basic Settings
|
||||
|
||||
Check [Beginner's Guide](./manual/newbie.md) and [User Manual](./manual/introduction/).
|
||||
::: tip
|
||||
For YostarEN, due to interface layout issues, the only supported resolution is `1920x1080`
|
||||
:::
|
||||
|
||||
### Features
|
||||
### Feature Introduction
|
||||
|
||||
Please refer to the [User Manual](./manual/).
|
||||
|
||||
### Supports for overseas clients
|
||||
### Support for Overseas Clients
|
||||
|
||||
At present, most of the functions of the International client (US client), Japanese client, Korean client, and traditional Chinese client have been supported. However, due to the small number of overseas users and the shortage of project personnel, many functions have not been fully tested, so please experience it yourself.
|
||||
If you encounter a bug or have a strong demand for a certain function, welcome to [Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues) and [Discussions](https://github.com/MaaAssistantArknights/MaaAssistantArknights/discussions) to ask questions. And feel free to join us in building the MAA! Please refer to [Overseas Clients Adaptation](#overseas-clients-adaptation)
|
||||
Most features now support Global (EN), Japanese, Korean, and Traditional Chinese servers. However, due to the smaller number of overseas users and limited project personnel, many features haven't been thoroughly tested, so please try them yourself.
|
||||
If you encounter bugs or have specific feature requests, please let us know in [Issues](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues) and [Discussions](https://github.com/MaaAssistantArknights/MaaAssistantArknights/discussions), or join us to help improve MAA! Please refer to the [Overseas Clients Adaptation](#overseas-clients-adaptation) section.
|
||||
|
||||
::: tip
|
||||
For Global (EN) server, due to interface layout issues, the only supported resolution is `1920x1080`
|
||||
:::
|
||||
|
||||
### CLI Support
|
||||
|
||||
MAA supports command line interface (CLI) operation, supports Linux, macOS and Windows, and can be used for automated scripts or on servers without graphical interfaces. Check [CLI Guide](./manual/cli/)
|
||||
MAA supports command-line interface (CLI) operation on Linux, macOS, and Windows, useful for automation scripts or on servers without graphical interfaces. Please refer to the [CLI Usage Guide](./manual/cli/)
|
||||
|
||||
## Join us
|
||||
## Join Us
|
||||
|
||||
### Associated Projects
|
||||
### Main Related Projects
|
||||
|
||||
**Currently, the project team is very short of front-end experts. If you have relevant experience, you are welcome to join us!**
|
||||
**The project team is currently in great need of front-end developers. If you have relevant experience, we welcome you to join us!**
|
||||
|
||||
- New Framework: [MaaFramework](https://github.com/MaaXYZ/MaaFramework)
|
||||
- [Co-pilot (auto-battle) site](https://prts.plus) Frontend: [maa-copilot-frontend](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
|
||||
- [Co-pilot (auto-battle) site](https://prts.plus) Backend: [MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
|
||||
- [Website](https://maa.plus): [Frontend](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
|
||||
- [Copilot Site](https://prts.plus) Frontend: [maa-copilot-frontend](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
|
||||
- [Copilot Site](https://prts.plus) Backend: [MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
|
||||
- [Official Website](https://maa.plus): [Frontend](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
|
||||
- Deep Learning: [MaaAI](https://github.com/MaaAssistantArknights/MaaAI)
|
||||
|
||||
### i18n
|
||||
### Multilingual Support (i18n)
|
||||
|
||||
MAA supports multiple languages and uses Weblate for localization management. If you're multilingual, feel free to help us translate at [MAA Weblate](https://weblate.maa-org.net).
|
||||
MAA supports multiple languages and uses Weblate for localization management. If you're fluent in multiple languages, please visit [MAA Weblate](https://weblate.maa-org.net) to help with translations.
|
||||
|
||||
MAA uses Chinese (Simplified) as its first language, and all translation entries are in Chinese (Simplified).
|
||||
MAA uses Chinese (Simplified) as its primary language, and all translation entries are based on Chinese (Simplified).
|
||||
|
||||
[](https://weblate.maa-org.net/engage/maa/)
|
||||
|
||||
### Development Related Information
|
||||
### Development Participation
|
||||
|
||||
#### Windows
|
||||
|
||||
Check [Development Guide](./develop/development.md).
|
||||
Please refer to the [Development Prerequisites](./develop/development.md).
|
||||
|
||||
#### Linux | MacOS
|
||||
#### Linux | macOS
|
||||
|
||||
Check [Linux Compiling Tutorial](./develop/linux-tutorial.md)
|
||||
Please refer to the [Linux Build Tutorial](./develop/linux-tutorial.md).
|
||||
|
||||
#### API
|
||||
#### APIs
|
||||
|
||||
- [C interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/include/AsstCaller.h): [Integration Example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Cpp/main.cpp)
|
||||
- [Python interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Python/asst/asst.py): [Integration Example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Python/sample.py)
|
||||
@@ -133,79 +130,81 @@ Check [Linux Compiling Tutorial](./develop/linux-tutorial.md)
|
||||
- [Java HTTP interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Java/Readme.md)
|
||||
- [Rust interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/src/Rust/src/maa_sys): [HTTP interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/src/Rust)
|
||||
- [TypeScript interface](https://github.com/MaaAssistantArknights/MaaX/tree/main/packages/main/coreLoader)
|
||||
- [Woolang interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/maa.wo):[Integration Example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/demo.wo)
|
||||
- [Woolang interface](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/maa.wo): [Integration Example](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/src/Woolang/demo.wo)
|
||||
- [Integration Documentation](./protocol/integration.md)
|
||||
- [Callback Schema](./protocol/callback-schema.md)
|
||||
- [Task Schema](./protocol/task-schema.md)
|
||||
- [Copilot Schema](./protocol/copilot-schema.md)
|
||||
- [Callback Message Protocol](./protocol/callback-schema.md)
|
||||
- [Task Workflow Protocol](./protocol/task-schema.md)
|
||||
- [Auto-Copilot Protocol](./protocol/copilot-schema.md)
|
||||
|
||||
#### Overseas Clients Adaptation
|
||||
|
||||
Please refer to [Overseas clients Adaptation](./develop/overseas-client-adaptation.md). For the functions already supported by the CN client, most of the overseas client's adaptation tasks only need screenshots and simple JSON modification.
|
||||
Please refer to the [Overseas Clients Adaptation Guide](./develop/overseas-client-adaptation.md). For features already supported in the CN server, most adaptation work for overseas clients only requires screenshots + simple JSON modifications.
|
||||
|
||||
#### For Novice Users of GitHub
|
||||
#### Want to contribute but not familiar with GitHub?
|
||||
|
||||
Check [Introduction to Github Pull request Flow](./develop/development.md#introduction-to-github-pull-request-flow).
|
||||
[GitHub Pull Request Process Overview](./develop/development.md#introduction-to-github-pull-request-flow)
|
||||
|
||||
#### Issue Bot
|
||||
|
||||
Check [Issue Bot Usage](./develop/issue-bot-usage.md).
|
||||
Please refer to the [Issue Bot Usage Guide](./develop/issue-bot-usage.md)
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
### Open-source Libraries
|
||||
|
||||
- Image recognition: [opencv](https://github.com/opencv/opencv.git)
|
||||
- ~~OCR: [chineseocr_lite](https://github.com/DayBreak-u/chineseocr_lite.git)~~
|
||||
- OCR: [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)
|
||||
- ML Deployment: [FastDeploy](https://github.com/PaddlePaddle/FastDeploy)
|
||||
- ML accelerator: [onnxruntime](https://github.com/microsoft/onnxruntime)
|
||||
- ~~Item drop recognition: [Penguin Stats recognizer](https://github.com/penguin-statistics/recognizer)~~
|
||||
- Image recognition library: [opencv](https://github.com/opencv/opencv.git)
|
||||
- ~~Text recognition library: [chineseocr_lite](https://github.com/DayBreak-u/chineseocr_lite.git)~~
|
||||
- Text recognition library: [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)
|
||||
- Deep learning deployment library: [FastDeploy](https://github.com/PaddlePaddle/FastDeploy)
|
||||
- Machine learning accelerator: [onnxruntime](https://github.com/microsoft/onnxruntime)
|
||||
- ~~Stage drop recognition: [Penguin Stats Recognizer](https://github.com/penguin-statistics/recognizer)~~
|
||||
- Map tile recognition: [Arknights-Tile-Pos](https://github.com/yuanyan3060/Arknights-Tile-Pos)
|
||||
- C++ JSON library: [meojson](https://github.com/MistEO/meojson.git)
|
||||
- C++ operator parser: [calculator](https://github.com/kimwalisch/calculator)
|
||||
- ~~C++ Base64 encoding/decoding[cpp-base64](https://github.com/ReneNyffenegger/cpp-base64)~~
|
||||
- C++ ZIP library: [zlib](https://github.com/madler/zlib)
|
||||
- C++ Gzip library: [gzip-hpp](https://github.com/mapbox/gzip-hpp)
|
||||
- Touch event producer for Android: [Minitouch](https://github.com/DeviceFarmer/minitouch)
|
||||
- Touch event producer for Android: [MaaTouch](https://github.com/MaaAssistantArknights/MaaTouch)
|
||||
- ~~C++ base64 encoding/decoding: [cpp-base64](https://github.com/ReneNyffenegger/cpp-base64)~~
|
||||
- C++ compression library: [zlib](https://github.com/madler/zlib)
|
||||
- C++ Gzip wrapper: [gzip-hpp](https://github.com/mapbox/gzip-hpp)
|
||||
- Android touch event generator: [Minitouch](https://github.com/DeviceFarmer/minitouch)
|
||||
- Android touch event generator: [MaaTouch](https://github.com/MaaAssistantArknights/MaaTouch)
|
||||
- WPF MVVM framework: [Stylet](https://github.com/canton7/Stylet)
|
||||
- WPF control library: [HandyControl](https://github.com/HandyOrg/HandyControl) -> [HandyControls](https://github.com/ghost1372/HandyControls)
|
||||
- C# Log:[Serilog](https://github.com/serilog/serilog)
|
||||
- C# logging: [Serilog](https://github.com/serilog/serilog)
|
||||
- C# JSON library: [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) & [System.Text.Json](https://github.com/dotnet/runtime)
|
||||
- ~~Downloader: [aria2](https://github.com/aria2/aria2)~~
|
||||
|
||||
### Data Source
|
||||
### Data Sources
|
||||
|
||||
- ~~Recruitment data: [ArkTools](https://www.bigfun.cn/tools/aktools/hr)~~
|
||||
- ~~Operators and infrastructure data: [PRTS Arknights Wiki (Chinese)](http://prts.wiki/)~~
|
||||
- Stage data: [Penguin Stats](https://penguin-stats.io/)
|
||||
- Gamedata and resources: [Arknights Game Resource](https://github.com/yuanyan3060/ArknightsGameResource)
|
||||
- Gamedata: [Arknights Yostar Game Data](https://github.com/ArknightsAssets/ArknightsGamedata)
|
||||
- ~~Recruitment data: [Arknights Toolbox](https://www.bigfun.cn/tools/aktools/hr)~~
|
||||
- ~~Operator and base data: [PRTS Wiki](http://prts.wiki/)~~
|
||||
- Stage data: [Penguin Statistics](https://penguin-stats.io/)
|
||||
- Game data and resources: [Arknights Client Resources](https://github.com/yuanyan3060/ArknightsGameResource)
|
||||
- Game data: [Arknights Yostar Game Data](https://github.com/ArknightsAssets/ArknightsGamedata)
|
||||
|
||||
### Contributors
|
||||
|
||||
Thanks to all friends who contribute to development/testing for making MAA better! (\*´▽`)ノノ
|
||||
Thanks to all friends who have participated in development and testing - your help makes MAA better and better! (\*´▽`)ノノ
|
||||
|
||||
[](https://github.com/MaaAssistantArknights/MaaAssistantArknights/graphs/contributors)
|
||||
|
||||
## Disclaimer
|
||||
|
||||
- This software is open source under the [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html), and comes with an additional [user agreement](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/terms-of-service.md).
|
||||
- The logo of this software is NOT granted rights under AGPL 3.0 License. [耗毛](https://weibo.com/u/3251357314) and Vie, the two artists and all developers of the software reserves all rights. The logo of the software shall not be used without authorization even if the project has an AGPL 3.0 License. Nor shall the logo be used for commercial purposes without authorization.
|
||||
- The software is an open-source, free of charge software only for studying and communication purposes. There is no agreement or understanding between the developers of the software and the 3rd party person who uses this software as an assistant and charges you. In that case, the developers of the software are not responsible for the problems and consequences caused.
|
||||
- This software is open source under the [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html) license, with additional [Terms of Service](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/terms-of-service.md).
|
||||
- The software's logo is NOT licensed under AGPL 3.0. The artists [耗毛](https://weibo.com/u/3251357314), vie, and all the software developers reserve all rights. The logo must not be used without authorization, even with AGPL 3.0 license claims, and must not be used for any commercial purposes without authorization.
|
||||
- This software is open source and free, intended only for learning and communication purposes. If you encounter merchants using this software for paid services, they may be charging for equipment and time costs; any problems and consequences arising from this are not related to this software.
|
||||
|
||||
### DirectML Support Information
|
||||
|
||||
This software supports GPU acceleration, which relies on an independent component [DirectML](https://learn.microsoft.com/en-us/windows/ai/directml/) provided by Microsoft on Windows platforms. DirectML is not an open source part of this project and is not subject to AGPL 3.0. For the convenience of users, we have included an unmodified DirectML.dll file with the installation package. If you do not need GPU acceleration, you can safely delete the DLL file and the core functions of the software will still run normally.
|
||||
This software supports GPU acceleration, which relies on Microsoft's standalone component [DirectML](https://learn.microsoft.com/en-us/windows/ai/directml/) on Windows. DirectML is not part of this project's open-source components and is not subject to AGPL 3.0. For user convenience, we include an unmodified DirectML.dll file with the installation package. If you don't need GPU acceleration, you can safely delete this DLL file, and the core functionality will still work normally.
|
||||
|
||||
## Advertisement
|
||||
## Community
|
||||
|
||||
Discord Server: [Discord Invite](https://discord.gg/23DfZ9uA4V)
|
||||
User Group: [Telegram](https://t.me/+Mgc2Zngr-hs3ZjU1), [QQ Group](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
Copilot JSON Sharing: [prts.plus](https://prts.plus)
|
||||
Bilibili Livestreams: [MrEO Livestream](https://live.bilibili.com/2808861) Coding Sessions & [MAA-Official Livestream](https://live.bilibili.com/27548877) Gaming/Chats
|
||||
[Technical Discussion (QQ Group)](https://jq.qq.com/?_wv=1027&k=ypbzXcA2)
|
||||
[Dev Group(QQ Group)](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
|
||||
User Exchange QQ Groups: [MAA Usage & Arknights Exchange QQ Group](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
Discord Server: [Invite Link](https://discord.gg/23DfZ9uA4V)
|
||||
User Exchange Telegram Group: [Telegram Group](https://t.me/+Mgc2Zngr-hs3ZjU1)
|
||||
Auto-battle JSON strategy sharing: [prts.plus](https://prts.plus)
|
||||
Bilibili Live: [MrEO Live](https://live.bilibili.com/2808861) coding streams & [MAA-Official Live](https://live.bilibili.com/27548877) gaming/chat
|
||||
|
||||
Please click "Star" if you consider it helpful! Thank you for your support!
|
||||
Technical Group (non-Arknights, no casual chat): [Internal Competition Hell! (QQ Group)](https://jq.qq.com/?_wv=1027&k=ypbzXcA2)
|
||||
Developer Group: [QQ Group](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
|
||||
|
||||
If you find the software helpful, please give us a Star! ~ (the small star at the top right of the webpage), that's the biggest support
|
||||
|
||||
@@ -53,7 +53,7 @@ maa init
|
||||
- `maa fight [stage]`: 运行战斗任务,`[stage]` 是关卡名称,例如 `1-7`;留空选择上次或者当前关卡。
|
||||
- `maa copilot <maa_uri>...`: 自动抄作业,其中 `<maa_uri>` 是作业的 URI,多个 URI 会依次执行,`maa_uri` 可以是 `maa://1234` 或者 本地文件路径 `./1234.json`。
|
||||
- `maa sscopilot <maa_uri>`: 自动保全派驻,其中 `<maa_uri>` 是保全派驻作业的 URI。
|
||||
- `maa roguelike <theme>`: 自动集成战略,`<theme>` 是集成战略的主题,可选值为 `Phantom`,`Mizuki`,`Sami` 以及 `Sarkaz`。
|
||||
- `maa roguelike <theme>`: 自动集成战略,`<theme>` 是集成战略的主题,可选值为 `Phantom`,`Mizuki`,`Sami`, `Sarkaz` 以及 `JieGarden`。
|
||||
- `maa reclamation <theme>`: 自动生息演算,`<theme>` 是生息演算的主题,目前仅 `Tales` 主题可用。
|
||||
|
||||
上述任务接受一些参数,你可以通过 `maa <task> --help` 来查看具体的参数。
|
||||
|
||||
@@ -39,8 +39,8 @@ icon: mdi:plug
|
||||
#### エミュレータ関連ドキュメントおよび参考ポート
|
||||
|
||||
- [Bluestacks 5](https://support.bluestacks.com/hc/zh-tw/articles/360061342631-%E5%A6%82%E4%BD%95%E5%B0%87%E6%82%A8%E7%9A%84%E6%87%89%E7%94%A8%E5%BE%9EBlueStacks-4%E8%BD%89%E7%A7%BB%E5%88%B0BlueStacks-5#%E2%80%9C2%E2%80%9D) `5555`
|
||||
- [MuMu](https://mumu.163.com/help/20240807/40912_1073151.html?maa) `16384`
|
||||
- [MuMu Pro](https://mumu.163.com/mac/function/20240126/40028_1134600.html) `16384`
|
||||
- [MuMu 12](https://mumu.163.com/help/20230214/35047_1073151.html) `16384`
|
||||
- [逍遥](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `21503`
|
||||
- [夜神](https://support.yeshen.com/zh-CN/qt/ml) `62001`
|
||||
|
||||
@@ -48,7 +48,7 @@ icon: mdi:plug
|
||||
|
||||
#### 多重起動について
|
||||
|
||||
- MuMu 12 の多重起動マネージャーでは、実行中のポートを確認できます。
|
||||
- MuMu の多重起動マネージャーでは、実行中のポートを確認できます。
|
||||
- Bluestacks 5 の設定内で現在の多重ポートを確認できます。
|
||||
- _追加予定_
|
||||
|
||||
@@ -207,11 +207,11 @@ MAA は現在 `bluestacks.conf` の保存場所をレジストリから読み取
|
||||
|
||||
### MuMu スクリーンショット強化モード
|
||||
|
||||
公式版 MuMu 12 V4.0.0 またはそれ以降のバージョンを使用し。方舟国際版などはサポートされていません。<!-- V3.8.13 -->
|
||||
公式版 または Arknights Edition MuMu V4.1.26 以降のバージョンに対応しています。<!-- V3.8.13 -->
|
||||
|
||||
1. `設定` - `接続設定` で `MuMu のスクリーンショット拡張モードを有効にする` をチェックします。MAAは、スイッチをチェックすると、レジストリを通じてインストールパスを自動的に入力しようとします。
|
||||
|
||||
2. `MuMu12 エミュレーターパス` には `MuMuPlayer-12.0` フォルダのパスを入力してください。例: `C:\Program Files\Netease\MuMuPlayer-12.0`。
|
||||
2. `MuMu12 エミュレーターパス` には `MuMu Player` または `MuMuPlayerGlobal-12.0` または `YXArkNights-12.0` フォルダのパスを入力してください。例: `C:\Program Files\Netease\MuMuPlayerGlobal-12.0`。
|
||||
|
||||
3. MuMu ネットワークブリッジを使用している場合は、`MuMu ネットワークブリッジモード` を選択し、MuMu マルチインスタンスマネージャ内の対応するエミュレータのシリアル番号を手動で入力する必要があります。例えば、メインインスタンスは `0` です。
|
||||
|
||||
|
||||
@@ -26,9 +26,9 @@ const fullySupport = shuffleArray([
|
||||
note: 'サポートされています。エミュレーターの `設定` - `上位設定` で `Android Debug Bridge`をONにする必要があります。\n\n- ネットワーク環境が悪い場合は [オフラインパッケージ](https://support.bluestacks.com/hc/zh-tw/articles/4402611273485-BlueStacks-5-%E9%9B%A2%E7%B7%9A%E5%AE%89%E8%A3%9D%E7%A8%8B%E5%BC%8F)をダウンロードしてください。\n- adbポート番号が不規則に変化し続け、起動するたびに同じでない場合は、お使いのコンピュータが [Hyper-V](https://support.bluestacks.com/hc/ja/articles/4415238471053-BlueStacks-5-Hyper-V%E3%81%8C%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8BWindows-10%E3%81%A8Windows-11%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A6%81%E4%BB%B6)を有効にしている可能性があります,\nこのような状況に対して、MAAはポート番号を自動的に取得する小さなバックドアを提供しています。この機能がは動作しません/複数のエミュレータが必要/複数のエミュレータコアがインストールされているの場合は [よくある質問](../よくある質問.html#blue-stackエミュレータが起動するたびにポート番号が異なるhyper-v) を参照して変更してください。Hyper-V は管理者として実行されるため、エミュレーターの自動シャットダウンや接続の自動検出など、adb を伴わない操作でも MAA を管理者として実行する必要があります。',
|
||||
},
|
||||
{
|
||||
name: 'MuMu Player 12',
|
||||
name: 'MuMu Player',
|
||||
link: 'https://www.mumuplayer.com/',
|
||||
note: 'サポートされています、[スクリーンショット強化モード](../connection.html#MuMu スクリーンショット強化モード)の追加サポートもある。 Hyper-Vとの互換性が確認されています。\n\n- “完了後にエミュレータを終了する”機能に異常が発生する場合がありますので、その場合はMuMu公式までご連絡ください。\n- 複数のインスタンスを開くには、MuMu 12 Multiple OpenerのADBボタンから対応するインスタンスのポート情報を確認し、MAA設定-接続設定の接続アドレスのポート番号を対応するポートに変更する必要があります。',
|
||||
note: 'サポートされています、[スクリーンショット強化モード](../connection.html#MuMu スクリーンショット強化モード)の追加サポートもある。 Hyper-Vとの互換性が確認されています。\n\n- “完了後にエミュレータを終了する”機能に異常が発生する場合がありますので、その場合はMuMu公式までご連絡ください。\n- 複数のインスタンスを開くには、MuMu Multiple OpenerのADBボタンから対応するインスタンスのポート情報を確認し、MAA設定-接続設定の接続アドレスのポート番号を対応するポートに変更する必要があります。',
|
||||
},
|
||||
{
|
||||
name: 'LDPlayer',
|
||||
|
||||
@@ -107,7 +107,7 @@ Windows 7 で .NET 8 アプリケーションを実行すると、メモリ使
|
||||
|
||||
- [Bluestacks 5](https://support.bluestacks.com/hc/zh-tw/articles/360061342631-%E5%A6%82%E4%BD%95%E5%B0%87%E6%82%A8%E7%9A%84%E6%87%89%E7%94%A8%E5%BE%9EBlueStacks-4%E8%BD%89%E7%A7%BB%E5%88%B0BlueStacks-5#%E2%80%9C2%E2%80%9D) `5555`
|
||||
- [MuMu Pro](https://mumu.163.com/mac/function/20240126/40028_1134600.html) `16384`
|
||||
- [MuMu 12](https://mumu.163.com/help/20230214/35047_1073151.html) `16384`
|
||||
- [MuMu](https://mumu.163.com/help/20240807/40912_1073151.html?maa) `16384`
|
||||
- [Nemu](https://bbs.xyaz.cn/forum.php?mod=viewthread&tid=365537) `21503`
|
||||
- [NOX](https://support.yeshen.com/zh-CN/qt/ml) `62001`
|
||||
|
||||
|
||||
@@ -3,112 +3,125 @@ order: 3
|
||||
icon: hugeicons:brain-02
|
||||
---
|
||||
|
||||
# 刷理智
|
||||
# 作戦
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
## 一般設定
|
||||
|
||||
## 常规设置
|
||||
- `理性剤使用数` と `割る源石の数`、および `周回数指定`・`素材の指定` はいずれもショートサーキット的なスイッチ(OR条件)です。これら3つの条件のうちいずれかを満たした時点でタスク達成とみなし、作戦を停止します。
|
||||
|
||||
- `吃理智药` + `吃源石` 和 `指定次数`、`指定材料` 三个选项为短路开关(或门),即达成三个选项中的任一条件,均会视为任务完成,停止刷理智。
|
||||
- `理性剤使用数` は理性を何回分補充するかを指定します(1回で複数本使う場合あり)。
|
||||
- `割る源石の数` は源石を何個割るかを指定します(1回につき1個)。倉庫に理性剤がある場合は源石を割りません。
|
||||
- `周回数指定` は選択したステージを何回周回するかを指定します(例:「15回周回後に停止」)。
|
||||
- `素材の指定`→`ドロップ数` は特定素材を何個入手したら停止するかを指定します(例:「中級源岩を5個入手したら停止」)。
|
||||
|
||||
- `吃理智药` 指定补充几次理智(可能一次吃多瓶药)。
|
||||
- `吃源石` 指定碎几颗石头(一次一颗),当仓库中有理智药时不会碎石。
|
||||
- `指定次数` 指定刷多少次指定关卡(例如“刷 15 次后停止”)。
|
||||
- `指定材料` 指定刷多少个指定材料(例如“获取 5 个固源岩后停止”)。
|
||||
- `素材の指定` と `ステージ` は互いに独立したロジックです。`素材の指定` は素材個数を達成条件に用いるだけで、該当ステージへ自動遷移はしません。
|
||||
- `割る源石の数` は `理性剤使用数` の後にのみ判定されます。MAA は理性剤がない場合にのみ源石で理性を補充するため、`割る源石の数` にチェックを入れると `理性剤使用数` は 999 に固定され、理性剤を使い切ってからでないと源石を割らないようにします。
|
||||
|
||||
- `指定材料` 与 `关卡选择` 是两个互相独立的逻辑。`指定材料` 只是以材料个数作为任务完成依据,并不会自动导航到相应关卡。
|
||||
- `吃源石` 只会在 `吃理智药` 之后判断,因为 MAA 只有在没有理智药时才会使用源石补充理智。所以在勾选 `吃源石` 之后,MAA 会将 `吃理智药` 的次数锁定为 999,确保将理智药吃光,以避免跳过 `吃源石` 判断。
|
||||
::: details 例
|
||||
|
||||
::: details 例子
|
||||
|
||||
| 吃理智药 | 吃源石 | 指定次数 | 指定材料 | 结果 |
|
||||
| 理性剤使用数 | 割る源石の数 | 周回数指定 | 素材の指定→ドロップ数 | 結果 |
|
||||
| :------: | :----: | :------: | :------: | -------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| | | | | 刷完现有理智即结束。 |
|
||||
| 2 | | | | 先刷完现有理智,然后吃一次理智药,一共吃 `2` 次,刷完理智后结束。 |
|
||||
| _999_ | 2 | | | 先刷完现有理智,并吃光理智药后,再碎石,一共碎 `2` 次,刷完理智后结束。 |
|
||||
| | | 2 | | 刷 `2` 次选择的关卡即结束。 |
|
||||
| | | | 2 | 掉落统计刷到 `2` 个指定的材料即结束。 |
|
||||
| 2 | | 4 | | 在最多吃 `2` 次理智药的情况下,刷 `4` 次选择的关卡即结束。 |
|
||||
| 2 | | | 4 | 在最多吃 `2` 次理智药的情况下,掉落统计刷到 `4` 个指定的材料即结束。 |
|
||||
| 2 | | 4 | 8 | 在最多吃 `2` 次理智药的情况下,刷 `4` 次选择的关卡即结束。但如果在没刷完 `4` 次之前就获得了 `8` 个指定材料,则会提前结束。 |
|
||||
| _999_ | 4 | 8 | 16 | 在最多吃光理智药并碎 `4` 次石头的情况下,刷 `8` 次选择的关卡即结束。但如果在没刷完 `8` 次之前就获得了 `16` 个指定材料,则会提前结束。 |
|
||||
| | 2 | | | 先刷完现有理智,如果仓库中有理智药则结束,如果没有理智药则碎 `2` 次石,刷完理智后结束。_非 MAA GUI 行为_ |
|
||||
| 2 | 4 | | | 先刷完现有理智,如果吃完 `2` 次理智药后还有理智药,则结束;如果吃完 ≤`2` 次理智药后没有理智药了,则继续碎 `4` 次石头,刷完理智后结束。_非 MAA GUI 行为_ |
|
||||
| | | | | 所持理性を消費し切ったら終了。 |
|
||||
| 2 | | | | まず所持理性を使い切り、その後理性剤を1回使用。合計 `2` 回分の補充後、理性を使い切って終了。 |
|
||||
| _999_ | 2 | | | まず所持理性を使い切り、理性剤を使い切ってから源石を割る。源石は合計 `2` 回。理性を使い切って終了。 |
|
||||
| | | 2 | | 選択ステージを `2` 回周回して終了。 |
|
||||
| | | | 2 | ドロップ統計で指定素材を `2` 個入手した時点で終了。 |
|
||||
| 2 | | 4 | | 最大 `2` 回まで理性剤を使用する前提で、選択ステージを `4` 回周回して終了。 |
|
||||
| 2 | | | 4 | 最大 `2` 回まで理性剤を使用する前提で、ドロップ統計で指定素材を `4` 個入手したら終了。 |
|
||||
| 2 | | 4 | 8 | 最大 `2` 回まで理性剤を使用する前提で、`4` 回周回したら終了。ただし `4` 回に到達する前に指定素材を `8` 個入手した場合は前倒しで終了。 |
|
||||
| _999_ | 4 | 8 | 16 | 理性剤を使い切り、さらに源石を `4` 回割る前提で、`8` 回周回したら終了。ただし `8` 回に到達する前に指定素材を `16` 個入手した場合は前倒しで終了。 |
|
||||
| | 2 | | | まず所持理性を使い切る。倉庫に理性剤があればそこで終了。理性剤がなければ源石を `2` 回割り、理性を使い切って終了。_MAA GUIの動作ではありません_ |
|
||||
| 2 | 4 | | | まず所持理性を使い切る。`2` 回分の理性剤を使い終えても理性剤が残っていれば終了。`2` 回以内で理性剤が尽きた場合は源石を `4` 回割り、理性を使い切って終了。_MAA GUIの動作ではありません_ |
|
||||
|
||||
:::
|
||||
|
||||
### 关卡选择
|
||||
### ステージ
|
||||
|
||||
- 若关卡选择中没有你需要的关卡,请在 MAA 中选择 `当前/上次`,然后在游戏中手动定位关卡
|
||||
确保画面停留在 右上角有关卡名和剩余理智,右下角有代理指挥和开始行动 的关卡详情界面。
|
||||
- 若当前不处于此界面,则 `当前/上次` 会自动进入终端首页右下角“上次作战”的关卡。
|
||||
- 也可以在 `任务设置` - `刷理智` - `高级设置` 中启用 `手动输入关卡名` 手动输入关卡编号。目前支持导航的关卡有:
|
||||
- 全部主线关卡。可在关卡末尾添加 `-NORMAL` 或 `-HARD` 来切换标准或磨难关卡。
|
||||
- 龙门币、作战记录的 5 / 6 关,但必须输入 `CE-6` / `LS-6`。MAA 会在第六关无法代理的情况下自动切换至第五关。
|
||||
- 技能书、采购凭证、碳本第 5 关,必须输入 `CA-5` / `AP-5` / `SK-5`。
|
||||
- 所有芯片本。必须输入完整关卡编号,如 `PR-A-1`。
|
||||
- 剿灭作战。必须输入 `Annihilation`。
|
||||
- 别传中的 `OF-1` / `OF-F3` / `GT-5`。
|
||||
- 当期 SS 活动 后三关。在自动访问 [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) 下载更新后会在界面下方显示。
|
||||
- 复刻的 SS 活动。输入 `SSReopen-<关卡前缀>` ,可一次性刷完 XX-1 ~ XX-9 关,如 `SSReopen-IC`。
|
||||
- ステージに目的の候補がない場合は、MAA で `現在/前回` を選び、ゲーム内で手動で目的ステージへ移動してください。
|
||||
画面は、右上にステージ名と残り理性、右下に自動指揮と作戦開始が表示されるステージ詳細に留めてください。
|
||||
- この画面にいない場合、`現在/前回` は端末ホーム右下の「前回作戦」のステージへ自動で入ります。
|
||||
- `作戦` → `高度な設定` で `ステージ名を入力する` を有効にし、手動でステージ番号を入力することもできます。現在ナビ可能なステージは以下の通りです:
|
||||
- すべてのメインステージ。末尾に `-NORMAL` または `-HARD` を付けて標準/磨難を切り替え可能。
|
||||
- 龍門幣・作戦記録の 5 / 6 ステージ。ただし `CE-6` / `LS-6` を入力してください。6 が連戦不可の場合、自動で 5 に切り替えます。
|
||||
- アーツ学・購買資格証・炭素材の第 5 ステージ。`CA-5` / `AP-5` / `SK-5` を入力してください。
|
||||
- すべてのSoCステージ。`PR-A-1` のように完全な番号を入力してください。
|
||||
- 殲滅作戦は以下の入力値に対応し、対応する Value を使用してください:
|
||||
|
||||
::: details 画面例
|
||||

|
||||
- 当期殲滅作戦:Annihilation
|
||||
- チェルノボーグ:Chernobog@Annihilation
|
||||
- 龍門郊外:LungmenOutskirts@Annihilation
|
||||
- 龍門市街:LungmenDowntown@Annihilation
|
||||
|
||||
- サイドストーリー内の `OF-1` / `OF-F3` / `GT-5`。
|
||||
- 当期 SS イベントの後半 3 ステージ。自動で [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) から更新を取得後、画面下部に表示されます。
|
||||
- 復刻 SS イベント。`SSReopen-<ステージ接頭辞>` を入力すると、XX-1 ~ XX-9 を一括周回します(例:`SSReopen-IC`)。
|
||||
|
||||
::: details サンプル画面
|
||||

|
||||
:::
|
||||
|
||||
### 剿灭模式
|
||||
### 殲滅作戦
|
||||
|
||||
- MAA 只会通过终端首页右上角的剿灭按钮进行跳转,请确保当期剿灭已解锁 `全权委托` 并持有足够数量的 “PRTS 剿灭代理卡”。
|
||||
- 在当期剿灭刷新或重新安装明日方舟后,从剿灭 `开始战斗` 页面返回会自动展开 `情报汇总`,请提前关闭此页面以防止任务卡住。
|
||||
- 仅建议当期剿灭已“400 杀”的玩家使用 MAA 自动剿灭。
|
||||
- MAA は端末ホーム右上の殲滅ボタンからのみ遷移します。選択した殲滅ステージが `完全委任` を解放済みで、`PRTS 殲滅代理カード` を十分に所持していることを確認してください。
|
||||
- 「400体撃破」を達成済みのステージのみ自動殲滅の使用を推奨します。
|
||||
|
||||
## 高级设置
|
||||
## 高度な設定
|
||||
|
||||
### 备选关卡
|
||||
### 代替ステージ
|
||||
|
||||
备选关卡根据当天关卡开放情况决定战斗关卡,即选择第一个开放关卡进行战斗。
|
||||
代替ステージは当日の開放状況に応じて戦闘ステージを決定し、最初に開放されているステージを選びます。
|
||||
これはスケジュールに近い機能であり、「ステージ選択に失敗したときの予備候補」にはなりません。
|
||||
|
||||
1. 例子:关卡选择 `龙门币-6/5`,备选选择 `1-7` 和 `经验-6/5`:
|
||||
- 如果当天开放 `龙门币-6/5`,就会前往 `龙门币-6/5`,不会前往 `1-7` 和 `经验-6/5`。如果玩家此时未解锁 `龙门币-6/5` 代理,则刷理智任务出错。
|
||||
- 如果当天未开放 `龙门币-6/5`,则会前往 `1-7`,不会前往 `龙门币-6/5`。如果玩家此时未解锁 1-7 代理,则刷理智任务出错。
|
||||
- 由于 `经验-6/5` 前存在常驻关卡 `1-7`,在这种情况下,MAA 永远也不会前往 `经验-6/5` 战斗。
|
||||
2. 如关卡选择为 `剿灭模式`,则不会因为剿灭的结果影响其余备选关卡的选择逻辑。即使剿灭出错,刷理智任务也不会出错。
|
||||
1. 例:ステージ選択が `龍門幣-6(CE-6)`、代替が `1-7` と `作戦記録-6(LS-6)` の場合:
|
||||
- 当日に `龍門幣-6(CE-6)` が開放されていれば `龍門幣-6(CE-6)` に向かい、`1-7` と `作戦記録-6(LS-6)` には向かいません。この時点で `龍門幣-6(CE-6)` の自動指揮を解放していなければ、作戦タスクはエラーになります。
|
||||
- 当日に `龍門幣-6(CE-6)` が開放されていなければ `1-7` に向かい、`龍門幣-6(CE-6)` には向かいません。この時点で `1-7` の自動指揮を解放していなければ、作戦タスクはエラーになります。
|
||||
- `作戦記録-6(LS-6)` より前に常設の `1-7` が存在するため、この構成では MAA は `作戦記録-6(LS-6)` には決して向かいません。
|
||||
2. ステージ選択が `殲滅作戦` の場合:
|
||||
- 殲滅の結果にかかわらず、他の代替ステージの選択ロジックには影響しません。殲滅がエラーでも作戦タスクはエラーになりません。
|
||||
- 残りの代替ステージは `理性剤使用数` と `連戦回数` の設定のみを継承し、`割る源石の数`・`周回数指定`・`素材の指定` の制御は受けません。
|
||||
|
||||
### 剩余理智
|
||||
### 余剰理性の消費
|
||||
|
||||
在 `刷理智` 任务结束后启动,不受吃理智药、吃源石、指定次数、指定材料、连战次数等的控制,刷完理智即结束。
|
||||
`作戦` タスク終了後に起動します。`理性剤使用数`・`割る源石の数`・`周回数指定`・`素材の指定`・`連戦回数` の制御は受けず、現在残っている理性を使い切った時点で終了します。
|
||||
|
||||
- 适用于在 `关卡选择` 关卡理智不足后,继续前往 `剩余理智` 关卡清理剩余的“边角”理智(如前往 1-7)。
|
||||
- 亦适用于在连战次数设置过高而理智不足时自动以单次连战刷光理智收尾(设置 1-7 连战 6 次,但只有 30 理智,于是自动转为刷 5 次不连战的 1-7)。
|
||||
- 若剩余理智仍然不足则会结束任务(如少于 6 理智)。
|
||||
- 如果剩余理智选择关卡为未开放关卡,则刷理智任务出错。
|
||||
- `ステージ` の理性不足後に、`余剰理性の消費` 用ステージで残りの“端数”理性を処理する用途に適します(例:1-7 へ行く)。
|
||||
- 連戦回数の設定が高すぎて理性が不足した場合に、自動で単発周回に切り替えて理性を使い切って締める用途にも適します(例:1-7 を連戦 6 回に設定したが理性が 30 のため、自動的に連戦なしの 1-7 を 5 回に切り替え)。
|
||||
- 残り理性がなお不足している場合(例:理性は 6 未満)にはタスクを終了します。
|
||||
- `余剰理性の消費` で選んだステージが未開放の場合、作戦タスクはエラーになります。
|
||||
|
||||
### 連戦回数
|
||||
|
||||
MAAは、ユーザーが設定した連続戦闘回数に応じて戦闘を行います。
|
||||
MAA はユーザーが設定した連戦回数に基づいて戦闘を行います:
|
||||
|
||||
- **自動モード** (0):
|
||||
- レベル内の最大連続戦闘回数を自動で判別し、最大連続戦闘回数を維持し、正気度オーバーフローが発生しないようにします。
|
||||
- 完了後、「正気度残量確認」プロセスに入ります(設定されている場合)。
|
||||
- **AUTOモード**(0):
|
||||
- ステージの最大連戦回数を自動認識し、理性が溢れない範囲で最大を維持
|
||||
- 完了後は(設定していれば)`余剰理性の消費` フローへ移行
|
||||
|
||||
- **数値モード** (1~6):
|
||||
- 設定された回数だけ連続戦闘を行います。
|
||||
- 現在の正気度が設定回数を完了するのに足りない場合(例えば、5回しか完了できないのに6回に設定している場合)、タスクを終了し、「正気度残量確認」プロセスに入ります(設定されている場合)。
|
||||
- **数値モード**(1~6):
|
||||
- 設定した回数で連戦を実行
|
||||
- 現在の理性で設定回数を満たせない場合(例:5 回分しかないのに 6 回を設定)には、その時点で終了し(設定していれば)`余剰理性の消費` フローへ移行
|
||||
|
||||
- **無効モード** (-1):
|
||||
- ゲーム内の連続戦闘回数を調整しません。
|
||||
- 現在の正気度が設定回数を完了するのに足りない場合、タスクを終了し、「正気度残量確認」プロセスに入ります(設定されている場合)。
|
||||
- **切り替えない**(-1):
|
||||
- ゲーム内の連戦回数設定を変更しません
|
||||
- 現在のゲーム内設定回数を満たす理性が不足している場合は、その時点で終了し(設定していれば)`余剰理性の消費` フローへ移行
|
||||
|
||||
### 掉落识别
|
||||
### 周回数指定
|
||||
|
||||
- 支持自动识别并统计材料掉落,同时上传 [企鹅物流数据统计](https://penguin-stats.cn/) 和 [一图流](https://ark.yituliu.cn/)。
|
||||
- 支持自定义企鹅物流用户 ID。
|
||||
MAA は最大で指定回数まで戦闘を実行します。
|
||||
|
||||
## 异常检测
|
||||
例:現在の理性が 100、ステージ消費が 6 の場合
|
||||
|
||||
- 支持自动勾选 `代理指挥`。
|
||||
- 支持掉线后或凌晨 4 点闪断后自动重连并继续任务。
|
||||
- 支持等级提升后继续任务。
|
||||
- 代理失败时会放弃本次行动并重新战斗。
|
||||
- 周回数指定を 10、連戦回数を 4 に設定:`2(作戦開始回数) × 4(連戦) = 8 回` の作戦を実行(`floor(10 / 4) × 4 連戦 = 8`)。消費理性は `8 × 6 = 48`。さらに 4 連戦を 1 回行うと合計 12 回となり上限 10 を超えるため実行せず、8 回で終了。
|
||||
- 周回数指定を 10、連戦回数を AUTO に設定:`6 連戦 × floor(10 / 6) + (10 % 6)` となり、`6 連戦 1 回 + 4 連戦 1 回 = 10 回` を実行。消費理性は `10 × 6 = 60`。
|
||||
|
||||
### スクショ認識
|
||||
|
||||
- 素材ドロップの自動認識と統計に対応。あわせて [ペンギン急便データ統計処理部門](https://penguin-stats.io/) と [ワンシート攻略](https://ark.yituliu.cn/) にアップロードします(**ご注意:「ワンシート攻略」は実質的に簡体字中国語のみのため、翻訳ツールと併用してください**)。
|
||||
- Penguin-Stats のレポート ID をカスタマイズ可能(`設定` → `実行設定`)。
|
||||
|
||||
## 異常検知
|
||||
|
||||
- `自動指揮` に自動でチェックを入れます。
|
||||
- 回線切断や午前4時の瞬断後に自動再接続し、タスクを継続します。
|
||||
- レベルアップ後もタスクを継続します。
|
||||
- 自動指揮が失敗した場合はその回の行動を放棄し、再戦します。
|
||||
|
||||
@@ -3,19 +3,15 @@ order: 5
|
||||
icon: solar:shop-2-bold
|
||||
---
|
||||
|
||||
# 获取信用及购物
|
||||
# FP獲得と交換
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
- 戦友を自動訪問して「信用ポイント/フレンドpt(FP)」を獲得し、FP交換所でアイテム交換を行います。
|
||||
- サポートユニットでFPを獲得:
|
||||
- MAA はサポートユニットを用いて「青く燃ゆる心」`OF-1` を1回クリアします。該当ステージが解放済みであることを確認してください。
|
||||
- ステージ選択が `現在/前回` の場合は、サポートユニットによる周回は実行しません。
|
||||
|
||||
- 会自动访问好友获取信用点,并前往信用交易所购物。
|
||||
- 借助战赚信用:
|
||||
- MAA 会使用助战干员通关一次火蓝之心 `OF-1` 关卡,请确认该关卡已解锁。
|
||||
- 关卡选择为 `当前/上次` 时不会执行借助战任务。
|
||||
## 高度な設定
|
||||
|
||||
## 高级设置
|
||||
|
||||
- 优先购买和黑名单都是关键字匹配,例如填 `碳` 会匹配 `碳` 和 `碳素`。
|
||||
- 分隔符的分号既可以使用英文半角 `;` 也可以使用中文全角 `;`。
|
||||
- `信用点低于300时停止购买商品` 即使在低于 300 时也会购买优先购买商品。
|
||||
- `優先購入`と`ブラックリスト`はいずれもキーワード一致です。例えば `炭` を入力すると「中級炭素材」と「初級炭素材」に一致します。
|
||||
- 区切り文字のセミコロンは、半角の `;` と全角の `;` のどちらでも使用できます。
|
||||
- `FPが300未満になった場合、アイテムの購入を停止します` を選択しても、300未満のときは`優先購入`に指定した商品を購入します。
|
||||
|
||||
@@ -3,32 +3,34 @@ order: 4
|
||||
icon: material-symbols:view-quilt-rounded
|
||||
---
|
||||
|
||||
# 基建换班
|
||||
# 基地仕事
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
## 通常モード
|
||||
|
||||
## 换班策略
|
||||
### 交代戦略
|
||||
|
||||
- 自动计算并选择**单设施内的最优解**,支持所有通用类技能和特殊技能组合。
|
||||
- 自动识别经验书、赤金、源石碎片、芯片,分别使用相应的干员组合。
|
||||
- 自动按照 `无人机用途` 选择的方式使用无人机。
|
||||
- 自动识别心情进度条,将剩余心情百分比小于 `基建工作心情阈值` 的干员进驻宿舍。
|
||||
- **単一施設内の最適解**を自動で計算し、選択します。汎用スキル/特殊スキルの組み合わせに対応
|
||||
- 作戦記録・純金・源石の欠片・SoCを自動判別し、対応するオペレーターを配置
|
||||
- `ドローン用途` の選択方式に基づいて、ドローンを自動使用
|
||||
- 体力状況を判別し、残り体力が `作業体力閾値` を下回ったオペレーターを寮へ移動
|
||||
|
||||
## 额外说明
|
||||
### 補足説明
|
||||
|
||||
- 基建换班目前均为单设施最优解,而非跨设施的全局最优解。
|
||||
- 可识别并使用的例子:`巫恋+龙舌兰`、`红云+稀音`。
|
||||
- 不可识别并使用的例子:`迷迭香体系`、`红松骑士团`。
|
||||
- 若 `无人机用途` 选择 `贸易站-龙门币` ,则会额外识别 `巫恋组` 并优先为其使用。
|
||||
- 会客室仅缺一个线索时,会选择对应线索倾向的干员,其余情况选择通用干员。
|
||||
- 会客室仅当自有线索满时才会送出线索,并且只送三个。如需自定义单次送线索个数可修改 MAA 文件夹下 `resource/tasks/tasks.json` 中的 `ClueSelected` - `maxTimes` 字段。
|
||||
- 开启 `不将已进驻的干员放入宿舍` 设置项可避免 `艾丽妮`、`逻各斯` 等干员在训练室未训练时被进驻到宿舍,但同时也不会将加工站中心情不满的干员进驻宿舍。
|
||||
- 控制中枢策略太过复杂,目前只考虑 `阿米娅`、`诗怀雅`、`凯尔希`、`彩虹小队` 及其他心情 +0.05 的干员,后续逐步优化。
|
||||
- 可自行选择需要 MAA 处理的设施类别,默认全选。
|
||||
- 施設の交代は施設横断の最適化ではなく、各施設内での最適解を選びます
|
||||
- 対応例:`シャマレ+テキーラ`、`ヴァーミル+シーン`
|
||||
- 非対応例:`ローズモンティス体系`、`レッドパイン騎士団`
|
||||
- `ドローン用途` で `貿易所-龍門幣` を選択している場合、`シャマレグループ` を優先して判別・使用します
|
||||
- 応接室で手がかりの不足が1種類のみの場合は、該当傾向のオペレーターを選択。それ以外は汎用オペレーターを選択します
|
||||
- 自施設の手がかりが満杯の時のみ手がかりを送付します(最大3個)。個数は MAA フォルダ内 `resource/tasks/tasks.json` の `ClueSelected` - `maxTimes` を編集してください
|
||||
- `配置済みオペレーターを寮に入れない` 設定により、`アイリーニ` や `ロゴス` などが訓練に未配置の際の寮入りを防止できます(ただし、加工施設でコンディション不足のオペレーターも移動しなくなります)
|
||||
- 中枢システムの戦略は複雑なため、現時点では `アーミヤ`、`スワイヤー`、`ケルシー`、`レインボー小隊` およびコンディション +0.05 のオペレーターのみを考慮しています。順次最適化予定です
|
||||
- MAA が処理する対象施設は選択可能です(デフォルトは全選択)
|
||||
|
||||
## 自定义基建换班 (Beta)
|
||||
## キューのローテーション
|
||||
|
||||
- 一图流的大佬们帮忙写了一个 [排班生成器](https://ark.yituliu.cn/tools/schedule),可参考 [基建协议文档](../../protocol/base-scheduling-schema.md) 使用。
|
||||
- MAA 文件夹下 `/resource/custom_infrast/` 中内置了几套理论极限效率的作业,可用作参考。由于其对干员及练度的需求极高,不推荐直接使用。
|
||||
- このモードは、まずゲーム内でプリセットキューを設定しておく必要があります。MAA が自動でローテーションを行います。
|
||||
|
||||
## 基地シフトのカスタマイズ
|
||||
|
||||
- ワンシート攻略の有志の方々が作成した [シフト生成ツール](https://ark.yituliu.cn/tools/schedule) があり、[基地スケジューリング仕様書](../../protocol/base-scheduling-schema.md) を参考に利用できます。
|
||||
- MAA フォルダー配下の `/resource/custom_infrast/` には、理論上の最大効率を目指したいくつかのシフトプランが同梱されています。参考用としてお使いください。オペレーターおよび育成度の要件が非常に高いため、直接の使用は推奨しません。
|
||||
|
||||
@@ -18,7 +18,7 @@ icon: ic:baseline-article
|
||||
- SoCの場合のみ、完全なステージ番号を入力する必要があります。例: `PR-A-1` 。
|
||||
- `Annihilation`(殲滅作戦)。
|
||||
- `OF-1` / `OF-F3` / `GT-5` のみサポートされます。
|
||||
- 現在のSSイベントの最後の3つのステージ。 [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) で更新が自動的にダウンロードされた後、メイン画面に対応するメッセージが表示されます。
|
||||
- 現在のSSイベントの最後の3つのステージ。 [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) で更新が自動的にダウンロードされた後、メイン画面に対応するメッセージが表示されます。
|
||||
- 再刻印SSアクティビティは `SSReopen-XX` と入力するとXX-1~XX-9ステージを一度にクリアできます。 `SSReopen-IC` など。
|
||||
|
||||
::: details 画面例
|
||||
|
||||
@@ -3,22 +3,18 @@ order: 2
|
||||
icon: fluent:people-24-filled
|
||||
---
|
||||
|
||||
# 公开招募
|
||||
# 公開求人
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
「自動公開求人」と [公開求人認識](./tools.md#公開求人認識) は別々の機能です!
|
||||
|
||||
自动公招 和 [公招识别](./tools.md#公招识别) 是两个不同的功能!
|
||||
## 自動公開求人
|
||||
|
||||
## 自动公招
|
||||
`緊急招集票` の自動使用に対応し、1回のタスクあたりの最大募集回数を設定できます。`緊急招集票を自動的に使用` と併用すれば、一度に募集券を使い切ることができます。
|
||||
|
||||
支持自动使用 `加急许可`,支持设置单次任务最大招募次数,可配合 `自动使用加急许可` 一次性刷光招募券。
|
||||
1・5・6★のタグを検出した場合は通知を表示します。
|
||||
|
||||
当识别到出现 1、5、6 星标签都会弹出通知提示。
|
||||
公開求人の更新時には、公開求人のタグデータを [ペンギン急便データ統計処理部門](https://penguin-stats.io/) と [ワンシート攻略](https://ark.yituliu.cn/) に自動アップロードします(**ご注意:「ワンシート攻略」は実質的に簡体字中国語のみのため、翻訳ツールと併用してください**)。
|
||||
|
||||
公招刷新时会自动将公招标签数据上传到 [企鹅物流数据统计](https://penguin-stats.cn/) 和 [一图流](https://ark.yituliu.cn/)。
|
||||
## 高度な設定
|
||||
|
||||
## 高级设置
|
||||
|
||||
`自动确认` 即 MAA 自动选择标签并进行招募,`手动确认` 即不进行自动选择与招募。
|
||||
`自動的に確認する` は MAA が自動でタグを選択して募集を実行することを意味し、`手動的に確認する` は自動選択および自動募集を行わないことを意味します。
|
||||
|
||||
@@ -3,26 +3,22 @@ order: 1
|
||||
icon: ic:round-rocket-launch
|
||||
---
|
||||
|
||||
# 开始唤醒
|
||||
# ウェイクアップ
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
エミュレータを自動起動し、クライアントを自動起動して、自動的にゲームへ入ります。
|
||||
|
||||
自动启动模拟器,自动启动客户端,自动进入游戏。
|
||||
エミュレータの自動起動には追加設定が必要です。詳しくは起動設定をご覧のうえ、接続設定内の `ADB接続が失敗した場合、エミュレータの起動を試みる` にチェックを入れてください。
|
||||
|
||||
自动启动模拟器需额外设置,详见启动设置,且需勾选连接设置内的 `ADB 连接失败时尝试启动模拟器`。
|
||||
## アカウント切替
|
||||
|
||||
## 账号切换
|
||||
この機能は `構成を切り替える` または `スケジュール実行設定` と併用してください。`ウェイクアップ` タスクを実行するたびに、1回アカウント切替を行います。
|
||||
|
||||
この機能は、設定の切り替えやスケジュール実行と一緒に使用する必要があります。`ウェイクアップ` タスクが実行されるたびに、アカウント切り替え操作が行われます。
|
||||
切り替えはログイン済みのアカウントにのみ対応します。検索にはログイン名を使用します。入力した内容が、ログイン済みのすべてのアカウントの中で一意になるようにしてください。
|
||||
|
||||
仅支持切换至已登录的账号,使用登录名进行查找,请保证输入内容在所有已登录账号唯一。
|
||||
- 例:
|
||||
- 公式サーバー:`123****8901` の場合、`123****8901`、`123`、`8901`、`3****8` のいずれでも可
|
||||
- Bilibiliサーバー:`张三` の場合、`张三`、`张`、`三` のいずれでも可
|
||||
|
||||
- 例子:
|
||||
- 官服:`123****8901`,可输入 `123****8901`、`123`、`8901`、`3****8`
|
||||
- B 服:`张三`,可输入 `张三`、`张`、`三`
|
||||
## 接続設定
|
||||
|
||||
## 连接设置
|
||||
|
||||
[点我](../connection.md)
|
||||
[こちら](../connection.md)
|
||||
|
||||
@@ -5,50 +5,46 @@ icon: octicon:tools-16
|
||||
|
||||
# ツールボックス
|
||||
|
||||
::: important Translation Required
|
||||
This page is outdated and maybe still in Simplified Chinese. Translation is needed.
|
||||
:::
|
||||
|
||||
## 公開求人認識
|
||||
|
||||
公招タブ画面を開き、「認識開始」をクリックすると、認識が開始されます。
|
||||
公開求人認識の画面を開き、「認識開始」をクリックすると起動します。
|
||||
|
||||
以前に干員認識を実行した場合、認識終了後の干員名には潜能データも表示されます。
|
||||
以前に「オペレーター」を実行していた場合、認識完了後のオペレーター名の後ろに潜在能力データも表示されます。
|
||||
|
||||
## オペレーター (Beta)
|
||||
## オペレーター
|
||||
|
||||
保有している干員と保有していない干員のリストを認識し、潜能データを認識して保存し、公招認識で表示できるようにします。
|
||||
所持/未所持のオペレーター一覧を認識し、潜在能力データを認識・保存して公開求人認識で表示に利用します。
|
||||
|
||||
## 倉庫アイテム認識 (Beta)
|
||||
## 倉庫アイテム認識
|
||||
|
||||
ホーム画面から自動的に倉庫に入ることができます。自動での遷移に失敗した場合は、手動で「養成材料」画面に切り替え、**最左端にスライド**してから機能を開始してください。
|
||||
ホーム画面から自動で倉庫へ移動できます。自動遷移に失敗した場合は、手動で倉庫の `素材` 画面へ切り替え、**いちばん左端までスワイプ** してから開始してください。
|
||||
|
||||
現在、[企鹅物流刷图规划器](https://penguin-stats.cn/planner)、[明日方舟ツールボックス](https://arkntools.app/#/material)、[明日方舟 - 干員育成表](https://ark-nights.com/settings)にエクスポートをサポートしています。
|
||||
現在、MAAから以下のサイトへエクスポートに対応しています:
|
||||
[ペンギン急便周回計画作成ツール](https://penguin-stats.io/planner)、[アークナイツツールボックス](https://arkntools.app/#/material)、[アークナイツ | 周回計画表](https://ark-nights.com/settings)。
|
||||
|
||||
もし、データサイトの管理者であれば、貴サイトの素材JSONプロトコルに対応するためにご連絡ください~
|
||||
データサイトを運営されている方は、貴サイトの素材JSON形式へのエクスポート対応についてもぜひご連絡ください。実装を検討いたします。
|
||||
|
||||
今後はもっと実用的な機能に使われるかもしれません。(夢物語
|
||||
|
||||
## 映像 (Alpha)
|
||||
|
||||
攻略動画を認識し、自動的に作業ファイルを生成します。自動戦闘ページに動画ファイルをドラッグ&ドロップすると開始されます。
|
||||
|
||||
16:9の画面比率、720p以上の画質で、黒枠、エミュレーターの枠、異形画面などの干渉要素がないことが要求されます。
|
||||
そのうち実用全振りに…なる予定(~~予定は未定~~)。
|
||||
|
||||
## パラスガチャ
|
||||
|
||||
::: center
|
||||
**本当にあなたのアカウントであなたのカードを引く 本当にあなたのアカウントであなたのカードを引く**
|
||||
**本当にあなたのアカウントであなたのカードを引く 本当にあなたのアカウントであなたのカードを引く**
|
||||
**本当にあなたのアカウントであなたのカードを引く 本当にあなたのアカウントであなたのカードを引く**
|
||||
**本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します**
|
||||
**本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します**
|
||||
**本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します 本当にあなたのアカウントであなたのガチャを回します**
|
||||
:::
|
||||
|
||||
[牛牛航空](https://www.bilibili.com/opus/926129394412421126)に登録できなかった?問題ありません!今は誰でも自分だけの牛牛航空を持っています!さらにガチャの過程でスクリーンショットを撮り、画面中央に表示されます!
|
||||
[牛牛航空](https://www.bilibili.com/opus/926129394412421126) に申し込めなかった方もご安心を。今は誰でも自分専用の「牛牛航空」(=MAAがbilibiliで行った参加型ガチャ配信企画の通称)をご利用いただけます。ガチャの過程は随時スクリーンショットを撮影し、画面中央に表示します。
|
||||
|
||||
- 参考(企画概要:「牛牛航空#3 五周年限定プール」):
|
||||
- 5月1日16:00(中国時間)サーバーオープン直後から、申込順にガチャを実施。
|
||||
- 途中で中止したい場合:配信遅延があるため、**ご自身のアカウントにログインしてセッションを奪い返してください**(中国語原文の「顶号」に相当)。
|
||||
- 抽選自体を取り消したい場合:**パスワードを変更**してください(運営側は常時アンケートを確認できないため)。
|
||||
|
||||
## Peep
|
||||
|
||||
MAAの目を通して世界を見てみたいですか?今、それが来ました!
|
||||
|
||||
MAAはターゲットフレームレートでエミュレーターのスクリーンショットを試み、スクリーンショットをリアルタイムでウィンドウに表示します。
|
||||
MAA が目標フレームレートに合わせてエミュレータのスクリーンショットを取得し、ウィンドウ中央にリアルタイム表示します。
|
||||
|
||||
スクリーンショット速度がターゲットフレームレートに比べて著しく遅い場合、MAAはスクリーンショット速度に合わせてターゲットフレームレートを自動的に下げます。~~ストレステストとして使えます~~
|
||||
スクショ取得速度が目標フレームレートに対して明らかに遅い場合、スクショ速度に合わせて目標フレームレートを自動で下げます。~~負荷テストにもどうぞ~~
|
||||
|
||||
@@ -47,6 +47,9 @@ typedef void(ASST_CALL* AsstCallback)(int msg, const char* details, void* custom
|
||||
SubTaskCompleted = 20002, // サブタスク 完了
|
||||
SubTaskExtraInfo = 20003, // サブタスクの追加情報
|
||||
SubTaskStopped = 20004, // サブタスク 手動停止
|
||||
|
||||
/* Web Request */
|
||||
ReportRequest = 30000, // レポートリクエスト
|
||||
};
|
||||
```
|
||||
|
||||
@@ -162,7 +165,7 @@ Todo
|
||||
倉庫の識別
|
||||
- `OperBox`
|
||||
オペレーターボックス識別
|
||||
- `ReclamationAlgorithm`
|
||||
- `Reclamation`
|
||||
生息演算
|
||||
- `Custom`
|
||||
カストム タスク
|
||||
@@ -619,3 +622,19 @@ Todo
|
||||
|
||||
- `UnsupportedLevel`
|
||||
自動作戦で、サポートされていないレベル名
|
||||
|
||||
### ReportRequest
|
||||
|
||||
このフィールドは、コアモジュールがネットワークリクエスト情報をUI層に渡すために主に使用され、UIは実際のHTTP報告処理を担当します。
|
||||
|
||||
```json
|
||||
{
|
||||
"url": "string", // リクエストの完全なURL、例:https://penguin-stats.io/PenguinStats/api/v2/report
|
||||
"headers": { // リクエストヘッダーのキーと値のペア(Content-Typeは含まず、UIが追加します)
|
||||
"authorization": "PenguinID 1234567890",
|
||||
"User-Agent": "MaaAssistantArknights/1.2.3 cpr/4.5.6"
|
||||
},
|
||||
"body": "string", // リクエストボディの内容(通常はJSON形式の文字列)
|
||||
"subtask": "string" // サブタスク名、具体的な報告タスクを識別します。例:"ReportToPenguinStats"、"ReportToYituliu"
|
||||
}
|
||||
```
|
||||
|
||||
@@ -47,7 +47,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
|
||||
// 対応するタスクのパラメータ
|
||||
{
|
||||
"enable": bool, // このタスクを有効にするかどうか、オプション、デフォルトは true
|
||||
"client_type": string, // クライアントバージョン、オプション、デフォルトは空白
|
||||
"client_type": string, // クライアントバージョン(必須)
|
||||
// オプション: "Official" | "Bilibili" | "txwy" | "YoStarEN" | "YoStarJP" | "YoStarKR"
|
||||
"start_game_enabled": bool, // クライアントを自動的に起動するかどうか、オプション, デフォルトはfalse
|
||||
"account_name": string // アカウントの切り替え、オプション、デフォルトで切り替えしません
|
||||
@@ -218,10 +218,11 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
|
||||
{
|
||||
"enable": bool, // このタスクを有効にするかどうか、省略可能、デフォルト値 true
|
||||
"theme": string, // テーマ、省略可能、デフォルト値 "Phantom"
|
||||
// Phantom - 傀影と猩紅の血晶
|
||||
// Mizuki - 水月と蒼青の樹
|
||||
// Sami - 探索者の銀霜の果て
|
||||
// Sarkaz - サルカズの無尽の奇譚
|
||||
// Phantom - 傀影と猩紅の血晶
|
||||
// Mizuki - 水月と蒼青の樹
|
||||
// Sami - 探索者の銀霜の果て
|
||||
// Sarkaz - サルカズの無尽の奇譚
|
||||
// JieGarden - 界园
|
||||
"mode": int, // モード、省略可能、デフォルト値 0
|
||||
// 0 - ポイント稼ぎ、より安定して層数を増やす
|
||||
// 1 - 源石錠稼ぎ、1層で投資後終了
|
||||
@@ -254,7 +255,16 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
|
||||
string, // 開幕でリスト内の全ての密文を持っている場合に開幕リセット成功とする;
|
||||
... // 注意、このパラメータは「生活至上部隊」と同時に使用する必要がある。他の部隊では開幕報酬で密文を取得できない;
|
||||
],
|
||||
"start_with_two_ideas": bool, // 凹 2 構想開局の有無(選択可能、デフォルト値:false);テーマが Sarkaz で、モードが 4 の時のみ有効
|
||||
"collectible_mode_start_list": { // 開始時に取得したい報酬。任意項目。デフォルトはすべて false。モード 4 の場合のみ有効
|
||||
"hot_water": bool, // 魔法瓶(湯)報酬。お湯を沸かす機能のトリガー(共通)
|
||||
"shield": bool, // シールド報酬。追加のHP相当(共通)
|
||||
"ingot": bool, // 源石錠の報酬(共通)
|
||||
"hope": bool, // 希望の報酬(共通。※JieGarden テーマでは無効)
|
||||
"random": bool, // ランダム報酬オプション:全ての源石錠を消費してランダムなコレクションを入手(共通)
|
||||
"key": bool, // 鍵の報酬。Mizuki テーマでのみ有効
|
||||
"dice": bool, // サイコロの報酬。Mizuki テーマでのみ有効
|
||||
"ideas": bool, // 2つの構想報酬。Sarkaz テーマでのみ有効
|
||||
},
|
||||
"use_foldartal": bool, // 密文を使用するか、モード5ではデフォルト値 false、他のモードではデフォルト値 true;Samiテーマにのみ対応
|
||||
"check_collapsal_paradigms": bool, // 取得した崩壊パラダイムを検査するか、モード5ではデフォルト値 true、他のモードではデフォルト値 false
|
||||
"double_check_collapsal_paradigms": bool, // 崩壊パラダイムの検査漏れ対策を行うか、モード5ではデフォルト値 true、他のモードではデフォルト値 false;
|
||||
|
||||
@@ -84,7 +84,7 @@ MAA は、エンドポイントを 1 秒間隔で継続的にポーリングし
|
||||
|
||||
::: note
|
||||
|
||||
- LinkStart-[TaskName] タイプのタスクtypeのオプション値は LinkStart-Base,LinkStart-WakeUp,LinkStart-Combat,LinkStart-Recruiting,LinkStart-Mall,LinkStart-Mission,LinkStart-AutoRoguelike,LinkStart-ReclamationAlgorithm
|
||||
- LinkStart-[TaskName] タイプのタスクtypeのオプション値は LinkStart-Base,LinkStart-WakeUp,LinkStart-Combat,LinkStart-Recruiting,LinkStart-Mall,LinkStart-Mission,LinkStart-AutoRoguelike,LinkStart-Reclamation
|
||||
- Settings-[SettingsName] タイプのタスクtypeのオプション値は Settings-ConnectionAddress, Settings-Stage1
|
||||
- Settings シリーズのタスクは、タスクを受け取ったときにすぐに実行するのではなく、前のタスクの後ろに配置されています。
|
||||
- すぐに実行される複数のタスクも送信順序で実行されますが、これらのタスクの実行速度は速いため、通常、彼らの順序に注目する必要はありません。
|
||||
|
||||
@@ -91,6 +91,10 @@ JSONファイルはコメントをサポートしていません。テキスト
|
||||
"specialParams": [ int, ... ], // 一部の特殊な認識器に必要なパラメーター
|
||||
// 追加、 action が Swipe の場合はオプション、 [0] が duration 、 [1] が追加のスライドを有効にするかどうか
|
||||
|
||||
"highResolutionSwipeFix": false, // オプション項目。高解像度スワイプ修正を有効にするかどうか。
|
||||
// 現在のところ、ステージナビゲーションのみが Unity のスワイプ方式を使用していないため、有効化が必要。
|
||||
// デフォルトは false
|
||||
|
||||
/* 以下のフィールドは、 algorithm が MatchTemplate である場合にのみ有効です */
|
||||
|
||||
"template": "xxx.png", // オプション、マッチングされるイメージファイルの名前
|
||||
@@ -104,7 +108,7 @@ JSONファイルはコメントをサポートしていません。テキスト
|
||||
// その場合、 "maskRange" を [ 1, 255 ] に設定して、マッチング時に黒く塗りつぶされた部分を瞬時に無視できます。
|
||||
|
||||
"colorScales": [ // method が HSVCount または RGBCount の場合に有効で必須、色マスク範囲。
|
||||
[ // list<array<array<int, 3>, 2> | array<int, 2>>
|
||||
[ // list<array<array<int, 3>, 2>> / list<array<int, 2>>
|
||||
[23, 150, 40], // 構造は [[lower1, upper1], [lower2, upper2], ...]
|
||||
[25, 230, 150] // 内側が int の場合はグレースケール、
|
||||
], // array<int, 3> の場合は三チャネルの色で、method によって RGB または HSV かが決まります;
|
||||
@@ -140,12 +144,37 @@ JSONファイルはコメントをサポートしていません。テキスト
|
||||
"isAscii": false, // オプション、認識されるテキストコンテンツが ASCII 文字であるかどうか
|
||||
// 指定されていない場合、デフォルトはfalse
|
||||
|
||||
"withoutDet": false // オプション、検出モデルを使用しない場合
|
||||
"withoutDet": false, // オプション、検出モデルを使用しない場合
|
||||
// 指定されていない場合、デフォルトは false
|
||||
|
||||
/* 以下のフィールドは、algorithmがHashの場合にのみ有効です */
|
||||
// アルゴリズムが未熟であり、特殊な場合にのみ使用されるため、現時点では推奨されていません
|
||||
// Todo
|
||||
/* 以下のフィールドは、algorithm が OcrDetect かつ withoutDet が true の場合にのみ有効です */
|
||||
|
||||
"useRaw": true, // オプション、原画像でマッチングを行うかどうか
|
||||
// 指定されていない場合、デフォルトは true、false の場合はグレースケールでマッチング
|
||||
|
||||
"binThreshold": [140, 255], // オプション項目。グレースケールの二値化上限(デフォルトは[140, 255])
|
||||
// この値より高い画素は背景とみなされ、文字領域から除外されます
|
||||
// [lower, upper] 範囲内の画素のみが文字の前景として残ります
|
||||
|
||||
/* 以下のフィールドは、algorithm が JustReturn かつ action が Input の場合にのみ有効です */
|
||||
|
||||
"inputText": "A string text.", // 必須項目。入力する文字列の内容。文字列形式
|
||||
|
||||
/* 以下のフィールドは、アルゴリズムが FeatureMatch の場合のみ有効です */
|
||||
|
||||
"template": "xxx.png", // オプション。マッチングする画像ファイル名。文字列または文字列リストを指定できます。
|
||||
// デフォルトは "taskname.png"
|
||||
|
||||
"count": 4, // マッチングする特徴点の数(閾値)。デフォルト値は 4
|
||||
|
||||
"ratio": 0.6, // KNN マッチングアルゴリズムの距離比。[0 - 1.0]。比率が大きいほどマッチングが緩くなり、接続されやすくなります。デフォルトは 0.6
|
||||
|
||||
"detector": "SIFT", // 特徴点検出の種類。オプションの値は SIFT、ORB、BRISK、KAZE、AKAZE、SURF。デフォルト値は SIFT
|
||||
// SIFT: 計算量が多い、スケール不変性、回転不変性。最も効果的。
|
||||
// ORB: 計算速度が非常に速い、回転不変性。ただし、スケール不変性は保証されません。
|
||||
// BRISK: 非常に高速な計算速度、スケール不変性、回転不変性を備えています。
|
||||
// KAZE: 2Dおよび3D画像に適用可能、スケール不変性、回転不変性を備えています。
|
||||
// AKAZE: 高速な計算速度、スケール不変性、回転不変性を備えています。
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -9,7 +9,7 @@ dir:
|
||||
|
||||
::: center
|
||||
|
||||

|
||||

|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
|
||||
@@ -193,7 +193,7 @@ MAAをより良くするために開発・テストに貢献してくれたす
|
||||
|
||||
## 広告
|
||||
|
||||
ユーザー研究グループQQグループ:[QQグループ](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
ユーザー研究グループQQグループ:[QQグループ](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
|
||||
Discord サーバー: [Discord 招待リンク](https://discord.gg/23DfZ9uA4V)
|
||||
ユーザー研究グループTGグループ:[Telegram](https://t.me/+Mgc2Zngr-hs3ZjU1)
|
||||
自動作戦JSON作業シェア:[prts.plus](https://prts.plus)
|
||||
|
||||
135
docs/ko-kr/develop/ci-tutorial.md
Normal file
@@ -0,0 +1,135 @@
|
||||
---
|
||||
order: 7
|
||||
icon: devicon-plain:githubactions
|
||||
---
|
||||
|
||||
# CI 시스템 해석
|
||||
|
||||
MAA는 Github Action을 활용하여 웹사이트 구축, 자동 리소스 업데이트, 최종 파일 빌드 및 릴리즈 등 대량의 자동화 작업을 완성했습니다. 시간이 지나면서 이러한 CI들은 점차 중첩되기 시작했고, 일부는 다른 저장소로 연결되기도 했습니다. 본 문서는 MAA의 CI 시스템을 개선하고자 하는 분들에게 간단한 소개를 제공하는 것을 목표로 합니다.
|
||||
|
||||
본 문서를 읽기 전에 MAA의 프로젝트 구조와 구성에 대한 기본적인 개념을 갖고 있는 것이 좋습니다.
|
||||
|
||||
::: tip
|
||||
이 페이지에서 CI 파일명을 검색하여 원하는 부분으로 빠르게 이동할 수 있습니다.
|
||||
:::
|
||||
|
||||
워크플로우 파일들은 모두 `.github/workflows` 하위에 저장되어 있으며, 각 파일은 기능에 따라 다음과 같은 부분으로 나눌 수 있습니다:
|
||||
|
||||
+ [코드 테스트](#코드-테스트)
|
||||
+ [코드 빌드](#코드-빌드)
|
||||
+ [버전 릴리즈](#버전-릴리즈)
|
||||
+ [리소스 업데이트](#리소스-업데이트)
|
||||
+ [웹사이트 구축](#웹사이트-구축)
|
||||
+ [Issues 관리](#issues-관리)
|
||||
+ [Pull Requests 관리](#pull-requests-관리)
|
||||
+ [MirrorChyan 관련](#mirrorchyan-관련)
|
||||
+ [기타](#기타)
|
||||
|
||||
또한 [pre-commit.ci](https://pre-commit.ci/)를 통해 코드의 자동 포맷팅과 이미지 리소스의 자동 최적화를 구현했으며, PR 생성 후 자동으로 실행되므로 특별히 신경 쓸 필요가 없습니다.
|
||||
|
||||
## 코드 테스트
|
||||
|
||||
`smoke-testing.yml`
|
||||
|
||||
이 워크플로우는 주로 MaaCore에 대한 기본적인 검사를 담당하며, 리소스 파일 로딩, 일부 간단한 task 실행 테스트 등을 포함합니다.
|
||||
|
||||
테스트 케이스가 오랫동안 업데이트되지 않아서, 현재 이 워크플로우는 기본적으로 리소스 파일에 오류가 없는지, 그리고 MaaCore의 코드에 치명적인 오류(빌드에 영향을 주는 종류)가 없는지 확인하는 역할을 합니다.
|
||||
|
||||
## 코드 빌드
|
||||
|
||||
`ci.yml`
|
||||
|
||||
이 워크플로우는 코드의 전체 빌드 작업을 담당하며, MAA의 모든 구성 요소를 포함합니다. 빌드 결과물은 실행 가능한 MAA입니다.
|
||||
|
||||
필수적인 MaaCore 외에, Windows 빌드 결과물에는 MaaWpfGui가, MacOS 빌드 결과물에는 MaaMacGui가, Linux 빌드 결과물에는 MaaCLI가 포함됩니다.
|
||||
|
||||
이 워크플로우는 새로운 Commit이나 PR이 발생할 때마다 자동으로 실행되며, 릴리즈 PR에 의해 트리거될 때는 이번 빌드 결과물이 직접 릴리즈에 사용되고 Release가 생성됩니다.
|
||||
|
||||
## 버전 릴리즈
|
||||
|
||||
버전 릴리즈, 줄여서 릴리즈는 사용자에게 업데이트를 배포하는 필수 작업으로, 다음 워크플로우들로 구성됩니다:
|
||||
|
||||
+ `release-nightly-ota.yml` 개발 버전 릴리즈
|
||||
+ `release-ota.yml` 정식 버전/공개 베타 버전 릴리즈
|
||||
+ `gen-changelog.yml` 정식 버전/공개 베타 버전용 changelog 생성
|
||||
+ `pr-auto-tag.yml` 정식 버전/공개 베타 버전용 tag 생성
|
||||
|
||||
::: tip
|
||||
위 파일명의 ota는 Over-the-Air를 의미하며, 우리가 흔히 말하는 "증분 업데이트 패키지"입니다. 따라서 MAA의 릴리즈 과정에는 실제로 이전 버전들에 대한 OTA 패키지 빌드 단계가 포함됩니다.
|
||||
:::
|
||||
|
||||
### 개발 버전
|
||||
|
||||
`release-nightly-ota.yml`
|
||||
|
||||
이 워크플로우는 매일 UTC 시간 22시에 자동으로 실행되어 개발 버전의 릴리즈 주기를 보장합니다. 물론 변경사항을 검증해야 할 때 수동으로 릴리즈할 수도 있습니다.
|
||||
|
||||
주의할 점은 개발 버전의 릴리즈는 Windows 사용자만을 대상으로 하며, MacOS와 Linux 사용자는 개발 업데이트를 받을 수 없습니다.
|
||||
|
||||
### 정식 버전/공개 베타 버전
|
||||
|
||||
이 두 채널의 릴리즈 과정은 상대적으로 복잡합니다. 릴리즈 단계를 시뮬레이션하여 각 워크플로우의 역할을 설명하겠습니다:
|
||||
|
||||
1. `dev`에서 `master` 브랜치로의 PR을 생성하며, 해당 PR의 이름은 `Release v******` 형식이어야 합니다
|
||||
2. `gen-changelog.yml`이 최근 정식 버전/공개 베타 버전부터 현재 버전까지의 changelog를 생성합니다(새로운 PR 형태로)
|
||||
3. changelog를 수동으로 조정하고 간단한 설명을 추가합니다
|
||||
4. PR을 병합하면 `pr-auto-tag.yml`이 트리거되어 tag를 생성하고 브랜치를 동기화합니다
|
||||
5. Release 이벤트가 `release-ota.yml`을 트리거하여 master에 tag를 생성한 후 ota 패키지 빌드 및 첨부파일 업로드를 진행합니다
|
||||
|
||||
## 리소스 업데이트
|
||||
|
||||
이 부분의 워크플로우는 주로 MAA의 리소스 업데이트와 최적화를 담당하며, 구체적인 워크플로우는 다음과 같습니다:
|
||||
|
||||
+ `res-update-game.yml` 정기적으로 실행되어 지정된 저장소에서 게임 리소스를 가져옵니다
|
||||
+ `sync-resource.yml` 리소스를 MaaResource 저장소에 동기화하여 리소스 업데이트에 사용합니다
|
||||
+ `optimize-templates.yml` 템플릿 이미지 크기를 최적화합니다
|
||||
|
||||
## 웹사이트 구축
|
||||
|
||||
`website-workflow.yml`
|
||||
|
||||
이 워크플로우는 주로 MAA 공식 웹사이트의 구축과 발행을 담당하며, 메인 페이지와 문서 두 구성 요소를 포함합니다.
|
||||
|
||||
참고로 웹사이트 발행은 릴리즈와 강하게 연결되어 있어서, 평상시 웹페이지 구성 요소를 수정할 때는 오류가 없는지 확인하기 위해 빌드만 진행하고, 릴리즈 시에만 실제로 Azure에 배포됩니다.
|
||||
|
||||
## Issues 관리
|
||||
|
||||
`issue-checker.yml`
|
||||
|
||||
정규 표현식 매칭을 통해 각 Issue에 태그를 달아 Issue 내용을 분류하고 표시하여 조회와 관리를 용이하게 합니다.
|
||||
|
||||
`issue-checkbox-checker.yml`
|
||||
|
||||
정규 표현식 매칭을 통해 "주의 깊게 읽지 않음"을 체크한 Issue를 자동으로 닫습니다.
|
||||
"주의 깊게 읽지 않음"이 체크되지 않은 경우 모든 체크박스를 접습니다.
|
||||
|
||||
`stale.yml`
|
||||
|
||||
90일 이상 활동이 없는 Bug Issue를 검사하여 표시하고 알림을 보내며, 7일 후에도 활동이 없으면 닫습니다.
|
||||
|
||||
## Pull Requests 관리
|
||||
|
||||
`pr-checker.yml`
|
||||
|
||||
이 워크플로우는 PR의 Commit Message가 [관례적 커밋](https://www.conventionalcommits.org/ko/v1.0.0/)을 준수하는지, 그리고 Merge Commit을 포함하는지 검사하며, 위 조건에 해당하면 알림을 제공합니다.
|
||||
|
||||
## MirrorChyan 관련
|
||||
|
||||
MirrorChyan은 유료 업데이트 미러 서비스이며, 관련 워크플로우는 다음과 같습니다:
|
||||
|
||||
+ `mirrorchyan.yml` 업데이트 패키지를 MirrorChyan에 동기화
|
||||
+ `mirrorchyan_release_note.yml` MirrorChyan용 Release Note 생성
|
||||
|
||||
## 기타
|
||||
|
||||
`markdown-checker.yml`
|
||||
|
||||
저장소의 모든 Markdown 파일에 유효하지 않은 링크가 포함되어 있는지 검사합니다.
|
||||
|
||||
`blame-ignore.yml`
|
||||
|
||||
Commit Message에 `blame ignore`가 포함된 커밋을 자동으로 무시하여 저장소 히스토리를 깔끔하게 유지합니다.
|
||||
|
||||
`cache-delete.yml`
|
||||
|
||||
PR 병합 후 관련 캐시를 정리하여 캐시 사용량을 절약합니다.
|
||||
@@ -5,6 +5,10 @@ icon: iconoir:developer
|
||||
|
||||
# 개발 환경 구축
|
||||
|
||||
::: tip
|
||||
본 페이지는 주로 PR 과정 및 MAA의 파일 포맷 요구사항을 설명합니다. MAA의 실행 로직 변경에 대한 구체적인 내용은 [프로토콜 문서](../protocol/)를 참고하세요.
|
||||
:::
|
||||
|
||||
## Github Pull Request 진행 과정
|
||||
|
||||
### 프로그래밍을 잘 모르지만, json 파일과 docs 문서를 수정하고싶어요. 어떻게 해야하나요?
|
||||
@@ -124,6 +128,8 @@ MAA는 리포지토리의 코드 및 리소스 파일들을 아름답고 일관
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
pip 설치 후에도 Pre-commit을 실행할 수 없다면, PIP 설치 경로가 PATH에 추가되었는지 확인하세요.
|
||||
|
||||
이제, 매번 커밋할 때마다 포매팅 도구가 자동으로 실행되어 코드 형식이 규칙에 맞는지 확인합니다.
|
||||
|
||||
## Visual Studio에서 clang-format 사용 설정
|
||||
|
||||
@@ -13,7 +13,7 @@ icon: jam:write-f
|
||||
|
||||
## 로컬 배포
|
||||
|
||||
1. [pnpm](https://pnpm.io/zh/installation)을 설치하고, [Pull Request 가이드](./development.md#github-pull-request-진행-과정)을 참고해, 저장소를 로컬에 클론합니다.
|
||||
1. [pnpm](https://pnpm.io/installation)을 설치하고, [Pull Request 가이드](./development.md#github-pull-request-진행-과정)을 참고해, 저장소를 로컬에 클론합니다.
|
||||
2. `website` 경로에서 새로운 터미널을 열고, `pnpm i` 을 실행하여 의존성 파일을 다운로드합니다.
|
||||
3. `pnpm run dev` 를 실행하여 배포를 시작합니다.
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ Commitizen 규격으로 커밋하지 않는 경우, 병합 요청(Merge Request)
|
||||
Issue Bot은 풀 리퀘스트의 제목을 확인합니다. 아래 키워드로 시작하지 않는 제목은 `ambiguous(애매모호한)`로 표시됩니다.
|
||||
|
||||
- `build`, `chore`, `ci`, `doc`, `docs`, `feat`, `fix`, `perf`, `refactor`, `rfc`, `style`, `test`
|
||||
- `Merge`, `merge`, `Revert`, `revert`
|
||||
- `Merge`, `merge`, `Revert`, `revert`, `Reapply`, `reapply`
|
||||
|
||||
### 수동으로 트리거하기
|
||||
|
||||
|
||||
@@ -11,6 +11,10 @@ icon: teenyicons:linux-alt-solid
|
||||
MAA의 빌드 방법은 여전히 논의 중입니다. 이 튜토리얼의 내용은 오래되었을 수 있으므로 [GitHub workflow file](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/.github/workflows/ci.yml#L134)의 스크립트를 참고하세요. 또한 [AUR PKGBUILD](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=maa-assistant-arknights) 및 [nixpkgs](https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/by-name/ma/maa-assistant-arknights/package.nix)을 참고할 수 있습니다.
|
||||
:::
|
||||
|
||||
::: info
|
||||
Mac은 `tools/build_macos_universal.zsh` 스크립트를 사용하여 컴파일할 수 있습니다. [MaaAssistantArknights/MaaMacGui](https://github.com/MaaAssistantArknights/MaaMacGui) 프로젝트의 README.md를 참고하는 것을 권장합니다.
|
||||
:::
|
||||
|
||||
## 컴파일 과정
|
||||
|
||||
1. 컴파일에 필요한 종속성 다운로드
|
||||
@@ -68,10 +72,12 @@ MAA의 빌드 방법은 여전히 논의 중입니다. 이 튜토리얼의 내
|
||||
|
||||
[Python demo](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Python/sample.py)에서 `__main__`의 구현을 참조하세요.
|
||||
|
||||
### C
|
||||
### C++
|
||||
|
||||
[CppSample](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/Cpp/main.cpp)의 구현을 참조하세요.
|
||||
|
||||
### C\#
|
||||
### C Sharp
|
||||
|
||||
<!-- Do not use C#, MD003/heading-style: Heading style [Expected: atx; Actual: atx_closed] -->
|
||||
|
||||
[MaaWpfGui](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/master/src/MaaWpfGui/Main/AsstProxy.cs)의 구현을 참조하세요.
|
||||
|
||||