From 1288b38b3b1d4132ab224bbe3e7adde18523eb30 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 02:32:30 +0800 Subject: [PATCH 01/29] Upd: Assignment character assets --- .../share/assignment/dispatch/CHARACTER_1.png | Bin 29910 -> 29901 bytes .../dispatch/CHARACTER_1_SELECTED.png | Bin 5914 -> 5914 bytes .../share/assignment/dispatch/CHARACTER_2.png | Bin 28841 -> 28829 bytes .../dispatch/CHARACTER_2_SELECTED.png | Bin 6168 -> 6172 bytes .../assets/assets_assignment_dispatch.py | 24 +++++++++--------- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/assets/share/assignment/dispatch/CHARACTER_1.png b/assets/share/assignment/dispatch/CHARACTER_1.png index a642340049708f9d01fb42427cf1b7e5673122a8..91d01ca2bf10e7665141a652a0c4b8169a68131f 100644 GIT binary patch delta 24070 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 delta 24103 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 E0v*}S!vFvP diff --git a/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png b/assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png index 2cf101dc3619d87c6e417e4a56f5f998c41215b5..954517450bfc8cd8929ade5fc6601bfc10a6d11c 100644 GIT binary patch delta 567 zcmV-70?7TEE}AZ|#|ltAYZXBhfZ;QDuM)&gurZaQovBr9LkdZ!|3Lf+B8U<#EbIjv zv5K}XIx<3}4LD(1r^o9uOWY=d5t3kKZ8=V7~fB&7T zTG{-puP@Kez8xDI9T_?K^5yjArHyK}+$hWSvZ|__vvdFe0PWP3U=Wj&53gUpIX5>K z5sQmUzpSRnIiharZZ5O}003yGjs%0abLVbd|2T2t`0q<8awj#NPL34i+Ok#v000Ky zU2J^(+|<}L@^vvs zv$j#KZB)_$006X;E71KFF-1`n2Npif)lGfy(BVkEh{%y5qKIzf{OsMwXHRFIKYFn` zF?#IYn^dG;SsgoiNIJ8z4@w7`U3y}002ovPDHLk FV1iD_2EqUU delta 567 zcmV-70?7TEE}AZ|#|lrsOIA@B!13q2*FvIAXsId5t>y|>afr71528OIf=H~Pp_piKi3^w-SH{fUX2%gf6V zvAVkU-D--QBkHCe$c0t_003?3NYGzXQ`2?*b!6nkk4q_XCpDc;juhqQx>f)H00!W{ z*!lD4W@jIsIdl3Kds5^qJOBWHK)YOl?z3yxuKs#MikwnDIB-BK004kCIf&dZNdf=> z00XcA7ytkO1MokhkpKVyzyJ&Y004dFBUo+A5lxP6_p=lL003=r0=z$7ynHPJ002On zoB+2cM>IL7$SLRf`8R?9000<(|9YdNXM4Tgv13Pny87tx{L0EFl>h*L0NUhdJbP7^ zWl_|-DV-ylCcj_l-nexyMd!}+74-lB09xY&c&~b2qbPQ}dHqXyee!PVbRyT%0RRBB z$w#pETrkyjjynH-=i1uF{DgFK?`ICjE3l}Fpd|b`Z zY;ISZ+m&;3dp!U2!LyCY zvEe%lsYt!D8a_TG9ka0yO9zuM3kM&-f8ZMc009600|57yyA@%KAG-hm002ovPDHLk FV1miT0?GgY diff --git a/assets/share/assignment/dispatch/CHARACTER_2.png b/assets/share/assignment/dispatch/CHARACTER_2.png index 96ca4fe2a6dd1cec75b5befd243f211efbc24ccb..c68a4daa417516152c040201c3ddfdefd36baa95 100644 GIT binary patch delta 22263 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�mTg`~gahFD99u}mmq&Bg7m)!cS z*{b++#_A5vb%%&d>;E+wQ&K88uz9fE_}6yWP}VBYmZBx2!3IxBdD$K7uUJ{t6A;#tN;udQA z-rBQ*D!InJY&?6CtbLlK?Y;GbZCi%M(a%$n-iP{$K=ARYtIOi;f`YKAoGF*!iLk!0 zNs5O;j(X6qaSK;+uQ#uZUFhNVY{|mna`@y^aNGhI9U|Nzb0k?)`I7 z!d$i3d`LHgy${KSCqzOt9%~uex7Z4PBumKiym#KXzs@*ml#E;&<4|8sQ>&(B0cJO zbJw3)glL58Ba%rz_}Hqn{=(8*Me#BqhBg8T2C;P|C$Q6$nnVo8b^|K=l5ZuXz6-BPu28Uz)mN2G zt@GkG%6_J(tBM$?p2|$>>JYiYW&hy!L(22#@lNNNS>hJEr<6{KfzXBN+F>f`&`d^V zHlh$feD4@}WoP|nVc{CL)bkCUN07LnmCp5pFZfCiD<0vRiot|^klzkE_xcFY>9|2a z%<62;@qrt+5x>nnM7c&CZ)X+LCT+BF+}1ujNtQFos&yqt=6J-dg6O|Q(^y|Pw*)WF z4XwRbPu;%s&+YWIXr+XTl6(6*@HVek^>&d!i6!=xgsbAk_S1S}b9x0DR?B>G8>#hj ziaiDtZd`k10^Jo`f90j@r4B-)dAIjIG`I2rAvkD~ewQ}!-!RFo|Le}p{cp`e3Y{X z)wf<-2=xh(?vt$=xHpHimshwm&>RVO2rmx{oLrW-&j~v)`^;>SjT{l~b6xtSe-0yt zGoQ=uW5*$^zcfq26*-b})-GfBlFgNQ=Je-JzGn>?jtdo{Pdx%4}Yc`oU{|Nf$B1udGm%`R^(Y9N;Dxj%UQ zQSupF#V6-|{_4=pEQ)`1e!3+op5m|AMb2pucWn0BCihz+=7jn#L_G^9Dk-kdG{88s zf{Mk=-Wia3~0)Rmas`6jF8-&*5OU0_DAazZ04o?FV>qP7Wr?iC@OKQ`2!j&GVwH{I~ zTfs<&8O8Qb=maB>4^6urtR*I0DDoQ~tC6IfDAy*k6ru7S%r_nU9O+`62@G7TX!2Ar z>6RhKlAX_LU>Xh<_?ONKwYo-8+QOTX5KA&%0q8W^Ae>Ghp#n2ky4$UND#9j~D$hTZ zSEhK4=`L=LZ%!@3n;_x^KBL@O^xfyVmQ)NVVyR-}&ikPCoLt~|hnywi7ydGU9@{;7 z*=;a)elR+&W}}pLV!1o!yNds~lU^ch@5)k+qj$JW^VH4g^( z(s4)2@mw2g6AhD3PntZn3Wx zTR{jnba`h57O6Kd=P5mWIs0-S=s!5jS`f%;oWUz4PK54$!>0Qo+a}1PBeS6S1Ahq<_b@k8v#36U9lK;uVPrRpq`$D3sqAIsVOhd8S z~oAP=iGWB$kE-GL2+^#Iw50B8hLjcSe(bb(M>~*vX zgoo|5_v#f3KWD4lUR7xsqAn>VbnB^EI!J$+I7-XPjE%J^5VsMu$@lhbzvl0l%`3WV zt>+@n8GwUQe1m}M##tz6p_bb->H{poBXV&k_Anx}`JRA;l^qPGr1%?1i_ihQ|b%x)(wO)lQvR(_fmtu+{nAQBp^w`IouMQ(foo_xKwTSV!*g&$>?SAsD zDQ0Dl6Ma`)|JQf1$Q?^a57RW|mx`!-(HOko;iFtY;md;GY9#KqX%27teWBOI0%3tA zk)^?fV)0E1i%k>H>OBm?y1166zp1yT=&1^e(U!-}bN%K5xY!2e?@^ShwvAh=lv*8V z>!xPrVj`kizPMrH)ErGWC0+Fv;8j7YAMqp`@PAdEtmT`sL`#QwYgrDVM!=+w{yH*A@wT1op z;+CBMyV&QAVt)#+a$eNNW4O`LfDWy7b%G<^dxVK~yLzvI!8n@J&#D*?=(D3`d~h$Y zGV^^Jcq7&nQi8BmiqTJK4RBm+-&~B(HY_1GxwRfmWTeQG2`zcgO^rh*=HeS#S1U3G z%_P!$W;YyKHoNs7*?&Xcvyue)e0pGWE(yg_zxgu8r?7rBFR}_l2(=Cn9PNYspWFYRno2%07RF=G8I{Y3OVRRx$H0;$5fDV_BzYSYk)zvk7jY2+xuuT)XTH!ogly{{1M2UtR)7Z3i>l{E4-h{BC$~5?4cYwX#A} zh1=7@0X@%}nqB(G+7TAlP|Px_zyvv5jC{tLe(bFP>8LL;>v``I54I-b{D?&C5T%x@ zlQ7Q|Xk1(@6Z>Dadp!UNtz}A{93ExO^N)^K0Y-1I-L+oyjr(X5#j`MY>F6a8 zx?3@pa3j(syszow5427J-TnqQTXBHHjcXgsBDUxO&vDB=Z){o45gn0^pFG|?0?uh3 zephEs3{L#m>3PJ;TBio$LIwTf!1JWM{==?EjKi+reT9gfL`{t*mq7=tTFCdA%)4#) z8qs?@2WEN;vT^C$MKnKBRg3a`EQ#!@3)e1tJNBbTbq$80+E7{!JF_eqVzS1oks3?R zx)ip-?oXFg13*Y&Z-x?=^E&32rZEkV2N)(Zh7lVhp4evGKiK73A8_ zAv3hpS9~+P9RXn+eLqb1Z4GySf6!ep*|fcC+x_r1vSk+^l;;-2iyNp{IsekE2VXJw zU?Pm46Y1H*%Ks)r3PXbrXxSD?f~pV55Caa%?Dt(OySR-6WX_QAyEw-oKcTq)zXE5O zL`hOq6it5fZO^%IEQCy8IlZhZtu4EKo)5>ME)2&QxAOhnG5zT^vr zd4xq@)mWPu1qEHg^8ssBJkw${Zz?U$uwEPNOi&fov*dQ8d6SCjO#79Fb6Y|@TrTRGigaG#nCIeO}vQ0}C?0ow}vf30v@=Ku)w zNoC7|IwAaLd6|r&Jj<9#M{j zrIwkPc#wYl;AbOTiNH01AqYAdpyz3DWGrS3n!KGB6PsB_1~Y)E3`T-4-BsJga?Y4v ztwuJ>b>!PCAF3;zP(EQ(BHh`MH>W3MfAbj`GysX#D=EAqur$-@RT(~2!U*4V0$L&u z_q-~b=g72iZm*4Y`Tn&1&)ES{4}8aFIS9~$-Ts5i|DTW!duf(7z&j(=Wb@Vz6 zG@ES!@iGy)lnp1>@dd1RHrP|GZ?LS`sR4}d%i|@6=}?!tYrOpA*#N<*Q`pRR%C*~- zt=l`cjB$@zZkaLPMi(Z1zT5{JxmN`(k*nM9BBKf8AD$k^H=kAXQ`CChKhNr*;;%-m ztsOSomjZqLcEEfc;Q@VY$kpa)$}Nf>G@B8+oBFU#&2Krxk1u{UY8N*$sGgFZ+I^^B zx2tSFzQ0_c7Bp_!pMp!MR?E_Pv$C4py z{vPjo3N!{zaBa>hT1oo&N6hbw$%IO2mp@1jFwu^_dlH88lA$~R+d=Khascq77_fX74>VckRa+pJrt`+ zIPIz{z_7dy5~O%r_K*(YZZI}N+`p&W-(){_@-#?RE6oK`az8^`jboEVglz=J-M}tq zfUsd-HFqb=mCS;|gR5%*%SO-e5V^REKMX?lc0T3=OlA($d61m+HDc}l`swKV>qF9R zICMO8q!6{~+ag5Md?PItyV0gJK_QJN6>ocw*Y(60hEqK1K^@_FU-#1lNJ~rhyHp;H zqlPH4)}U!HaQxOZx$p=y8Rq+R+T}7xB+f@n@pZyVW07HU0%Z~C{XshQ(CcNmL#T&D zTu&aF5+o(PjjYrzBvohMwRQ3m6;5YJ*B6?*gJJXrVDfnZA$+o_%TTw5O|-8pXgMw) z^}ojEPY?bO0aW_^@I~RZppM~lm3xCR7L;*XfT7DV64XpFyXlW$ta%T?T9`bL}$)u8(Aog2h*$5{{W$XR<`5 zr@hF)G<|c>M+}cy8y&3=}IO zt&EE$wZ+c`lmwfD+X?kPb9=8!fnp~1UZnG2XZ*x~@33w}8h_Z@Q^%B#d6#t&bFcU+ z2=jND?sqbE0$Hek6SQ|3M72U#n()@guKr3J8gJN2@x^o^jGTaKGQuDA<}&FAu@m+i ze2h5J3g4CkoNeoY{xsG~LvDW#u_Vn{;xihoO)1PfPejmT;iF~00JIxxj;SSlvt1W7 z0(UWU=D66>g+y}!>AzZ;A57AnQ*+kq`Ll>SIyH!2U(wM5k>Wj2^Tk*l5e!wt9+HXG zljGyrpH>E@dIxlzOo-h)AePN@d3iv{!^ZCd&cURq8b4|6)QV?^5C5s(;&scZbr%duv5y}ZYCcRoEs?%+52zSoYY zyQ)TiCWZ@M9}9&klPz=hccy57)D2?cvjx5;KE$}$=&nG=`<`=GWvGz=B(rNiH}yf)6EVMR^L~MQ$?%Ug z#;uZqmA!qw+1Wn}yMI0n@7wt?3uzgWSBj|CP*Nivv73AxG!DO;oC7t_!M9fXFG)RO zs+(BXX!Innf9J;4hD?@ArJWPGe(`hqypcEk*=*PC;u&8yHbzA8;4V+=wv2D%>fAKi zK3jDY$Z9?6KR!Cy@jJe(%Joi+O=c>4v+N_HgHbMZPjRn8G(U-dp5as`n%=VI7fywR z{i4B_d4q z-gfeJ;*>ej8Edso3J73UP3^73kB_FB0WvaVsZ4qv`Z;>mJk!YNrh1WKe@TatgS+I~ zDj}WO*C(B-ql5Tc4+sC1Q7J<4-S!(qGjZm?6LOwv%YJtjXY5dtXI^;jlZDV!gx^Hj4Bsuq;jA68v`9cXse^ws< zRgB|0KElP@(4OkC6<@)TG>a>l?I>B_5nBS`T5?>OuV;wnQJK>cF!Dd0qSz2n+j+!PvNC1OG+B>2 z_7~f%MHS}^wH)=>7P4X1dgvFaVyhZDLLT!Y?)#cZ@RX+Kj7@kbO>QL8Nv3uq#|IbB zZ8H+(S^J_|t(tUa5BK-qaD%4g(k)lbni&LfuX%FEnnw>`2g1bhq`tc^+tMXe$D9?=f+wcb3 z{}zN4>mmdM8aECh)m>9L2TfT9{q4Jzz+Ua$V*+z*?h`?3gfhTNmZv{kTFvK>OS5xS zI_DL84MO0rs6`0d9TSWY{;)rCzi7;!hv(B3tc4d37V)YG@C)$l>2`ti}PK-;GhPXc8>VA{d#y0!Oi z$|GZswH4Q;X8WC)b@c7J-YC$B{C@7F=Wr^44)tUBg>PO3l)P_7c>kOaF zSfguOrYQj<>?jYv<+noZ3mY7D%c`+gJ^Zx1ouxFfSJX)1%b59AaO~vfLBnTFQp|YY zc-=64SrGNy0lED3vKOp*YaJc_5zX={g~-s0v2%B69vLsqqVR zoN_8%U@v&!%N4U5s=##MO2^SO2mYOU##jz*t!aE~|7v6n@U#z(Y-!$QZOtrC48D^( zqxwc2UJ6XlnI%RnxmC7$0V^{!`>@5_~;WFu#kYoF7>r+&Tt#p!Oy8-O}h(cTkh=79(1lm9<^sh z(^IY@B}gREt2y*qhcVDO-Q)dBdc>T5iv|qHmsc|F>}T zspxzxgRU_q?SwtI+8vljO(P;AtXqfR}9?<&T*o?yy1`79I}xq326#^FI51qI21bJizsbXa>DEYooW?6EJhpVJl#CecZ zqXbyQFnSU=e5Y1-OYqT^2;UHQx6qB$tq~{MIjgk%n*}fVK2PrQ9M8&R?cHu@okM8; zq6;8*K=`lYM+wYamG|?r52J(as?=kq6maLcSrKMYhaHc(UTwtdsL8Lme$&`ndG8ky zjPzf!jkTSWpd-`!BG(@^|6wgY2tPa*lis?^$Snq{j^Xf?t_P9so{LXKu$IclU)GC7 z8dhYrgapkl%J6?Vo$=N`33j(kdgid)FH1yNgSa2RvCVGN#)n4_k7qJ8zeV&_@O`F2O~uY`Yz%(B!mx;NO80Itj~$6z zAQ!_zT;{j2BG3G9nEkhAaY#a+IJm^Fk&8TiJBM?29{L^UCIS+(H9=cdlbUjfk%6dU z_L91qAXE3miV4U3;e>9`7Vbfn0+*)d-Fq4yH9)H$-wPmg}j}LE^bVsKo{I8HTKjM$0E)YXSp=Kv|a%ae_UwwVzvjFd? z|NcyU)?g4z`^R52%FaP9eDP=Nnhp5(V$yGRSL~g4D2_B<8G|=V={iVqp6d|!v*8#d zYBRF0TiM1?9MkYqZEL9pBJJ|z3NhSlUNugSg1qp-nrpwl{<5~8d~3RhTX>lgF*HCHY`ps+HNw-+U@K2-2qy296RKyZ3>ubpTpb&zbgY=lVI~IGWUb)w?UpZdC z@`%2ZW`mTgv!S2X;bZfwWivUoi!QV&i}RybAMPReg1t!#TQDMk!hjB`Hf+}fZiX(S zi<_=${ckAaWX7d7jDP#9Inc3O)xswHm;GMt*0I>BW@ne(=Hso$t8=cHeil<(Yh$mf zf|x2P;V|yY9)|}^)>JMdABgrnxWQNDm=)joi4T~;uf3vA@zV@=Hh+Dw7Psm?Q#M^e z9hK~9VKqnw-i|(=aDsBKjQ2?3$V^jRhv@)BRIsE!+CQ=p+Ty$JA{H@$ zs{a?0FR1H{Gjo~x+A}}RY_FfowcZ&8WRO`0GB;OM>oO8sJVFWE1T))JB(3>qM01}2 z90K7#>-j1s>Xt^Gkj0=asWY_TCA&)f>X{h4)g{)yATSRzt)kH*AG*9}SX4#~&t!H9 z@UFAuBqIu=xoN}5%jYE5KdREF+noMi4_6+RRNB60roM5e&CfP#+?vM5EwwVUB&8|R zq|`JMS4d4wP0d_T5zjP@mAU;i$z0IVj7*U+#0}A@v=j?86BPx@jSvAv5e0$Y@!PJ8 z|IT%Bo%fvg+|T{I&wbx#Aob(+j`oGj?x1~)tnGUZ_qK^=0!`e2^5ftns>vWqTIz1- z!>t0x=h?ff60Y9&H;EC|c?~|j9C$MNkBbo@gU07~5I^)!JOO- zA^+c2(b^A=}Zqy^DOQ73Mu3A>)@#kNoF zs7QX?+#-0>spumR+$}%7pmlT07?;g)LxX-g`8dBzWmEAf)rDk63gN?OM?bv4SSQ~a z5cQelRqXUoIh+}5ijHk84f^L6QebD2h`rjqx&YYHSbm*B)wV-D&S!Nz;J*A=q^3=? zB&#THUqHrQFzM^sSea1O5wQ2`j;hq}@6PZEeYf?1$!7J2|LSr*yaV)$Cwi7KVY+I2 zx_!LKJH$`wP4cLmqK@N9nhoX$*FLMm!(oKYcil9-mUwRrYU$S3=N&U8Uq9XE0VngV zcGU+C4nmCMgztFru#hDcbdjX6aEKb#hMm~E*RUmRY`S8l$2sxm+)WE_0Qr2|R^fNp zrWxA7gO-GdByM%#;b+v71^3!pY;b)85T8$rp%>ki=f8gMu*+V2{A!t{S(Y> zwiZN?g>?)?s`4~yXrzd3t(mY6_w^=TCOjj!=|kcaQ?K8;>TT){-kE`Hk2DF=$Iiq; zcf4E3tp$>%SWOS}n6j?haIeQt@nNwevOx{srqkwSoO84w;YquL=;&mcRRr3PG94U? zYB;iUX{psa^M5C0z7;7t(HB1146qkovEPRXYGP5WpP=(SUBwMWNQ$(X;$U=%p0%!u z%=F|6+q?|xI@+)&JHrG^BsZd_$+GHke{63M*XGuoaz38tG(sn%V{%%6|0}` zIvziHG$8QBLkxW~WD@)df3-7!#`0v^vP z!(9Kv+q*Ju-Qds!JscCa^w2QDbpC@TKWm~?%40ii;8CSQ zXIKqxHL~F&#PM)jBj97XB~Env!~^ zODo8fasQs@3*g4{i{>R|ff02VE?gLwwNX1(GObbZqih_o*V1(mPVV`$nUo@|kgPUm zgt+i{>j%AJyP{_GJU$L-mN#Dx#s8S(GnI6Fx@3r17&u;X7$!;D; zW9Yyryy@te@3rs`0iVVia%w{Q`b@m*X^QWMwpjaj3jQAW#l*erC_CXLV`XI}*CI*( zM1nDjuDxvwNcU!6S4x}4{mma{7561ug!+~l2{3?NPXUNEScG69y})49t5k8JmY)78*~82(pF z?T(cO^{sNZ=+rCMK75=Tpnrbu={9;WH@@LVLydx9_8%eBx}!|~Y_O-j=;IYHd<@3g zFY3~s*(vAmh?66Qi(k%39=a8P!38WA*j2Rq6?>N&)}ujln-`uxZM}VH7^ph7WgBkM z!Cq{+u~mS(T7N8l7?0*pcbgbtrBd0jV;jGwG^TwZg%{cED64VDehzosxBqUgLEDTX ziY-d29k{vf&pxnU8!PM6$nrGFlQTJel<7eeMnIG5NJ#oT^~n?UljB8@xZoE9*Q(%ed4;&+{kn+;6o)Vir`c`LQzf<>c9!Ex}pI^O+jM(v~ zM`C(YY%^q!86UJ9r>b>ZOE8hbvgfD&Ws0+xKdmoo*8ivt zi_oe5v^v19P|`3x@=nE>rUZo8L9<2E&)`9(?gG~e?*WL~2!+XciA2te(44aSpgxr* zL(-=WL*Db4Z=lAPmE^k`5@&i;rFj+70S#W~R4cqpv;LOH?edONU0kw+n8-Lm?6d}c zv6nP{f1WNHOxv6Y$T-7e+Iy;Ff%Li+5IV9-d_mzU&D zqAYWM_RaTfUD@2ZvYD4Y^~KpRt8C z1g79v_O65C@}NCsj@TKwdJ%}E_)Ua@drG1a$T0^d&YB6F=AnuzsQo*f4KvueGzUUp>0pJ`j8Zxo(N;F4!sI8sbrq#!C_q%->tvU^%~lf zLc)1g0@=qL=Uocy`Gsok(I9IsWFS>`__Me%e4w&SIuYBc$`z8RYB0rT7KcFY-T3MZ zPr({l8S&?-n9?Buf?EEZd#oC_a38YpU?hQSOma}XwNzASmPA;h`l z*R$s9ga~h zvQulw)MQC!2e`h!GtPp|;FS&tyB0UgxXyy3ot>!z7x#wZg~y6K;l$j+NSy;ikus8c zb~49lGLeK;DP%%z1N($`2Iz75GCDgahnFObCIM~yp}xL8i=4N_X3k6*0xs?lmPe6j zR)=QPN=YaGGD$&4bf(QN)tLTJWoo{26TDVfPp#*~49`+*qkg5jKGimITmu7ts9M?v z+fDqN0*)LxBAqLDkfm}kMt^<*gZ2dSy?8zM%G|}3y$7;ornEqB!v%n zQ=t{ZrR*$m`goe$!7OnZyFM~$IRwUX{i8bD4|~KL21{9}<-BN2=HpEHW!|-CI*XhA zEMjS(M)YMcNU&J-{%9+k+}zx$o2~sBV@)xj0qAReA-r0vbM^7H(C^6Y?Q^sMj41K0 zwo&?5f9=e34L);bI4!O3b#-?GckkYPvv1|I7PPUkapj9P-~)@Kq!O23Zo|pd;J(FC zmdO>$x_ilzH~aei2rm1Pg$VBI(Y{9Sw~xeoV(rH7Zx8iCx1cEtID5zs2a#qJML%hK zb)giV|NDPuKgZ%Z835IND3YQmtV19_MQXx@c+j*dIre`a0Zxn;vhZ?F>Le)90i^V- zU7=o2F0OQ=R;t6utDx#q-nKf5v34r-;I?TQuCO;~r->L4Ny(!}E7GFQPl5#4Qy=pT zkA&`B5V>d!WZ-EH7Z0vSI8gkEV{IpX$kvU;3k7B*|7P__LseGRd8a4|*l|RN@WP~6 z@5(Zu8J@`dP2P(n!N5=(eBhrhXaG94v5%CSjQ%A-4*90!%K9?E@2M=|F;#HU0+$I@ zeltHi^@Z%)PkI|dWV#*LEm0}93IQ=c-SK{<1X5L?R;x8j)K0Xzsd~CvBSopN1jPhh zx$;>?!l=NYr6OzEQUTf#)dNaO0H>-rm24PTwy8LAbLw1KpX-GSYa)VUb@q1Q%lG%U z8$9prrA*&keR8*>nsSqo1*)r?Z&5sF=SchEjVz>c=mG{Q-ep}oImUU5;MNXB@NTM~ zOIERD@TUJ2{u0Mo0bzhxxJ%L{B=>!1rXwt4DU?Z$V_StwH8!1qM%fvgoy0XG;!s@I=yX|38R|n_ z2h}#7ZU#tbb{*7y5A>(zv8}b#v^caZLxfgkg(yYH*feUNFpu$o3?D(at@HA%_kna}tNMRyJsD z1Ivk@S)l38Z3d2M6J43$nF=&zcB-cbxDgx6v|*mKv9VdKM|V=a%#o>rP(aGlJRQ1j zM)clMQ}AVAfH>CFA*EY{KYP|z)z3M`;HFelJlOXW5a!G2w*TmB{efq&m`IPZj!E?L zH#-nX>23sTs!tR(jtzNsYQ6Zc&&0gPPNxiGO<7q&#y0WWb5#j;F7=FHJx7TtDea#d z6$Da~%noR;aW*_KylMvIeT&vZ=}jZ} zNf@2~l|VXps)>kt5Ly$D>?-&FvA1`&a58=nbSGPLQ%&G%v7YudA}Uc{i&V`HdzsTJ z);^gK2!!ZJ3JbbiE}z=mnx~Pyqn@F|%|tSVtB^F(5U*gMU`Sq4qL<7;f??JNBCHP{JZN>W%sxdrTML>dW{=t#mYHy znyLd-27G;CLE7|Y{y~LeO3a~>k7iYV6;mZCgS1#S4I^L2FyDt~gN~j&5>N}mIy=%{ zR%@Y1UAVpBHmEt1jEp3cht`(QXhW52WWS}+>Rg~rsE5&sV`XmN@ko4z!6^nQYAK6- zZAXU3o;#eKs(et}@UJ||bvekEzePy|B+0+@gs=cS+B^Xgh`G_BJ4=xhwtf{n)C;}e zai$fk@i@q#eGx%nZJsYTWqS zxyx{H`>$h6p_l&Ki7tqsrHOTG!3nFmuu-GR$!F41W0b28ax~!x1xD-sy+;~3w-=f= z_C@OG?PMu4#S$;NoU&ZMF6C=ik@=_*9Q(c h)eiyTSfknS&AAtwN;i8$lzrzW_V9#ywJC7 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 F{|1UMJIVk6 diff --git a/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png b/assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png index 0980134cc15140b809335dc871ca2903078616e7..1bfd1964aca5db060ad90bb1e2880f6f18776340 100644 GIT binary patch delta 851 zcmV-Z1FZa*Fq|;3z6yUyNklps)~m3H$>J^rA$O1Paw5q{Jj$7a~{?BEwBrU3Vol+@0B(o!{%Q zwaMD9mtkt+^Wk^+4e!n6%e#EvgZB#o000000000000000006T;3(f+6;D0QNfEK9N z=a%17N|Te5Q&Tq=7Z-baHVzCtS1OhM9t|;1SxBLf6^g}TjFu<>003=OfR~^YiycM-OFLwr$(X_wUcH7=8E=9RL6TZCrp)p8TX-E^poX z(%ri=YqVbl7ytl(HZH&yFMik6wV|hHez@~p%F000G;c9KGhA%+mTySsPp+_7SGU|`_UzZ^e)`s(DA=l}qK zX7QOBTA@;@6pD@b*!31e3L($at(!Bi?s}(Ess8-aIq3m^002$lJHWI;eKCX-Qc5YL z$4nZ*`5Ia02E-_ZJotNBZWo^A%(R&@SWM;-W(peas5^nvzS?*004jj zOj{|J%Q60Spu2hpKK=E%9k1-WaqV^%vXB~CbOsCn05pwDuxN!sp-?DvOkJPO^Tn?2 z^&!?n3`_eSFNIJHDV@4B{`se0Onh@`{{5kj(a*A2jCo9XLv*vT5J?Aa delta 833 zcmV-H1HSy6Fqkl~z6x(eNkl;XKj`S#nPpj)Wo>QGojiGB zeY93vtk#y6tL4gaxw2eIDHk08002!{fTyN@+Oeapx3~A)xlhiX{kW&6r&KCky*j>s zu>-Hw;7YYJKmSm4002OJMG?@Ls?}FI*R00005n5ML6&+aQ%zF+^jcE;P**7jukjWIp@%u^Br008Q9ZxD@T<0V+@=H}-6 z`(MoS{Kk!+ySuypcO{oft0(|k}XDux)`}V!EurODr{VKo!001;`0ls$a zhmMY&U0u5-Cx6_k_f~6*mFnW}w{M9K005}ZEzmTm+1Uq2kG@l>RK~_G@811?QvJ!7 zMlVYY002;cX-X3l6E|=ERw|Va95@`~Kex3VIWlnO%tveQDTF+w7*b66H(!rQ3;+O7 zfN3Tvq!?ldp|i8|(4m8yM*I5up8U)C^P{(>XG8}80MzH>F*KHPxm+l&#%)(-3@L;> zPxtT5y?*$;a=G&BFXPe!008QL@Eu?pOKl~D6jDklq-`fJJo@w9W2csvt2S}~000G; zW?PYQbv1?66haF1JMhE#Ki(c1zI*3>7PFXH$p8R=0!&kBX=#b^-viyPJMieY;|E_m zcK7y!EMy_AX3-fi006KJmtfIY3WY+U&^mKxHqTc&I@?36g&5X$Y6_to7*e`)ee%oC zznc2)`qGDkts`G#u^981@>S6Rv#}6O2a`Yx1s)CQZvX%Q|NjF3d-#%PfH8t<00000 LNkvXXu0mjfo0*n5 diff --git a/tasks/assignment/assets/assets_assignment_dispatch.py b/tasks/assignment/assets/assets_assignment_dispatch.py index 25758c969..c1965a3f3 100644 --- a/tasks/assignment/assets/assets_assignment_dispatch.py +++ b/tasks/assignment/assets/assets_assignment_dispatch.py @@ -34,40 +34,40 @@ CHARACTER_1 = ButtonWrapper( name='CHARACTER_1', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_1.png', - area=(110, 202, 202, 309), - search=(90, 182, 222, 329), + area=(96, 200, 188, 307), + search=(76, 180, 208, 327), color=(153, 141, 159), - button=(110, 202, 202, 309), + button=(96, 200, 188, 307), ), ) CHARACTER_1_SELECTED = ButtonWrapper( name='CHARACTER_1_SELECTED', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_1_SELECTED.png', - area=(107, 199, 126, 217), - search=(87, 179, 146, 237), + area=(93, 197, 112, 215), + search=(73, 177, 132, 235), color=(217, 218, 216), - button=(107, 199, 126, 217), + button=(93, 197, 112, 215), ), ) CHARACTER_2 = ButtonWrapper( name='CHARACTER_2', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_2.png', - area=(222, 202, 314, 309), - search=(202, 182, 334, 329), + area=(208, 200, 300, 307), + search=(188, 180, 320, 327), color=(120, 120, 138), - button=(222, 202, 314, 309), + button=(208, 200, 300, 307), ), ) CHARACTER_2_SELECTED = ButtonWrapper( name='CHARACTER_2_SELECTED', share=Button( file='./assets/share/assignment/dispatch/CHARACTER_2_SELECTED.png', - area=(219, 199, 238, 217), - search=(199, 179, 258, 237), + area=(205, 197, 224, 215), + search=(185, 177, 244, 235), color=(206, 207, 204), - button=(219, 199, 238, 217), + button=(205, 197, 224, 215), ), ) CHARACTER_LIST = ButtonWrapper( From 092b2e60db5bd199dad15787ccb23be84a59eae5 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 03:01:32 +0800 Subject: [PATCH 02/29] Upd: Assignment resorted in 2.2 (#453) --- dev_tools/keywords/assignment.py | 20 ++ module/config/argument/args.json | 112 ++++---- module/config/config_generated.py | 8 +- module/config/i18n/en-US.json | 112 ++++---- module/config/i18n/es-ES.json | 112 ++++---- module/config/i18n/ja-JP.json | 112 ++++---- module/config/i18n/zh-CN.json | 112 ++++---- module/config/i18n/zh-TW.json | 112 ++++---- tasks/assignment/keywords/entry.py | 274 ++++++++++---------- tasks/assignment/keywords/entry_detailed.py | 274 ++++++++++---------- 10 files changed, 634 insertions(+), 614 deletions(-) diff --git a/dev_tools/keywords/assignment.py b/dev_tools/keywords/assignment.py index 30dadcb25..25d53a3e3 100644 --- a/dev_tools/keywords/assignment.py +++ b/dev_tools/keywords/assignment.py @@ -5,6 +5,22 @@ from dev_tools.keywords.base import UI_LANGUAGES, GenerateKeyword from module.config.utils import deep_get +def resort(dic: dict): + # Poor assigment sort for 2.2 + order = [ + 1008, 1007, 1006, 1005, 1004, 1003, 1002, 1001, + 3001, 2001, 4001, + 5008, 5006, 5005, 5003, 5002, 5007, 5004, 5001, + ] + out = {} + for index in order: + value = dic.pop(index) + out[index] = value + for k, v, in dic.items(): + out[k] = v + return out + + @cache def get_assignment_entry_data(): """ @@ -16,6 +32,9 @@ def get_assignment_entry_data(): deep_get(expedition, 'Name.Hash'): deep_get(expedition, 'ExpeditionID') for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionData.json').values() } + rev = {v: k for k, v in expedition_namehash_to_id.items()} + rev = resort(rev) + expedition_namehash_to_id = {v: k for k, v in rev.items()} expedition_id_to_reward_id = { deep_get(expedition, '4.2.ExpeditionID'): deep_get(expedition, '4.2.RewardID') for expedition in GenerateKeyword.read_file('./ExcelOutput/ExpeditionReward.json').values() @@ -119,5 +138,6 @@ class GenerateAssignmentEventEntry(GenerateKeyword): if __name__ == "__main__": from dev_tools.keywords.base import TextMap + TextMap.DATA_FOLDER = '../StarRailData' GenerateAssignment()() diff --git a/module/config/argument/args.json b/module/config/argument/args.json index b37292f5e..64f0ee68d 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1076,100 +1076,100 @@ "type": "select", "value": "Nameless_Land_Nameless_People", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_2": { "type": "select", "value": "Akashic_Records", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_3": { "type": "select", "value": "The_Invisible_Hand", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Name_4": { "type": "select", "value": "Nine_Billion_Names", "option": [ - "Nine_Billion_Names", - "Destruction_of_the_Destroyer", - "Winter_Soldiers", - "Born_to_Obey", - "Root_Out_the_Turpitude", - "Fire_Lord_Inflames_Blades_of_War", - "A_Startling_Night_Terror", "Tranquility_of_Vimala_bhumi", - "Nameless_Land_Nameless_People", + "A_Startling_Night_Terror", + "Fire_Lord_Inflames_Blades_of_War", + "Root_Out_the_Turpitude", + "Born_to_Obey", + "Winter_Soldiers", + "Destruction_of_the_Destroyer", + "Nine_Billion_Names", "Akashic_Records", + "Nameless_Land_Nameless_People", "The_Invisible_Hand", - "Abandoned_and_Insulted", - "Spring_of_Life", - "The_Land_of_Gold", - "The_Blossom_in_the_Storm", - "Legend_of_the_Puppet_Master", + "Scalpel_and_Screwdriver", "The_Wages_of_Humanity", + "Legend_of_the_Puppet_Master", + "The_Land_of_Gold", + "Spring_of_Life", "Fragments_of_Illusory_Dreams", - "Scalpel_and_Screwdriver" + "The_Blossom_in_the_Storm", + "Abandoned_and_Insulted" ] }, "Duration": { diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 798eff74a..efb301bda 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -119,10 +119,10 @@ class GeneratedConfig: BattlePassStorage_BattlePassQuestTrailblazePower = {} # Group `Assignment` - Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_2 = 'Akashic_Records' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_3 = 'The_Invisible_Hand' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver - Assignment_Name_4 = 'Nine_Billion_Names' # Nine_Billion_Names, Destruction_of_the_Destroyer, Winter_Soldiers, Born_to_Obey, Root_Out_the_Turpitude, Fire_Lord_Inflames_Blades_of_War, A_Startling_Night_Terror, Tranquility_of_Vimala_bhumi, Nameless_Land_Nameless_People, Akashic_Records, The_Invisible_Hand, Abandoned_and_Insulted, Spring_of_Life, The_Land_of_Gold, The_Blossom_in_the_Storm, Legend_of_the_Puppet_Master, The_Wages_of_Humanity, Fragments_of_Illusory_Dreams, Scalpel_and_Screwdriver + Assignment_Name_1 = 'Nameless_Land_Nameless_People' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_2 = 'Akashic_Records' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_3 = 'The_Invisible_Hand' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted + Assignment_Name_4 = 'Nine_Billion_Names' # Tranquility_of_Vimala_bhumi, A_Startling_Night_Terror, Fire_Lord_Inflames_Blades_of_War, Root_Out_the_Turpitude, Born_to_Obey, Winter_Soldiers, Destruction_of_the_Destroyer, Nine_Billion_Names, Akashic_Records, Nameless_Land_Nameless_People, The_Invisible_Hand, Scalpel_and_Screwdriver, The_Wages_of_Humanity, Legend_of_the_Puppet_Master, The_Land_of_Gold, Spring_of_Life, Fragments_of_Illusory_Dreams, The_Blossom_in_the_Storm, Abandoned_and_Insulted Assignment_Duration = 20 # 4, 8, 12, 20 Assignment_Event = True Assignment_Assignment = {} diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index a01b95725..2c6f0adc4 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -809,94 +809,94 @@ "Name_1": { "name": "Assignment 1 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_2": { "name": "Assignment 2 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_3": { "name": "Assignment 3 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Name_4": { "name": "Assignment 4 Preference", "help": "", - "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", - "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", - "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", - "Born_to_Obey": "Ancient Part (Born to Obey)", - "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", - "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", - "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", "Tranquility_of_Vimala_bhumi": "Tatters of Thought (Tranquility of Vimala-bhumi)", - "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", + "A_Startling_Night_Terror": "Dream Collection Component (A Startling Night Terror)", + "Fire_Lord_Inflames_Blades_of_War": "Artifex's Module (Fire Lord Inflames Blades of War)", + "Root_Out_the_Turpitude": "Immortal Scionette (Root Out the Turpitude)", + "Born_to_Obey": "Ancient Part (Born to Obey)", + "Winter_Soldiers": "Silvermane Badge (Winter Soldiers)", + "Destruction_of_the_Destroyer": "Thief's Instinct (Destruction of the Destroyer)", + "Nine_Billion_Names": "Extinguished Core (Nine Billion Names)", "Akashic_Records": "Light Cone EXP Material (Akashic Records)", + "Nameless_Land_Nameless_People": "Character EXP Material (Nameless Land, Nameless People)", "The_Invisible_Hand": "Credit (The Invisible Hand)", - "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)", - "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", - "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", - "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", - "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)", "The_Wages_of_Humanity": "Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)", + "Legend_of_the_Puppet_Master": "Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)", + "The_Land_of_Gold": "Basic Ingredients & Protein Rice (The Land of Gold)", + "Spring_of_Life": "Solid Water & Virtual Particle (Spring of Life)", "Fragments_of_Illusory_Dreams": "Tranquility & Broken Dreams (Fragments of Illusory Dreams)", - "Scalpel_and_Screwdriver": "Rusty Gear & Old Molar (Scalpel and Screwdriver)" + "The_Blossom_in_the_Storm": "Gaseous Liquid & Seed (The Blossom in the Storm)", + "Abandoned_and_Insulted": "Phlogiston & Metal (Abandoned and Insulted)" }, "Duration": { "name": "Dispatch Duration", diff --git a/module/config/i18n/es-ES.json b/module/config/i18n/es-ES.json index 66c665879..058d97844 100644 --- a/module/config/i18n/es-ES.json +++ b/module/config/i18n/es-ES.json @@ -809,94 +809,94 @@ "Name_1": { "name": "Preferencia de Encargo 1", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_2": { "name": "Preferencia de Encargo 2", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_3": { "name": "Preferencia de Encargo 3", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Name_4": { "name": "Preferencia de Encargo 4", "help": "", - "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", - "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", - "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", - "Born_to_Obey": "Componente antiguo (Creados para obedecer)", - "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", - "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", - "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", "Tranquility_of_Vimala_bhumi": "Jirones de pensamientos (Limpieza y purificación)", - "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", + "A_Startling_Night_Terror": "Componente del acumulador de sueños (Pesadilla aterradora)", + "Fire_Lord_Inflames_Blades_of_War": "Componente artificial mecánico (Prendan los fuelles, fundan las armas)", + "Root_Out_the_Turpitude": "Brote verde inmortal (La raíz del mal)", + "Born_to_Obey": "Componente antiguo (Creados para obedecer)", + "Winter_Soldiers": "Pin del guardia (Los guerreros del invierno)", + "Destruction_of_the_Destroyer": "Instinto del ladrón (La destrucción del destructor)", + "Nine_Billion_Names": "Núcleo apagado (Nueve mil millones de nombres)", "Akashic_Records": "Material de EXP de conos de luz (Los Registros de Akasha)", + "Nameless_Land_Nameless_People": "Material de EXP de personaje (Lugar anónimo, personas anónimas)", "The_Invisible_Hand": "Crédito (La mano invisible)", - "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)", - "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", - "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", - "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", - "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)", "The_Wages_of_Humanity": "Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)", + "Legend_of_the_Puppet_Master": "Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)", + "The_Land_of_Gold": "Ingredientes básicos & Arroz proteico (Tierra de oportunidades)", + "Spring_of_Life": "Agua sólida & Partícula virtual (La fuente de la vida)", "Fragments_of_Illusory_Dreams": "Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)", - "Scalpel_and_Screwdriver": "Engranaje oxidado & Muela vieja (Bisturí y destornillador)" + "The_Blossom_in_the_Storm": "Líquido gaseoso & Semilla (Flores en la tormenta)", + "Abandoned_and_Insulted": "Flogisto & Metal (Abandonado e insultado)" }, "Duration": { "name": "Duración del encargo", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 82f69b042..436e36592 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -809,94 +809,94 @@ "Name_1": { "name": "依頼 1", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_2": { "name": "依頼 2", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_3": { "name": "依頼 3", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Name_4": { "name": "依頼 4", "help": "", - "Nine_Billion_Names": "消滅した原核(九十億の御名)", - "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", - "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", - "Born_to_Obey": "古代パーツ(生まれながらに服従する)", - "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", - "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", - "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", "Tranquility_of_Vimala_bhumi": "思考の粉末(離垢清浄)", - "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", + "A_Startling_Night_Terror": "ドリームコレクションパーツ(魂震える悪夢)", + "Fire_Lord_Inflames_Blades_of_War": "工造機関(剣戟を焼却する火帝炉)", + "Root_Out_the_Turpitude": "永寿の萌芽(悪孽を根絶やしに)", + "Born_to_Obey": "古代パーツ(生まれながらに服従する)", + "Winter_Soldiers": "シルバーメインの釦(寒冬の戦士たち)", + "Destruction_of_the_Destroyer": "略奪の本能(壊滅者の覆没)", + "Nine_Billion_Names": "消滅した原核(九十億の御名)", "Akashic_Records": "光円錐経験値素材(アーカーシャの記録)", + "Nameless_Land_Nameless_People": "キャラクター経験値素材(無名の地、無名の人)", "The_Invisible_Hand": "信用ポイント(見えざる手)", - "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)", - "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", - "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", - "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", - "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)", "The_Wages_of_Humanity": "一人稲 & 薬草抽出物(人類扶養)", + "Legend_of_the_Puppet_Master": "廃棄された機巧部品 & 玉兆単元(傀儡師伝説)", + "The_Land_of_Gold": "基本食材 & タンパク米(黄金の大地)", + "Spring_of_Life": "固形純水 & 仮想粒子(生命の泉)", "Fragments_of_Illusory_Dreams": "安逸 & 砕けた夢(幻夢の残片)", - "Scalpel_and_Screwdriver": "錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)" + "The_Blossom_in_the_Storm": "気態流体 & 種子(嵐の中で咲き誇る花)", + "Abandoned_and_Insulted": "燃素 & 金属(捨てられしものと傷つけられしもの)" }, "Duration": { "name": "派遣時間", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 37b6e7e84..a0a857a7a 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -809,94 +809,94 @@ "Name_1": { "name": "第1个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_2": { "name": "第2个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_3": { "name": "第3个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Name_4": { "name": "第4个委托选择", "help": "", - "Nine_Billion_Names": "熄灭原核(九十亿个名字)", - "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", - "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", - "Born_to_Obey": "古代零件(生而服从)", - "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", - "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", "Tranquility_of_Vimala_bhumi": "思绪末屑(离垢清净)", - "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", + "A_Startling_Night_Terror": "蓄梦元件(劫梦惊魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造机杼(火帝动炉销剑戟)", + "Root_Out_the_Turpitude": "永寿幼芽(根除恶孽)", + "Born_to_Obey": "古代零件(生而服从)", + "Winter_Soldiers": "铁卫扣饰(寒冬的战士们)", + "Destruction_of_the_Destroyer": "掠夺的本能(毁灭者的覆灭)", + "Nine_Billion_Names": "熄灭原核(九十亿个名字)", "Akashic_Records": "光锥经验材料(阿卡夏记录)", + "Nameless_Land_Nameless_People": "角色经验材料(无名之地,无名之人)", "The_Invisible_Hand": "信用点(看不见的手)", - "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)", - "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", - "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", - "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)", "The_Wages_of_Humanity": "一人嘉禾 & 药草提取物(赡养人类)", + "Legend_of_the_Puppet_Master": "废弃机巧零件 & 玉兆单元(偃师传说)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黄金大地)", + "Spring_of_Life": "固态净水 & 虚粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎梦(幻梦的残片)", - "Scalpel_and_Screwdriver": "锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)" + "The_Blossom_in_the_Storm": "气态流体 & 种子(风暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金属(被废弃与损害的)" }, "Duration": { "name": "派遣时长", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index b7e6c08ca..f3eb18c55 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -809,94 +809,94 @@ "Name_1": { "name": "第1個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_2": { "name": "第2個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_3": { "name": "第3個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Name_4": { "name": "第4個委託選擇", "help": "", - "Nine_Billion_Names": "熄滅原核(九十億個名字)", - "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", - "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", - "Born_to_Obey": "古代零件(生而服從)", - "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", - "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", - "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", "Tranquility_of_Vimala_bhumi": "思緒末屑(離垢清淨)", - "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", + "A_Startling_Night_Terror": "蓄夢元件(劫夢驚魂)", + "Fire_Lord_Inflames_Blades_of_War": "工造機杼(火帝動爐銷劍戟)", + "Root_Out_the_Turpitude": "永壽幼芽(根除惡孽)", + "Born_to_Obey": "古代零件(生而服從)", + "Winter_Soldiers": "鐵衛扣飾(寒冬的戰士們)", + "Destruction_of_the_Destroyer": "掠奪的本能(毀滅者的覆滅)", + "Nine_Billion_Names": "熄滅原核(九十億個名字)", "Akashic_Records": "光錐經驗素材(阿卡夏紀錄)", + "Nameless_Land_Nameless_People": "角色經驗素材(無名之地,無名之人)", "The_Invisible_Hand": "信用點(看不見的手)", - "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)", - "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", - "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", - "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", - "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)", "The_Wages_of_Humanity": "一人嘉禾 & 藥草萃取物(贍養人類)", + "Legend_of_the_Puppet_Master": "廢棄機巧零件 & 玉兆單元(偃師傳說)", + "The_Land_of_Gold": "基本食材 & 蛋白米(黃金大地)", + "Spring_of_Life": "固態淨水 & 虛粒子(生命之泉)", "Fragments_of_Illusory_Dreams": "安逸 & 碎夢(幻夢的殘片)", - "Scalpel_and_Screwdriver": "鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)" + "The_Blossom_in_the_Storm": "氣態流體 & 種子(風暴中怒放的花)", + "Abandoned_and_Insulted": "燃素 & 金屬(被廢棄與損害的)" }, "Duration": { "name": "派遣時間", diff --git a/tasks/assignment/keywords/entry.py b/tasks/assignment/keywords/entry.py index cab71c000..49fc7f34b 100644 --- a/tasks/assignment/keywords/entry.py +++ b/tasks/assignment/keywords/entry.py @@ -3,71 +3,8 @@ from .classes import AssignmentEntry # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Nine_Billion_Names = AssignmentEntry( - id=1, - name='Nine_Billion_Names', - cn='九十亿个名字', - cht='九十億個名字', - en='Nine Billion Names', - jp='九十億の御名', - es='Nueve mil millones de nombres', -) -Destruction_of_the_Destroyer = AssignmentEntry( - id=2, - name='Destruction_of_the_Destroyer', - cn='毁灭者的覆灭', - cht='毀滅者的覆滅', - en='Destruction of the Destroyer', - jp='壊滅者の覆没', - es='La destrucción del destructor', -) -Winter_Soldiers = AssignmentEntry( - id=3, - name='Winter_Soldiers', - cn='寒冬的战士们', - cht='寒冬的戰士們', - en='Winter Soldiers', - jp='寒冬の戦士たち', - es='Los guerreros del invierno', -) -Born_to_Obey = AssignmentEntry( - id=4, - name='Born_to_Obey', - cn='生而服从', - cht='生而服從', - en='Born to Obey', - jp='生まれながらに服従する', - es='Creados para obedecer', -) -Root_Out_the_Turpitude = AssignmentEntry( - id=5, - name='Root_Out_the_Turpitude', - cn='根除恶孽', - cht='根除惡孽', - en='Root Out the Turpitude', - jp='悪孽を根絶やしに', - es='La raíz del mal', -) -Fire_Lord_Inflames_Blades_of_War = AssignmentEntry( - id=6, - name='Fire_Lord_Inflames_Blades_of_War', - cn='火帝动炉销剑戟', - cht='火帝動爐銷劍戟', - en='Fire Lord Inflames Blades of War', - jp='剣戟を焼却する火帝炉', - es='Prendan los fuelles, fundan las armas', -) -A_Startling_Night_Terror = AssignmentEntry( - id=7, - name='A_Startling_Night_Terror', - cn='劫梦惊魂', - cht='劫夢驚魂', - en='A Startling Night Terror', - jp='魂震える悪夢', - es='Pesadilla aterradora', -) Tranquility_of_Vimala_bhumi = AssignmentEntry( - id=8, + id=1, name='Tranquility_of_Vimala_bhumi', cn='离垢清净', cht='離垢清淨', @@ -75,17 +12,71 @@ Tranquility_of_Vimala_bhumi = AssignmentEntry( jp='離垢清浄', es='Limpieza y purificación', ) -Nameless_Land_Nameless_People = AssignmentEntry( - id=9, - name='Nameless_Land_Nameless_People', - cn='无名之地,无名之人', - cht='無名之地,無名之人', - en='Nameless Land, Nameless People', - jp='無名の地、無名の人', - es='Lugar anónimo, personas anónimas', +A_Startling_Night_Terror = AssignmentEntry( + id=2, + name='A_Startling_Night_Terror', + cn='劫梦惊魂', + cht='劫夢驚魂', + en='A Startling Night Terror', + jp='魂震える悪夢', + es='Pesadilla aterradora', +) +Fire_Lord_Inflames_Blades_of_War = AssignmentEntry( + id=3, + name='Fire_Lord_Inflames_Blades_of_War', + cn='火帝动炉销剑戟', + cht='火帝動爐銷劍戟', + en='Fire Lord Inflames Blades of War', + jp='剣戟を焼却する火帝炉', + es='Prendan los fuelles, fundan las armas', +) +Root_Out_the_Turpitude = AssignmentEntry( + id=4, + name='Root_Out_the_Turpitude', + cn='根除恶孽', + cht='根除惡孽', + en='Root Out the Turpitude', + jp='悪孽を根絶やしに', + es='La raíz del mal', +) +Born_to_Obey = AssignmentEntry( + id=5, + name='Born_to_Obey', + cn='生而服从', + cht='生而服從', + en='Born to Obey', + jp='生まれながらに服従する', + es='Creados para obedecer', +) +Winter_Soldiers = AssignmentEntry( + id=6, + name='Winter_Soldiers', + cn='寒冬的战士们', + cht='寒冬的戰士們', + en='Winter Soldiers', + jp='寒冬の戦士たち', + es='Los guerreros del invierno', +) +Destruction_of_the_Destroyer = AssignmentEntry( + id=7, + name='Destruction_of_the_Destroyer', + cn='毁灭者的覆灭', + cht='毀滅者的覆滅', + en='Destruction of the Destroyer', + jp='壊滅者の覆没', + es='La destrucción del destructor', +) +Nine_Billion_Names = AssignmentEntry( + id=8, + name='Nine_Billion_Names', + cn='九十亿个名字', + cht='九十億個名字', + en='Nine Billion Names', + jp='九十億の御名', + es='Nueve mil millones de nombres', ) Akashic_Records = AssignmentEntry( - id=10, + id=9, name='Akashic_Records', cn='阿卡夏记录', cht='阿卡夏紀錄', @@ -93,6 +84,15 @@ Akashic_Records = AssignmentEntry( jp='アーカーシャの記録', es='Los Registros de Akasha', ) +Nameless_Land_Nameless_People = AssignmentEntry( + id=10, + name='Nameless_Land_Nameless_People', + cn='无名之地,无名之人', + cht='無名之地,無名之人', + en='Nameless Land, Nameless People', + jp='無名の地、無名の人', + es='Lugar anónimo, personas anónimas', +) The_Invisible_Hand = AssignmentEntry( id=11, name='The_Invisible_Hand', @@ -102,71 +102,8 @@ The_Invisible_Hand = AssignmentEntry( jp='見えざる手', es='La mano invisible', ) -Abandoned_and_Insulted = AssignmentEntry( - id=12, - name='Abandoned_and_Insulted', - cn='被废弃与损害的', - cht='被廢棄與損害的', - en='Abandoned and Insulted', - jp='捨てられしものと傷つけられしもの', - es='Abandonado e insultado', -) -Spring_of_Life = AssignmentEntry( - id=13, - name='Spring_of_Life', - cn='生命之泉', - cht='生命之泉', - en='Spring of Life', - jp='生命の泉', - es='La fuente de la vida', -) -The_Land_of_Gold = AssignmentEntry( - id=14, - name='The_Land_of_Gold', - cn='黄金大地', - cht='黃金大地', - en='The Land of Gold', - jp='黄金の大地', - es='Tierra de oportunidades', -) -The_Blossom_in_the_Storm = AssignmentEntry( - id=15, - name='The_Blossom_in_the_Storm', - cn='风暴中怒放的花', - cht='風暴中怒放的花', - en='The Blossom in the Storm', - jp='嵐の中で咲き誇る花', - es='Flores en la tormenta', -) -Legend_of_the_Puppet_Master = AssignmentEntry( - id=16, - name='Legend_of_the_Puppet_Master', - cn='偃师传说', - cht='偃師傳說', - en='Legend of the Puppet Master', - jp='傀儡師伝説', - es='La leyenda del titiritero', -) -The_Wages_of_Humanity = AssignmentEntry( - id=17, - name='The_Wages_of_Humanity', - cn='赡养人类', - cht='贍養人類', - en='The Wages of Humanity', - jp='人類扶養', - es='La paga de la humanidad', -) -Fragments_of_Illusory_Dreams = AssignmentEntry( - id=18, - name='Fragments_of_Illusory_Dreams', - cn='幻梦的残片', - cht='幻夢的殘片', - en='Fragments of Illusory Dreams', - jp='幻夢の残片', - es='Fragmentos de sueños ilusorios', -) Scalpel_and_Screwdriver = AssignmentEntry( - id=19, + id=12, name='Scalpel_and_Screwdriver', cn='手术刀与螺丝刀', cht='手術刀與螺絲起子', @@ -174,3 +111,66 @@ Scalpel_and_Screwdriver = AssignmentEntry( jp='メスとスクリュードライバー', es='Bisturí y destornillador', ) +The_Wages_of_Humanity = AssignmentEntry( + id=13, + name='The_Wages_of_Humanity', + cn='赡养人类', + cht='贍養人類', + en='The Wages of Humanity', + jp='人類扶養', + es='La paga de la humanidad', +) +Legend_of_the_Puppet_Master = AssignmentEntry( + id=14, + name='Legend_of_the_Puppet_Master', + cn='偃师传说', + cht='偃師傳說', + en='Legend of the Puppet Master', + jp='傀儡師伝説', + es='La leyenda del titiritero', +) +The_Land_of_Gold = AssignmentEntry( + id=15, + name='The_Land_of_Gold', + cn='黄金大地', + cht='黃金大地', + en='The Land of Gold', + jp='黄金の大地', + es='Tierra de oportunidades', +) +Spring_of_Life = AssignmentEntry( + id=16, + name='Spring_of_Life', + cn='生命之泉', + cht='生命之泉', + en='Spring of Life', + jp='生命の泉', + es='La fuente de la vida', +) +Fragments_of_Illusory_Dreams = AssignmentEntry( + id=17, + name='Fragments_of_Illusory_Dreams', + cn='幻梦的残片', + cht='幻夢的殘片', + en='Fragments of Illusory Dreams', + jp='幻夢の残片', + es='Fragmentos de sueños ilusorios', +) +The_Blossom_in_the_Storm = AssignmentEntry( + id=18, + name='The_Blossom_in_the_Storm', + cn='风暴中怒放的花', + cht='風暴中怒放的花', + en='The Blossom in the Storm', + jp='嵐の中で咲き誇る花', + es='Flores en la tormenta', +) +Abandoned_and_Insulted = AssignmentEntry( + id=19, + name='Abandoned_and_Insulted', + cn='被废弃与损害的', + cht='被廢棄與損害的', + en='Abandoned and Insulted', + jp='捨てられしものと傷つけられしもの', + es='Abandonado e insultado', +) diff --git a/tasks/assignment/keywords/entry_detailed.py b/tasks/assignment/keywords/entry_detailed.py index 418e8f578..f295f67e7 100644 --- a/tasks/assignment/keywords/entry_detailed.py +++ b/tasks/assignment/keywords/entry_detailed.py @@ -3,71 +3,8 @@ from .classes import AssignmentEntryDetailed # This file was auto-generated, do not modify it manually. To generate: # ``` python -m dev_tools.keyword_extract ``` -Nine_Billion_Names = AssignmentEntryDetailed( - id=1, - name='Nine_Billion_Names', - cn='熄灭原核(九十亿个名字)', - cht='熄滅原核(九十億個名字)', - en='Extinguished Core (Nine Billion Names)', - jp='消滅した原核(九十億の御名)', - es='Núcleo apagado (Nueve mil millones de nombres)', -) -Destruction_of_the_Destroyer = AssignmentEntryDetailed( - id=2, - name='Destruction_of_the_Destroyer', - cn='掠夺的本能(毁灭者的覆灭)', - cht='掠奪的本能(毀滅者的覆滅)', - en="Thief's Instinct (Destruction of the Destroyer)", - jp='略奪の本能(壊滅者の覆没)', - es='Instinto del ladrón (La destrucción del destructor)', -) -Winter_Soldiers = AssignmentEntryDetailed( - id=3, - name='Winter_Soldiers', - cn='铁卫扣饰(寒冬的战士们)', - cht='鐵衛扣飾(寒冬的戰士們)', - en='Silvermane Badge (Winter Soldiers)', - jp='シルバーメインの釦(寒冬の戦士たち)', - es='Pin del guardia (Los guerreros del invierno)', -) -Born_to_Obey = AssignmentEntryDetailed( - id=4, - name='Born_to_Obey', - cn='古代零件(生而服从)', - cht='古代零件(生而服從)', - en='Ancient Part (Born to Obey)', - jp='古代パーツ(生まれながらに服従する)', - es='Componente antiguo (Creados para obedecer)', -) -Root_Out_the_Turpitude = AssignmentEntryDetailed( - id=5, - name='Root_Out_the_Turpitude', - cn='永寿幼芽(根除恶孽)', - cht='永壽幼芽(根除惡孽)', - en='Immortal Scionette (Root Out the Turpitude)', - jp='永寿の萌芽(悪孽を根絶やしに)', - es='Brote verde inmortal (La raíz del mal)', -) -Fire_Lord_Inflames_Blades_of_War = AssignmentEntryDetailed( - id=6, - name='Fire_Lord_Inflames_Blades_of_War', - cn='工造机杼(火帝动炉销剑戟)', - cht='工造機杼(火帝動爐銷劍戟)', - en="Artifex's Module (Fire Lord Inflames Blades of War)", - jp='工造機関(剣戟を焼却する火帝炉)', - es='Componente artificial mecánico (Prendan los fuelles, fundan las armas)', -) -A_Startling_Night_Terror = AssignmentEntryDetailed( - id=7, - name='A_Startling_Night_Terror', - cn='蓄梦元件(劫梦惊魂)', - cht='蓄夢元件(劫夢驚魂)', - en='Dream Collection Component (A Startling Night Terror)', - jp='ドリームコレクションパーツ(魂震える悪夢)', - es='Componente del acumulador de sueños (Pesadilla aterradora)', -) Tranquility_of_Vimala_bhumi = AssignmentEntryDetailed( - id=8, + id=1, name='Tranquility_of_Vimala_bhumi', cn='思绪末屑(离垢清净)', cht='思緒末屑(離垢清淨)', @@ -75,17 +12,71 @@ Tranquility_of_Vimala_bhumi = AssignmentEntryDetailed( jp='思考の粉末(離垢清浄)', es='Jirones de pensamientos (Limpieza y purificación)', ) -Nameless_Land_Nameless_People = AssignmentEntryDetailed( - id=9, - name='Nameless_Land_Nameless_People', - cn='角色经验材料(无名之地,无名之人)', - cht='角色經驗素材(無名之地,無名之人)', - en='Character EXP Material (Nameless Land, Nameless People)', - jp='キャラクター経験値素材(無名の地、無名の人)', - es='Material de EXP de personaje (Lugar anónimo, personas anónimas)', +A_Startling_Night_Terror = AssignmentEntryDetailed( + id=2, + name='A_Startling_Night_Terror', + cn='蓄梦元件(劫梦惊魂)', + cht='蓄夢元件(劫夢驚魂)', + en='Dream Collection Component (A Startling Night Terror)', + jp='ドリームコレクションパーツ(魂震える悪夢)', + es='Componente del acumulador de sueños (Pesadilla aterradora)', +) +Fire_Lord_Inflames_Blades_of_War = AssignmentEntryDetailed( + id=3, + name='Fire_Lord_Inflames_Blades_of_War', + cn='工造机杼(火帝动炉销剑戟)', + cht='工造機杼(火帝動爐銷劍戟)', + en="Artifex's Module (Fire Lord Inflames Blades of War)", + jp='工造機関(剣戟を焼却する火帝炉)', + es='Componente artificial mecánico (Prendan los fuelles, fundan las armas)', +) +Root_Out_the_Turpitude = AssignmentEntryDetailed( + id=4, + name='Root_Out_the_Turpitude', + cn='永寿幼芽(根除恶孽)', + cht='永壽幼芽(根除惡孽)', + en='Immortal Scionette (Root Out the Turpitude)', + jp='永寿の萌芽(悪孽を根絶やしに)', + es='Brote verde inmortal (La raíz del mal)', +) +Born_to_Obey = AssignmentEntryDetailed( + id=5, + name='Born_to_Obey', + cn='古代零件(生而服从)', + cht='古代零件(生而服從)', + en='Ancient Part (Born to Obey)', + jp='古代パーツ(生まれながらに服従する)', + es='Componente antiguo (Creados para obedecer)', +) +Winter_Soldiers = AssignmentEntryDetailed( + id=6, + name='Winter_Soldiers', + cn='铁卫扣饰(寒冬的战士们)', + cht='鐵衛扣飾(寒冬的戰士們)', + en='Silvermane Badge (Winter Soldiers)', + jp='シルバーメインの釦(寒冬の戦士たち)', + es='Pin del guardia (Los guerreros del invierno)', +) +Destruction_of_the_Destroyer = AssignmentEntryDetailed( + id=7, + name='Destruction_of_the_Destroyer', + cn='掠夺的本能(毁灭者的覆灭)', + cht='掠奪的本能(毀滅者的覆滅)', + en="Thief's Instinct (Destruction of the Destroyer)", + jp='略奪の本能(壊滅者の覆没)', + es='Instinto del ladrón (La destrucción del destructor)', +) +Nine_Billion_Names = AssignmentEntryDetailed( + id=8, + name='Nine_Billion_Names', + cn='熄灭原核(九十亿个名字)', + cht='熄滅原核(九十億個名字)', + en='Extinguished Core (Nine Billion Names)', + jp='消滅した原核(九十億の御名)', + es='Núcleo apagado (Nueve mil millones de nombres)', ) Akashic_Records = AssignmentEntryDetailed( - id=10, + id=9, name='Akashic_Records', cn='光锥经验材料(阿卡夏记录)', cht='光錐經驗素材(阿卡夏紀錄)', @@ -93,6 +84,15 @@ Akashic_Records = AssignmentEntryDetailed( jp='光円錐経験値素材(アーカーシャの記録)', es='Material de EXP de conos de luz (Los Registros de Akasha)', ) +Nameless_Land_Nameless_People = AssignmentEntryDetailed( + id=10, + name='Nameless_Land_Nameless_People', + cn='角色经验材料(无名之地,无名之人)', + cht='角色經驗素材(無名之地,無名之人)', + en='Character EXP Material (Nameless Land, Nameless People)', + jp='キャラクター経験値素材(無名の地、無名の人)', + es='Material de EXP de personaje (Lugar anónimo, personas anónimas)', +) The_Invisible_Hand = AssignmentEntryDetailed( id=11, name='The_Invisible_Hand', @@ -102,71 +102,8 @@ The_Invisible_Hand = AssignmentEntryDetailed( jp='信用ポイント(見えざる手)', es='Crédito (La mano invisible)', ) -Abandoned_and_Insulted = AssignmentEntryDetailed( - id=12, - name='Abandoned_and_Insulted', - cn='燃素 & 金属(被废弃与损害的)', - cht='燃素 & 金屬(被廢棄與損害的)', - en='Phlogiston & Metal (Abandoned and Insulted)', - jp='燃素 & 金属(捨てられしものと傷つけられしもの)', - es='Flogisto & Metal (Abandonado e insultado)', -) -Spring_of_Life = AssignmentEntryDetailed( - id=13, - name='Spring_of_Life', - cn='固态净水 & 虚粒子(生命之泉)', - cht='固態淨水 & 虛粒子(生命之泉)', - en='Solid Water & Virtual Particle (Spring of Life)', - jp='固形純水 & 仮想粒子(生命の泉)', - es='Agua sólida & Partícula virtual (La fuente de la vida)', -) -The_Land_of_Gold = AssignmentEntryDetailed( - id=14, - name='The_Land_of_Gold', - cn='基本食材 & 蛋白米(黄金大地)', - cht='基本食材 & 蛋白米(黃金大地)', - en='Basic Ingredients & Protein Rice (The Land of Gold)', - jp='基本食材 & タンパク米(黄金の大地)', - es='Ingredientes básicos & Arroz proteico (Tierra de oportunidades)', -) -The_Blossom_in_the_Storm = AssignmentEntryDetailed( - id=15, - name='The_Blossom_in_the_Storm', - cn='气态流体 & 种子(风暴中怒放的花)', - cht='氣態流體 & 種子(風暴中怒放的花)', - en='Gaseous Liquid & Seed (The Blossom in the Storm)', - jp='気態流体 & 種子(嵐の中で咲き誇る花)', - es='Líquido gaseoso & Semilla (Flores en la tormenta)', -) -Legend_of_the_Puppet_Master = AssignmentEntryDetailed( - id=16, - name='Legend_of_the_Puppet_Master', - cn='废弃机巧零件 & 玉兆单元(偃师传说)', - cht='廢棄機巧零件 & 玉兆單元(偃師傳說)', - en='Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)', - jp='廃棄された機巧部品 & 玉兆単元(傀儡師伝説)', - es='Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)', -) -The_Wages_of_Humanity = AssignmentEntryDetailed( - id=17, - name='The_Wages_of_Humanity', - cn='一人嘉禾 & 药草提取物(赡养人类)', - cht='一人嘉禾 & 藥草萃取物(贍養人類)', - en='Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)', - jp='一人稲 & 薬草抽出物(人類扶養)', - es='Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)', -) -Fragments_of_Illusory_Dreams = AssignmentEntryDetailed( - id=18, - name='Fragments_of_Illusory_Dreams', - cn='安逸 & 碎梦(幻梦的残片)', - cht='安逸 & 碎夢(幻夢的殘片)', - en='Tranquility & Broken Dreams (Fragments of Illusory Dreams)', - jp='安逸 & 砕けた夢(幻夢の残片)', - es='Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)', -) Scalpel_and_Screwdriver = AssignmentEntryDetailed( - id=19, + id=12, name='Scalpel_and_Screwdriver', cn='锈迹齿轮 & 老旧臼齿(手术刀与螺丝刀)', cht='鏽跡齒輪 & 老舊臼齒(手術刀與螺絲起子)', @@ -174,3 +111,66 @@ Scalpel_and_Screwdriver = AssignmentEntryDetailed( jp='錆びた歯車 & 古びた大臼歯(メスとスクリュードライバー)', es='Engranaje oxidado & Muela vieja (Bisturí y destornillador)', ) +The_Wages_of_Humanity = AssignmentEntryDetailed( + id=13, + name='The_Wages_of_Humanity', + cn='一人嘉禾 & 药草提取物(赡养人类)', + cht='一人嘉禾 & 藥草萃取物(贍養人類)', + en='Human-Height Auspicious Crops & Extract of Medicinal Herbs (The Wages of Humanity)', + jp='一人稲 & 薬草抽出物(人類扶養)', + es='Cosecha tan alta como una persona & Extracto de hierbas medicinales (La paga de la humanidad)', +) +Legend_of_the_Puppet_Master = AssignmentEntryDetailed( + id=14, + name='Legend_of_the_Puppet_Master', + cn='废弃机巧零件 & 玉兆单元(偃师传说)', + cht='廢棄機巧零件 & 玉兆單元(偃師傳說)', + en='Discarded Ingenium Parts & Jade Abacus Unit (Legend of the Puppet Master)', + jp='廃棄された機巧部品 & 玉兆単元(傀儡師伝説)', + es='Componentes mecánicos abandonados & Unidad de ábaco de jade (La leyenda del titiritero)', +) +The_Land_of_Gold = AssignmentEntryDetailed( + id=15, + name='The_Land_of_Gold', + cn='基本食材 & 蛋白米(黄金大地)', + cht='基本食材 & 蛋白米(黃金大地)', + en='Basic Ingredients & Protein Rice (The Land of Gold)', + jp='基本食材 & タンパク米(黄金の大地)', + es='Ingredientes básicos & Arroz proteico (Tierra de oportunidades)', +) +Spring_of_Life = AssignmentEntryDetailed( + id=16, + name='Spring_of_Life', + cn='固态净水 & 虚粒子(生命之泉)', + cht='固態淨水 & 虛粒子(生命之泉)', + en='Solid Water & Virtual Particle (Spring of Life)', + jp='固形純水 & 仮想粒子(生命の泉)', + es='Agua sólida & Partícula virtual (La fuente de la vida)', +) +Fragments_of_Illusory_Dreams = AssignmentEntryDetailed( + id=17, + name='Fragments_of_Illusory_Dreams', + cn='安逸 & 碎梦(幻梦的残片)', + cht='安逸 & 碎夢(幻夢的殘片)', + en='Tranquility & Broken Dreams (Fragments of Illusory Dreams)', + jp='安逸 & 砕けた夢(幻夢の残片)', + es='Tranquilidad & Sueños rotos (Fragmentos de sueños ilusorios)', +) +The_Blossom_in_the_Storm = AssignmentEntryDetailed( + id=18, + name='The_Blossom_in_the_Storm', + cn='气态流体 & 种子(风暴中怒放的花)', + cht='氣態流體 & 種子(風暴中怒放的花)', + en='Gaseous Liquid & Seed (The Blossom in the Storm)', + jp='気態流体 & 種子(嵐の中で咲き誇る花)', + es='Líquido gaseoso & Semilla (Flores en la tormenta)', +) +Abandoned_and_Insulted = AssignmentEntryDetailed( + id=19, + name='Abandoned_and_Insulted', + cn='燃素 & 金属(被废弃与损害的)', + cht='燃素 & 金屬(被廢棄與損害的)', + en='Phlogiston & Metal (Abandoned and Insulted)', + jp='燃素 & 金属(捨てられしものと傷つけられしもの)', + es='Flogisto & Metal (Abandonado e insultado)', +) From eb920b7fecba5888144afc0937f923c6ee3b3d32 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 12:34:36 +0800 Subject: [PATCH 03/29] Add: [ALAS] Button.match_template_binary() --- module/base/button.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/module/base/button.py b/module/base/button.py index cae5fc18e..153df61df 100644 --- a/module/base/button.py +++ b/module/base/button.py @@ -55,8 +55,13 @@ class Button(Resource): def image(self): return load_image(self.file, self.area) + @cached_property + def image_binary(self): + return rgb2gray(self.image) + def resource_release(self): del_cached_property(self, 'image') + del_cached_property(self, 'image_binary') self.clear_offset() def __str__(self): @@ -113,6 +118,29 @@ class Button(Resource): self._button_offset = np.array(point) + self.search[:2] - self.area[:2] return sim > similarity + def match_template_binary(self, image, similarity=0.85, direct_match=False) -> bool: + """ + Detects assets by template matching. + + To Some buttons, its location may not be static, `_button_offset` will be set. + + Args: + image: Screenshot. + similarity (float): 0-1. + direct_match: True to ignore `self.search` + + Returns: + bool. + """ + if not direct_match: + image = crop(image, self.search, copy=False) + image = rgb2gray(image) + res = cv2.matchTemplate(self.image_binary, image, cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + self._button_offset = np.array(point) + self.search[:2] - self.area[:2] + return sim > similarity + def match_multi_template(self, image, similarity=0.85, direct_match=False): """ Detects assets by template matching, return multiple reults @@ -225,6 +253,13 @@ class ButtonWrapper(Resource): return True return False + def match_template_binary(self, image, similarity=0.85, direct_match=False) -> bool: + for assets in self.buttons: + if assets.match_template_binary(image, similarity=similarity, direct_match=direct_match): + self._matched_button = assets + return True + return False + def match_multi_template(self, image, similarity=0.85, threshold=5, direct_match=False): """ Detects assets by template matching, return multiple results From 3018449c9c8d9cd5899947824b08af2b31acc072 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 12:36:11 +0800 Subject: [PATCH 04/29] Fix: Match binary template on MAIN_GOTO_CHARACTER and MAP_EXIT --- assets/share/base/page/MAP_EXIT.2.png | Bin 0 -> 6491 bytes tasks/base/assets/assets_base_page.py | 23 ++++-- tasks/base/main_page.py | 52 +------------- tasks/base/ui.py | 99 +++++++++++++++++++++++--- tasks/daily/trail.py | 3 +- tasks/forgotten_hall/ui.py | 3 +- tasks/rogue/entry/entry.py | 3 +- 7 files changed, 112 insertions(+), 71 deletions(-) create mode 100644 assets/share/base/page/MAP_EXIT.2.png diff --git a/assets/share/base/page/MAP_EXIT.2.png b/assets/share/base/page/MAP_EXIT.2.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4dcb099bc3cd4deaadb502939cc8b93a2957fa GIT binary patch literal 6491 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 Q>CYh#?(1pRsM|&T2P}Y=>;M1& literal 0 HcmV?d00001 diff --git a/tasks/base/assets/assets_base_page.py b/tasks/base/assets/assets_base_page.py index 0bb0d9dde..c43a575ae 100644 --- a/tasks/base/assets/assets_base_page.py +++ b/tasks/base/assets/assets_base_page.py @@ -280,13 +280,22 @@ MAP_CHECK = ButtonWrapper( ) MAP_EXIT = ButtonWrapper( name='MAP_EXIT', - share=Button( - file='./assets/share/base/page/MAP_EXIT.png', - area=(27, 46, 44, 74), - search=(7, 26, 64, 94), - color=(142, 144, 148), - button=(27, 46, 44, 74), - ), + share=[ + Button( + file='./assets/share/base/page/MAP_EXIT.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(142, 144, 148), + button=(27, 46, 44, 74), + ), + Button( + file='./assets/share/base/page/MAP_EXIT.2.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(160, 187, 206), + button=(27, 46, 44, 74), + ), + ], ) MAP_GOTO_WORLD = ButtonWrapper( name='MAP_GOTO_WORLD', diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index acd41fdcd..93f514aa7 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -5,11 +5,9 @@ from module.config.server import VALID_LANG from module.exception import RequestHumanTakeover, ScriptError from module.logger import logger from module.ocr.ocr import OcrWhiteLetterOnComplexBackground -from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME, ROGUE_LEAVE_FOR_NOW -from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT -from tasks.base.page import Page, page_gacha, page_main +from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME +from tasks.base.page import Page, page_main from tasks.base.popup import PopupHandler -from tasks.daily.assets.assets_daily_trial import START_TRIAL from tasks.map.keywords import KEYWORDS_MAP_PLANE, MapPlane @@ -158,49 +156,3 @@ class MainPage(PopupHandler): self.handle_lang_check(page=page_main) return True - - def ui_leave_special(self): - """ - Leave from: - - Rogue domains - - Character trials - - Returns: - bool: If left a special plane - - Pages: - in: Any - out: page_main - """ - if not self.appear(MAP_EXIT): - return False - - logger.info('UI leave special') - skip_first_screenshot = True - clicked = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - # End - if clicked: - if self.appear(page_main.check_button): - logger.info(f'Leave to {page_main}') - break - - if self.appear_then_click(MAP_EXIT, interval=2): - continue - if self.handle_popup_confirm(): - continue - if self.match_template_color(START_TRIAL, interval=2): - logger.info(f'{START_TRIAL} -> {CLOSE}') - self.device.click(CLOSE) - clicked = True - continue - if self.handle_ui_close(page_gacha.check_button, interval=2): - continue - if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): - clicked = True - continue diff --git a/tasks/base/ui.py b/tasks/base/ui.py index 09d18db42..0c159cce3 100644 --- a/tasks/base/ui.py +++ b/tasks/base/ui.py @@ -4,13 +4,14 @@ from module.base.timer import Timer from module.exception import GameNotRunningError, GamePageUnknownError from module.logger import logger from module.ocr.ocr import Ocr -from tasks.base.assets.assets_base_page import MAP_EXIT +from tasks.base.assets.assets_base_main_page import ROGUE_LEAVE_FOR_NOW +from tasks.base.assets.assets_base_page import CLOSE, MAIN_GOTO_CHARACTER, MAP_EXIT from tasks.base.main_page import MainPage -from tasks.base.page import Page, page_main +from tasks.base.page import Page, page_gacha, page_main from tasks.combat.assets.assets_combat_finish import COMBAT_EXIT from tasks.combat.assets.assets_combat_interact import MAP_LOADING from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE -from tasks.daily.assets.assets_daily_trial import INFO_CLOSE +from tasks.daily.assets.assets_daily_trial import INFO_CLOSE, START_TRIAL from tasks.login.assets.assets_login import LOGIN_CONFIRM @@ -24,6 +25,8 @@ class UI(MainPage): page (Page): interval: """ + if page == page_main: + return self.is_in_main(interval=interval) return self.appear(page.check_button, interval=interval) def ui_get_current_page(self, skip_first_screenshot=True): @@ -139,7 +142,7 @@ class UI(MainPage): for page in Page.iter_pages(): if page.parent is None or page.check_button is None: continue - if self.appear(page.check_button, interval=5): + if self.ui_page_appear(page, interval=5): logger.info(f'Page switch: {page} -> {page.parent}') self.handle_lang_check(page) if self.ui_page_confirm(page): @@ -297,14 +300,41 @@ class UI(MainPage): if additional(): continue - def is_in_main(self): - if self.appear(page_main.check_button): - if self.image_color_count(page_main.check_button, color=(235, 235, 235), threshold=234, count=400): - return True - if self.appear(MAP_EXIT): + def is_in_main(self, interval=0): + self.device.stuck_record_add(MAIN_GOTO_CHARACTER) + + if interval and not self.interval_is_reached(MAIN_GOTO_CHARACTER, interval=interval): + return False + + appear = False + if MAIN_GOTO_CHARACTER.match_template_binary(self.device.image): + if self.image_color_count(MAIN_GOTO_CHARACTER, color=(235, 235, 235), threshold=234, count=400): + appear = True + if not appear: + if MAP_EXIT.match_template_binary(self.device.image): + if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): + appear = True + + if appear and interval: + self.interval_reset(MAIN_GOTO_CHARACTER, interval=interval) + + return appear + + def is_in_map_exit(self, interval=0): + self.device.stuck_record_add(MAP_EXIT) + + if interval and not self.interval_is_reached(MAP_EXIT, interval=interval): + return False + + appear = False + if MAP_EXIT.match_template_binary(self.device.image): if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): - return True - return False + appear = True + + if appear and interval: + self.interval_reset(MAP_EXIT, interval=interval) + + return appear def ui_goto_main(self): return self.ui_ensure(destination=page_main) @@ -380,3 +410,50 @@ class UI(MainPage): button (Button): """ pass + + def ui_leave_special(self): + """ + Leave from: + - Rogue domains + - Character trials + + Returns: + bool: If left a special plane + + Pages: + in: Any + out: page_main + """ + if not self.is_in_map_exit(): + return False + + logger.info('UI leave special') + skip_first_screenshot = True + clicked = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if clicked: + if self.is_in_main(): + logger.info(f'Leave to {page_main}') + break + + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) + continue + if self.handle_popup_confirm(): + continue + if self.match_template_color(START_TRIAL, interval=2): + logger.info(f'{START_TRIAL} -> {CLOSE}') + self.device.click(CLOSE) + clicked = True + continue + if self.handle_ui_close(page_gacha.check_button, interval=2): + continue + if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): + clicked = True + continue diff --git a/tasks/daily/trail.py b/tasks/daily/trail.py index f911b1491..a07459f8f 100644 --- a/tasks/daily/trail.py +++ b/tasks/daily/trail.py @@ -90,7 +90,8 @@ class CharacterTrial(UI): if self.match_template_color(START_TRIAL): break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/forgotten_hall/ui.py b/tasks/forgotten_hall/ui.py index a07c08753..14e9c3d59 100644 --- a/tasks/forgotten_hall/ui.py +++ b/tasks/forgotten_hall/ui.py @@ -210,7 +210,8 @@ class ForgottenHallUI(DungeonUI, ForgottenHallTeam): logger.info("Forgotten hall dungeon exited") break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index 35b647919..448e33888 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -292,7 +292,8 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonUI): if self.handle_ui_back(self._is_page_rogue_path): continue # From ui_leave_special() - if self.appear_then_click(MAP_EXIT, interval=2): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue From ee3cb4f5ef0816bb5881698c63b1283c47402f97 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 12:38:55 +0800 Subject: [PATCH 05/29] Fix: Wait current team shown up --- tasks/combat/team.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tasks/combat/team.py b/tasks/combat/team.py index 2282c178c..e2535b3ab 100644 --- a/tasks/combat/team.py +++ b/tasks/combat/team.py @@ -60,12 +60,13 @@ class CombatTeam(UI): logger.warning('Wait current team timeout') break current = self._get_team() - if current == index: - logger.attr('Team', current) - logger.info(f'Already selected to the correct team') - return False - else: - break + if current: + if current == index: + logger.attr('Team', current) + logger.info(f'Already selected to the correct team') + return False + else: + break # Set team retry = Timer(2, count=10) From ba9f2973d29337a780a13f220eca2bda512c4d7e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 12:40:44 +0800 Subject: [PATCH 06/29] Fix: Avoid double clicking COMBAT_TEAM_SUPPORT --- tasks/combat/combat.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 9767615cd..fe8885af1 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -107,18 +107,20 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo raise RequestHumanTakeover # Click - if support_character and self.appear(COMBAT_TEAM_SUPPORT): + if support_character and self.appear(COMBAT_TEAM_SUPPORT, interval=2): if pre_set_team: self.team_set(team) pre_set_team = False continue self.support_set(support_character) + self.interval_reset(COMBAT_TEAM_SUPPORT) support_set = True continue if support_set and self.appear(COMBAT_TEAM_PREPARE, interval=2): self.team_set(team) self.device.click(COMBAT_TEAM_PREPARE) self.interval_reset(COMBAT_TEAM_PREPARE) + self.interval_reset(COMBAT_TEAM_SUPPORT) continue if self.appear(COMBAT_TEAM_PREPARE): self.interval_reset(COMBAT_PREPARE) From bc82e00df9b617647976fe9d33865eeadcc6c17c Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 12:57:49 +0800 Subject: [PATCH 07/29] Upd: Route copy Jarilo_BackwaterPass_F1_X503Y736 --- route/rogue/Combat/Jarilo_BackwaterPass_F1.py | 37 +++++++++++++++++++ route/rogue/route.json | 11 ++++++ tasks/rogue/route/loader.py | 4 ++ 3 files changed, 52 insertions(+) diff --git a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py index 12db93cf2..d74adad67 100644 --- a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py +++ b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py @@ -116,6 +116,43 @@ class Route(RouteBase): self.clear_enemy(enemy2left.straight_run()) self.clear_enemy(enemy3.straight_run()) + def Jarilo_BackwaterPass_F1_X503Y736(self): + """ + | Waypoint | Position | Direction | Rotation | + | ---------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((507.2, 733.7)), | 6.7 | 4 | + | enemy1 | Waypoint((507.0, 644.0)), | 12.6 | 6 | + | enemy2left | Waypoint((536.0, 630.5)), | 48.1 | 43 | + | enemy3 | Waypoint((557.0, 585.2)), | 114.1 | 6 | + | exit_ | Waypoint((557.0, 585.2)), | 114.1 | 6 | + | exit1 | Waypoint((549.5, 575.4)), | 356.2 | 354 | + | exit2 | Waypoint((565.4, 575.6)), | 4.1 | 359 | + """ + self.map_init(plane=Jarilo_BackwaterPass, floor="F1", position=(503.2, 736.9)) + self.register_domain_exit( + Waypoint((557.0, 585.2)), end_rotation=6, + left_door=Waypoint((549.5, 575.4)), right_door=Waypoint((565.4, 575.6))) + enemy1 = Waypoint((507.0, 644.0)) + enemy2left = Waypoint((536.0, 630.5)) + enemy3 = Waypoint((557.0, 585.2)) + # ===== End of generated waypoints ===== + + self.clear_enemy(enemy1) + self.clear_enemy(enemy2left.straight_run()) + self.clear_enemy(enemy3.straight_run()) + + """ + Notes + Herta_SupplyZone_F2_X397Y239 is the same as Herta_SupplyZone_F2_X397Y233 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Combat_Jarilo_BackwaterPass_F1_X507Y733', 0.26, (503.2, 736.9)), + # ('Combat_Luofu_ArtisanshipCommission_F1_X41Y640', 0.18, (50.7, 644.4)), + # ('Combat_Luofu_DivinationCommission_F1_X737Y372', 0.174, (717.2, 355.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.168, (46.5, 370.0)) + # ] + def Jarilo_BackwaterPass_F1_X555Y643(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/route.json b/route/rogue/route.json index 2987b3112..ffb40f57f 100644 --- a/route/rogue/route.json +++ b/route/rogue/route.json @@ -241,6 +241,17 @@ ], "domain": "Combat" }, + { + "name": "Combat_Jarilo_BackwaterPass_F1_X503Y736", + "route": "route.rogue.Combat.Jarilo_BackwaterPass_F1:Jarilo_BackwaterPass_F1_X503Y736", + "plane": "Jarilo_BackwaterPass", + "floor": "F1", + "position": [ + 503.2, + 736.9 + ], + "domain": "Combat" + }, { "name": "Combat_Jarilo_BackwaterPass_F1_X555Y643", "route": "route.rogue.Combat.Jarilo_BackwaterPass_F1:Jarilo_BackwaterPass_F1_X555Y643", diff --git a/tasks/rogue/route/loader.py b/tasks/rogue/route/loader.py index 7fa9e4f86..ab6e0e4de 100644 --- a/tasks/rogue/route/loader.py +++ b/tasks/rogue/route/loader.py @@ -177,6 +177,10 @@ class RouteLoader(RogueUI, MinimapWrapper, RouteLoader_, CharacterSwitch): return True # Before Combat_Luofu_Cloudford_F1_X281Y873 if route.name in [ + # ('Combat_Jarilo_BackwaterPass_F1_X507Y733', 0.26, (503.2, 736.9)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.168, (46.5, 370.0)) + 'Jarilo_BackwaterPass_F1_X507Y733', + 'Jarilo_BackwaterPass_F1_X555Y643', 'Occurrence_Jarilo_BackwaterPass_F1_X553Y643', 'Combat_Jarilo_GreatMine_F1_X545Y513', 'Combat_Herta_SupplyZone_F2_X45Y369', From 5eabcbe22d7efdf10d5970ec47593f37116c39e6 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 14:59:48 +0800 Subject: [PATCH 08/29] Fix: Check COMBAT_AGAIN color prevent clicking before loaded --- tasks/combat/combat.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index fe8885af1..9548ab445 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -162,7 +162,8 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo if callable(expected_end) and expected_end(): logger.info(f'Combat execute ended at {expected_end.__name__}') break - if self.appear(COMBAT_AGAIN): + if (self.appear(COMBAT_AGAIN) and + self.image_color_count(COMBAT_AGAIN, color=(227, 227, 228), threshold=221, count=50)): logger.info(f'Combat execute ended at {COMBAT_AGAIN}') break if self.is_in_main(): From 442eaf195b54f904e65f95aa1b3ec0abf93bee24 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 15:02:56 +0800 Subject: [PATCH 09/29] Fix: Combat should not reenter if stamina exhausted but wave limit set --- tasks/combat/combat.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 9548ab445..6d9001990 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -218,6 +218,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo Returns: bool: True to re-enter combat and run with another wave settings """ + if self.config.stored.TrailblazePower.value < self.combat_wave_cost: + logger.info('Current trailblaze power is not enough for next run') + return False # Wave limit if self.combat_wave_limit: if self.combat_wave_done < self.combat_wave_limit: @@ -230,6 +233,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo if self.config.stored.TrailblazePower.value >= self.combat_wave_cost: logger.info('Still having some trailblaze power run with less waves to empty it') return True + return False def combat_finish(self) -> bool: """ From 3566ff03022582eb64db6f5b92525f9d2e2fe1c4 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 15:07:44 +0800 Subject: [PATCH 10/29] Fix: handle_ascension_dungeon_prepare() is called in weekly --- tasks/combat/combat.py | 1 + tasks/dungeon/weekly.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index 6d9001990..c19c6c9fc 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -133,6 +133,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo trial += 1 continue if self.handle_combat_interact(): + self.map_A_timer.reset() continue if self.handle_ascension_dungeon_prepare(): continue diff --git a/tasks/dungeon/weekly.py b/tasks/dungeon/weekly.py index 846104f47..facf25d01 100644 --- a/tasks/dungeon/weekly.py +++ b/tasks/dungeon/weekly.py @@ -21,6 +21,10 @@ class WeeklyDungeon(Dungeon): dungeon=dungeon, team=team, wave_limit=wave_limit, support_character=support_character, skip_ui_switch=skip_ui_switch) + def handle_ascension_dungeon_prepare(self): + # combat_wave_cost==30 in weekly, but no handle_ascension_dungeon_prepare required + return False + def get_weekly_remain(self) -> int: """ Pages: From 45a6cb668fa5a46376ccf50be4051596800d46a7 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 15:48:25 +0800 Subject: [PATCH 11/29] Fix: Handle battle pass after combat --- tasks/combat/combat.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index c19c6c9fc..f0c486127 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -181,6 +181,9 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo is_executing = False if self.handle_combat_state(): continue + # Battle pass popup appears just after combat finished and before blessings + if self.handle_battle_pass_notification(): + continue def _combat_can_again(self) -> bool: """ From f7b48efc7a7f0099becfc3b37e10e40d043dc487 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 15:53:08 +0800 Subject: [PATCH 12/29] Fix: [CN] Remove "|" in ocr results --- module/ocr/keyword.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/ocr/keyword.py b/module/ocr/keyword.py index 82fcdf369..31bb8cdc3 100644 --- a/module/ocr/keyword.py +++ b/module/ocr/keyword.py @@ -7,7 +7,7 @@ import module.config.server as server from module.exception import ScriptError # ord('.') = 65294 -REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇°*※\-—–-/\\\n\t()\[\]()「」『』【】《》[]]') +REGEX_PUNCTUATION = re.compile(r'[ ,..\'"“”,。…::;;!!??·・•●〇°*※\-—–-/\\|丨\n\t()\[\]()「」『』【】《》[]]') def parse_name(n): From f45c8a4dd6a1e4a83a295a2bbb3bd6d69c89fd82 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 16:00:04 +0800 Subject: [PATCH 13/29] Fix: Check selected arrow left to character avatar --- .../combat/support/COMBAT_SUPPORT_SELECTED.png | Bin 5334 -> 0 bytes tasks/combat/assets/assets_combat_support.py | 10 ---------- tasks/combat/support.py | 15 ++++++++++----- 3 files changed, 10 insertions(+), 15 deletions(-) delete mode 100644 assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png diff --git a/assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png b/assets/share/combat/support/COMBAT_SUPPORT_SELECTED.png deleted file mode 100644 index 5ea0ab7bca637f1b0662f19fcc334360fa2f470d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5334 zcmeAS@N?(olHy`uVBq!ia0y~yULXGDa2NRXJ+)_H8XdD)H8V8x&|_dA(lx2M73}>fG7bq1|}foFoS^u z#7!KP91VoglmO2T{HJS6&;2~LyZZH7Q1@Zp;j24W*l5jK-Mgw8AoiN&1 zasXz7(H7%qAdGeofN5Yf5Jm%Gw2w3_`bZ11(&o9{;#!idz1 Date: Mon, 13 May 2024 16:33:56 +0800 Subject: [PATCH 14/29] Opt: Re-arrange interval for faster combat support switch --- tasks/combat/combat.py | 10 ++---- tasks/combat/support.py | 71 +++++++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/tasks/combat/combat.py b/tasks/combat/combat.py index f0c486127..c460b1f77 100644 --- a/tasks/combat/combat.py +++ b/tasks/combat/combat.py @@ -82,14 +82,11 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo logger.hr('Combat prepare') skip_first_screenshot = True if support_character: - # To set team before support set - pre_set_team = True # Block COMBAT_TEAM_PREPARE before support set support_set = False else: - pre_set_team = False support_set = True - logger.info([support_character, pre_set_team, support_set]) + logger.info([support_character, support_set]) trial = 0 while 1: if skip_first_screenshot: @@ -108,10 +105,7 @@ class Combat(CombatInteract, CombatPrepare, CombatState, CombatTeam, CombatSuppo # Click if support_character and self.appear(COMBAT_TEAM_SUPPORT, interval=2): - if pre_set_team: - self.team_set(team) - pre_set_team = False - continue + self.team_set(team) self.support_set(support_character) self.interval_reset(COMBAT_TEAM_SUPPORT) support_set = True diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 937901e6a..237853dd4 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -130,6 +130,7 @@ class CombatSupport(UI): out: COMBAT_PREPARE """ logger.hr("Combat support") + self.interval_clear(COMBAT_TEAM_SUPPORT) skip_first_screenshot = True selected_support = False while 1: @@ -143,7 +144,7 @@ class CombatSupport(UI): return True # Click - if self.appear(COMBAT_TEAM_SUPPORT, interval=1): + if self.appear(COMBAT_TEAM_SUPPORT, interval=2): self.device.click(COMBAT_TEAM_SUPPORT) self.interval_reset(COMBAT_TEAM_SUPPORT) continue @@ -154,15 +155,30 @@ class CombatSupport(UI): self._select_next_support() self.interval_reset(POPUP_CANCEL) continue - if self.appear(COMBAT_SUPPORT_LIST, interval=1): + if self.appear(COMBAT_SUPPORT_LIST, interval=2): + scroll = AdaptiveScroll(area=COMBAT_SUPPORT_LIST_SCROLL.area, + name=COMBAT_SUPPORT_LIST_SCROLL.name) + if not scroll.appear(main=self): + self.interval_clear(COMBAT_SUPPORT_LIST) + continue if not selected_support and support_character_name != "FirstCharacter": - self._search_support( - support_character_name) # Search support + self._search_support(support_character_name) # Search support selected_support = True self.device.click(COMBAT_SUPPORT_ADD) self.interval_reset(COMBAT_SUPPORT_LIST) continue + def _get_character(self, support_character_name: str) -> SupportCharacter: + if support_character_name.startswith("Trailblazer"): + character = SupportCharacter(f"Stelle{support_character_name[11:]}", self.device.image) + if character: + return character + character = SupportCharacter(f"Caelum{support_character_name[11:]}", self.device.image) + # Should return something + return character + else: + return SupportCharacter(support_character_name, self.device.image) + def _search_support(self, support_character_name: str = "JingYuan"): """ Args: @@ -186,37 +202,30 @@ class CombatSupport(UI): scroll.drag_threshold = backup scroll.set_top(main=self) - logger.info("Searching support") - skip_first_screenshot = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() + logger.info("Searching support") + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() - if not support_character_name.startswith("Trailblazer"): - character = SupportCharacter( - support_character_name, self.device.image) + character = self._get_character(support_character_name) + if character: + logger.info("Support found") + if self._select_support(character): + return True else: - character = SupportCharacter(f"Stelle{support_character_name[11:]}", - self.device.image) or SupportCharacter( - f"Caelum{support_character_name[11:]}", self.device.image) - - if character: - logger.info("Support found") - if self._select_support(character): - return True - else: - logger.warning("Support not selected") - return False - - if not scroll.at_bottom(main=self): - scroll.next_page(main=self) - continue - else: - logger.info("Support not found") + logger.warning("Support not selected") return False + if not scroll.at_bottom(main=self): + scroll.next_page(main=self) + continue + else: + logger.info("Support not found") + return False + def _select_support(self, character: SupportCharacter): """ Args: From ab6aabeefad0d3145651b76eb78857f3d13660e1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 16:36:29 +0800 Subject: [PATCH 15/29] Opt: Search prioritize characters before scrolling --- tasks/combat/support.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasks/combat/support.py b/tasks/combat/support.py index 237853dd4..d53548248 100644 --- a/tasks/combat/support.py +++ b/tasks/combat/support.py @@ -192,6 +192,14 @@ class CombatSupport(UI): out: COMBAT_SUPPORT_LIST """ logger.hr("Combat support search") + # Search prioritize characters + character = self._get_character(support_character_name) + if character: + logger.info("Support found in first page") + if self._select_support(character): + return True + + # Search in the following pages scroll = AdaptiveScroll(area=COMBAT_SUPPORT_LIST_SCROLL.area, name=COMBAT_SUPPORT_LIST_SCROLL.name) if scroll.appear(main=self): From af603eadf8a4faf876a4630d8611c8dec5cb3b75 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Mon, 13 May 2024 19:24:17 +0800 Subject: [PATCH 16/29] Fix: Lower OcrCharacterName.merge_thres_y so DanHeng's long name won't mix with others --- tasks/battle_pass/battle_pass.py | 16 ++++++++++++---- tasks/character/switch.py | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tasks/battle_pass/battle_pass.py b/tasks/battle_pass/battle_pass.py index a7e172b41..4386dd136 100644 --- a/tasks/battle_pass/battle_pass.py +++ b/tasks/battle_pass/battle_pass.py @@ -96,6 +96,10 @@ class BattlePassUI(UI): MAX_LEVEL = 70 def _battle_pass_wait_rewards_loaded(self, skip_first_screenshot=True): + """ + Returns: + bool: If load success + """ timeout = Timer(2, count=4).start() while 1: if skip_first_screenshot: @@ -105,12 +109,16 @@ class BattlePassUI(UI): if timeout.reached(): logger.warning('Wait rewards tab loaded timeout') - break + return False if self.appear(REWARDS_LOADED): logger.info('Rewards tab loaded') - break + return True def _battle_pass_wait_missions_loaded(self, skip_first_screenshot=True): + """ + Returns: + bool: If load success + """ timeout = Timer(2, count=4).start() while 1: if skip_first_screenshot: @@ -120,14 +128,14 @@ class BattlePassUI(UI): if timeout.reached(): logger.warning('Wait missions tab loaded timeout') - break + return False # Has scroll and last mission loaded if self.appear(MISSION_PAGE_SCROLL): color = get_color(self.device.image, MISSIONS_LOADED.area) if np.mean(color) > 128: logger.info('Missions tab loaded') - break + return True def battle_pass_goto(self, state: KEYWORDS_BATTLE_PASS_TAB): """ diff --git a/tasks/character/switch.py b/tasks/character/switch.py index 7b36b6806..a30e25796 100644 --- a/tasks/character/switch.py +++ b/tasks/character/switch.py @@ -16,7 +16,7 @@ from tasks.character.keywords import CharacterList, DICT_SORTED_RANGES, KEYWORDS class OcrCharacterName(OcrWhiteLetterOnComplexBackground): merge_thres_x = 20 - merge_thres_y = 20 + merge_thres_y = 10 def after_process(self, result): result = result.replace('蛆', '妲') From acf72b18d5401a0d2aa444581574e52d0e5e2a7e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 01:37:27 +0800 Subject: [PATCH 17/29] =?UTF-8?q?Fix:=20[CN]=20Handle=20OCR=20error=20on?= =?UTF-8?q?=20=E5=8C=BA=E5=9F=9F=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/base/main_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index 93f514aa7..439dd5622 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -37,7 +37,7 @@ class OcrPlaneName(OcrWhiteLetterOnComplexBackground): # 区域-战 result = re.sub(r'区域.*战$', '区域战斗', result) # 区域-事 - result = re.sub(r'区域.*事$', '区域事件', result) + result = re.sub(r'区域.*[事件]$', '区域事件', result) # 区域-战 result = re.sub(r'区域.*交$', '区域交易', result) # 区域-事伴, 区域-事祥 From 415fa61df95267840d839c785a41b7844dfebe44 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 01:49:31 +0800 Subject: [PATCH 18/29] Fix: Try without preprocess if no doors matched --- module/ocr/ocr.py | 7 +++++-- tasks/rogue/route/exit.py | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/module/ocr/ocr.py b/module/ocr/ocr.py index 82fb32d39..2fa29aa03 100644 --- a/module/ocr/ocr.py +++ b/module/ocr/ocr.py @@ -422,9 +422,12 @@ class Duration(Ocr): class OcrWhiteLetterOnComplexBackground(Ocr): + white_preprocess = True + def pre_process(self, image): - image = extract_white_letters(image, threshold=255) - image = cv2.merge([image, image, image]) + if self.white_preprocess: + image = extract_white_letters(image, threshold=255) + image = cv2.merge([image, image, image]) return image def detect_and_ocr(self, *args, **kwargs): diff --git a/tasks/rogue/route/exit.py b/tasks/rogue/route/exit.py index d3fc611c4..c5d45ee48 100644 --- a/tasks/rogue/route/exit.py +++ b/tasks/rogue/route/exit.py @@ -235,6 +235,10 @@ class RogueExit(CombatInteract): ocr = OcrDomainExit(OCR_DOMAIN_EXIT) results = ocr.matched_ocr(image, keyword_classes=MapPlane) + # Try without preprocess + if not len(results): + ocr.white_preprocess = False + results = ocr.matched_ocr(image, keyword_classes=MapPlane) centers = [area_center(result.area) for result in results] logger.info(f'DomainDoor: {centers}') directions = [self.screen2direction(center) for center in centers] From aeb7926f6d1c440c4d86c3183afe146d204529ed Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 01:52:35 +0800 Subject: [PATCH 19/29] Fix: Route never pass through node2 in Jarilo_BackwaterPass_F1_X475Y49 --- route/rogue/Combat/Jarilo_BackwaterPass_F1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py index d74adad67..a3af0a87d 100644 --- a/route/rogue/Combat/Jarilo_BackwaterPass_F1.py +++ b/route/rogue/Combat/Jarilo_BackwaterPass_F1.py @@ -63,7 +63,7 @@ class Route(RouteBase): ) # 2 self.clear_enemy( - node2, + node2.set_threshold(3), enemy2.straight_run(), ) # 3 From b784c17ac04e2432c934754b4632f5964664f5b1 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 01:55:02 +0800 Subject: [PATCH 20/29] Fix: Match Combat_Luofu_DivinationCommission_F1_X97Y457 before Combat_Luofu_Cloudford_F1_X283Y865 --- tasks/rogue/route/loader.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasks/rogue/route/loader.py b/tasks/rogue/route/loader.py index ab6e0e4de..55b32d27c 100644 --- a/tasks/rogue/route/loader.py +++ b/tasks/rogue/route/loader.py @@ -192,6 +192,10 @@ class RouteLoader(RogueUI, MinimapWrapper, RouteLoader_, CharacterSwitch): # ('Occurrence_Luofu_DivinationCommission_F2_X149Y659', 0.237, (148.9, 658.8)), # ('Occurrence_Luofu_DivinationCommission_F2_X425Y791', 0.11, (425.2, 793.8)) 'Occurrence_Luofu_DivinationCommission_F2_X149Y659', + # ('Combat_Luofu_DivinationCommission_F1_X97Y457', 0.222, (97.8, 456.9)), + # ('Combat_Luofu_ScalegorgeWaterscape_F1_X415Y261', 0.112, (371.8, 289.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.104, (11.7, 367.6)) + 'Combat_Luofu_DivinationCommission_F1_X97Y457', ] and similarity > 0.15: return True if route.name in [ From e0707b828610f76183a2cd4fbb849cbacd7da7d9 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 01:59:47 +0800 Subject: [PATCH 21/29] Fix: [CN] Handle curio fixed TODO: [EN] Update CURIO_FIXED --- assets/cn/rogue/ui/CURIO_FIXED.png | Bin 0 -> 8231 bytes tasks/rogue/assets/assets_rogue_ui.py | 11 +++++++++++ tasks/rogue/blessing/ui.py | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 assets/cn/rogue/ui/CURIO_FIXED.png diff --git a/assets/cn/rogue/ui/CURIO_FIXED.png b/assets/cn/rogue/ui/CURIO_FIXED.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6adc00d6174b0022a16479305b081e0a51646b GIT binary patch literal 8231 zcmeH}hd0~b`@r95Yt{G|)f!c^T18tmYL_Z%uUJJ@Q6oZ;7&Tg2Ej1deMC=t}R7Y$& z>{Wa3k&+NAi4gqs`~4?==X*Z)oO_;oo_o$c&wV}for#eS3llFB001m{y7$ch;Oyy< z_BR9Vsn8I7NOLL}eROU70DzhE@1_AVGA{xElcBqomWjzTh(E;d8N}y`o|e`XpXU%) zcP|$J2%JQk!>p6Y7u4p+E^Hvp@vTp3UM~S*5i~;wyGj*CE*`RAuhKr#S$1-;M|21;1~{GOiLSzsKM zG|dBy=kcQ$fH)c;T|!5cR-+zxZ28jc25rj^AP21>EPbY>f+oV|+ie}%h{m%3G~POq zP2({Tk*;~82e_h03us;D?4`S6K$mlKuz4Qk=<~Wpmj-C*PU%h4AC%>)N%_qS+u535 z6k7b@^-0r-=Nh{!=a{;Ez|E{N^FoKRpWA2 zu1SZA06!Bm^M=@y+{T+rv1%u>3y}HPFw*Jm@l@~@;G3b5Ufz-)dF1Ql4XrSX$9A95 zyyZ>CiX6AU4nK;&Hn4c-)1w>QG27PfYD|O;+kP8AgP&>pdm>E^rjUo0YJl_ zi;qf@c?{YZ0N{Sk%j;G5=+A%WLbtGHeivwH;h}XpcVFYYXp0KF=DFnvex}@usrN2f zv?z_A`C3KCoAXb`0{fTmw-i~h^Bj*};(U0{J-(Rr<6^@b#xwUi7&x7Tl-~aHBz|1D zkAWvW{*17b?j3kU!IibQT&BXU9nTABQJNkf>~%$Uq@Hu#jeDeVkT}(G<#r4;ra|Xc z^2=&dx?$P?joK1H-k7!=zXAU{Z1xeUd7cBjUoNXge9J2y(Ek(Q4}`|VJ4X!MVs(8# z;q>TzwD#k7*1Y2F7o1nDv zcF}+_Pt>d+nd70Hi~7o$!tC3c={cpQy{N2VhSIl6*|vJ%9H@zmc{GaiPC$lOFXDn$ zcY##?$nOkyH+S+gnKl19#+k^=+G)Sj20j1KuVL3B_h9E)-mpZr>pqdV4>S&x#h=rebyETT>uN*JxS%ygVi%EhZDv4+2;R#l@~jg^2?K%(H}5dWCtmWprRcoX zlj!`%^P_vsz*f{k$v@rC>OTB>mOr4Ef3-$@GumxQE|5pf6%FBkg1$5BGVQ72^u+!4 zRKc%;*5#&ay~&;#u5|-nhWvYaI&Ms($I+em_`4&So>@*!6Ae?;xYvc+nXM0Foet)#adXjZUpijW#|>hm zG%GZXFL_^nrt_o|Jd=K=kY4U=+}ZkbGUwH}HP17$*a$vPg0%4L@KKy)r`>L33~+Zb zAh~V%4sP~{8(bd!C;m-8!yJ1Uq=;g$*7J?w?YxfH+ZsXlOX)n6P_Ap&ZBQHa;Z+D& zb`3%IM`zLf6TTBtcat-dGxN<@+*7|uj@`saV2oWQC6ic|gI2*^d`Zz=WJ)9h?Jn8{*623s+78RkxgM`mM3`S)c+r?xWl~f1dAugjW_w<^ zS-bv%NUS*zO!}6+S>4k>_pQOu?q}WAsYfP@)@GJF9zoMP@n(^Og@sy@udME*pprYg zy({)?Yn{2BQl458Jkmz&K;hSUQXJ7f=#q;4ss}Zzi&jRCBQJ=s^td@|_e*bAFP)r|+=gAxH}up_u6#Zz z7#VKg4LT|>!!%8ZPmVUvz(RIeBL%pXX9>yphOd%=R-TR8p+xV&%~vxCyifS*npeYS zYII=6tyu{ng(37LZ3522AL2D#+1y;s2sV?CyR56^vx10#Od>WiU|)S~ue1KRxAOh! zT+xe=C6hn7eLtsv_Rgh;V~7km-5|+9rRD&%R6aOIHMf!Q=Y2j>z(GK#33C!gxV7XQ z&@Pu?m6d~(P~E01ze-vvep;M`G*VX`PM;1U8&K0d?M>|)-L(3%)Oq|j4KR-6&fQsT zg8f#5&z>;($&?sIzg)FKRVU2nXhFBq4uW$bcW+p!RQT^1;*CqVxc_0#(fD{zuW8rPwdD@q>P+VQi+20igItjx0m0{xF)vzy)sWRlK-9xd#Y}wOk^NO>snIQlKivd7HBmhuOPURW^1l$CG^~V69 z^br7fAaKXl2LQlrp?CkDMc^cUCMc16q>+BhF9h`9oa-A)0imCHZ0~M$YM8u;5Ppz_ zV>dOuKXCCDd)j+bu6Ld$!Z8ot>1P$*`jAt@N33N}yU%F_-OKfT34G4=qU-5t#3+Zq z&okA~T}eR&XB!g*?Ny8W*J_*9>zYQ2jiXO({NGsA6Zj4%ur;!70!roFm_Cv)(v&w^ z6s0U?x5Wt@?cyN8+pn=kyrGMAhEjU)DE8-mdFDETO^}J&cRs`H9MKJ$IW!_+Y;`og_Jwj4VVbK$Hk**)mpj|9RN;?yfEpe&FZ>z3Wvy zc;{1FH4&r{h6HsYCe%UK8w!))@WJCllKo9W+*2${9H1)ip1BxNX{{A{RGK0Qt@6Eh z?_P8~Qj@{dh^x?SVp;I=)aK{@v5>vV&$&&~dhqDWAv>pUpA^&`=y0|P5*wYh7{;jh z!HLhV;(8qL#D|6PXkOpWWKVgtWAoF2MN#55Ki-1D{$XsfVetxmEn-T1R*9MDADwo0`v7$WH13Mm9tpJAaAoiMS~o(YCWBUU$e#tB1YP)YSGL3O^sxU*f92sCw-s!2 z+U2M&V1&o0ud}n(dp!jir-J>0Bx4pKQQrpFjf_$0<9&Q) z9G`;p(VRlK@-9qB6vZxGhj(+!A}%S$=S$RWPoiKmL<9>W!)`Er^j>UC3{++=zp!v+ zww}QI;`jF%$zT;yN2JWrHf7^|{nX})o24VWW=HS4ykv+Z5CNPArbdeloyP28%tBlj zma+FuSCb|>lznAm%^c^-+?tO_C)3+SMMbgF4Ofy3nVy?Ro@2QTBPGDxr{ts9wM`io z_LJJeYU&og({IjIp=v+fP3mk5C>zU^b)u$oicbd*$&gO^zY9gRvGDP(jA$a-G+fjIbL_lFq#7wlqPe zdJlj6lnuVnzAct!U{sCzL4DRUKGb&?^5mYA6NA(CD~h_B=k!4Uj!oTbUnD_|)V5e? z%GK)29}X{-^_}JorWa83|NT-6whXWK&3gr00q9y--Af?Wd!%YS>y1|_QS4VcQyXlX zzxh&au&H09_Mdc9ryH^zf+*nvz83W)v0g(%WA*KE&gSsI&FNZtHs$50Th1XHwN~D< zQOa(8$J1SQ2)o1Fr%chMtLqWAEwWc12^WhHp`$y0{hs;aFjk+N?m zp+&8+7YrLWd14s;Rxv8h+urn!>)tz&1oeflR*to#$+fS76%$5Fs|KV=_n{(3h4KRX zZBvm4tg6euyN>Aw*Y^DSRRT^Ln-R*e&1=radmje^3}^`WxEyI9cQ zDywcZFoDM$gt~c}s$AdrEhHl&6J=sz@{!NxAKt&kYk%xr-fxt7acJ`lB<))(W;$4Z zJ^$-eko=UmOtF6Em6VmI2lnl!NLqo@{gDq}+sDL|UUhgBfG=VH zF+Jwk=(STIaaAV(&;ZUwfG6P&=BCM_LX>JNcXO1*fHYW(Va;D(Utc`R!V@^g2O$s{ zr!An|zWy|26C7vc%D}$cgP7EYgEaLMr@o6dTm;)Nr;hW3kQKlakFfP!D_ipQt(Yqqn8bn<4mgbu|U-YwYpXfoCOQ z21CdZqQ86xUtj1VFl%!#8v5CFmfS+eA_#t_=VtNW;tvImpB^p4Nn*-_YBErw zO@00DB0~fwqm%!RDpsaVxKlM82^(=q zs)w#kHWi=)aHq=kHwRwgpN$FL0!mO1M>FW`U3J@L?-@7apsiV($V0-RAomPuJQUN1 zR7y*MN>G;fMmO++@gaWOKm3)BYCrKRcm@7x3W--gsDkWmhH0#f6&oX~pHQl09N-?b zEzPpV5j6WTa`J^TXthK9`Yw5W2$uE@Y>pZxO}X7pKbXwGuBxaW&QAD}h9EpHNl#CE zHOgYIGkLv=8cAkmV!F^18oEFYV#fA|P*SWwqoWFipVv|iBR&+p_%+Wgdi1)MPlZ{+=f {BLESSING_CONFIRM}') self.device.click(BLESSING_CONFIRM) return True + # Fixed a curio from occurrence + if self.appear(CURIO_FIXED, interval=2): + logger.info(f'{CURIO_FIXED} -> {BLESSING_CONFIRM}') + self.device.click(BLESSING_CONFIRM) + return True return False From e35ab54ebc623966c17afef932c86fd81f51f499 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:10:46 +0800 Subject: [PATCH 22/29] =?UTF-8?q?Fix:=20[CN]=20Handle=20OCR=20error=20on?= =?UTF-8?q?=20=E5=8C=BA=E5=9F=9F=E7=B2=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/base/main_page.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index 439dd5622..1238ee9ed 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -40,6 +40,8 @@ class OcrPlaneName(OcrWhiteLetterOnComplexBackground): result = re.sub(r'区域.*[事件]$', '区域事件', result) # 区域-战 result = re.sub(r'区域.*交$', '区域交易', result) + # 区域-战 + result = re.sub(r'区域.*[精英]$', '区域精英', result) # 区域-事伴, 区域-事祥 result = re.sub(r'事[伴祥]', '事件', result) # 医域-战斗 From 8375e8729d4fbe20ecc107b2acede8f73bc0bc9e Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:17:24 +0800 Subject: [PATCH 23/29] Upd: Route copies --- route/rogue/Combat/Luofu_Cloudford_F1.py | 55 +++++++++++++++++++ .../Elite/Jarilo_CorridorofFadingEchoes_F1.py | 30 ++++++++++ .../Elite/Luofu_ArtisanshipCommission_F1.py | 30 ++++++++++ route/rogue/Elite/Luofu_Cloudford_F1.py | 31 +++++++++++ .../rogue/Elite/Luofu_StargazerNavalia_F1.py | 31 +++++++++++ route/rogue/route.json | 55 +++++++++++++++++++ 6 files changed, 232 insertions(+) diff --git a/route/rogue/Combat/Luofu_Cloudford_F1.py b/route/rogue/Combat/Luofu_Cloudford_F1.py index a8c5fde6e..e320e3973 100644 --- a/route/rogue/Combat/Luofu_Cloudford_F1.py +++ b/route/rogue/Combat/Luofu_Cloudford_F1.py @@ -256,3 +256,58 @@ class Route(RouteBase): ) self.clear_item(item4) self.clear_enemy(enemy4) + + def Luofu_Cloudford_F1_X432Y685(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((435.4, 669.2)), | 6.7 | 4 | + | item1 | Waypoint((432.2, 628.3)), | 2.7 | 357 | + | enemy1 | Waypoint((428.6, 598.8)), | 8.0 | 177 | + | node2 | Waypoint((421.2, 590.8)), | 44.2 | 285 | + | node3 | Waypoint((366.6, 588.2)), | 274.2 | 274 | + | enemy3 | Waypoint((344.9, 590.4)), | 191.8 | 357 | + | item4 | Waypoint((309.6, 580.2)), | 290.1 | 281 | + | enemy4 | Waypoint((271.3, 585.5)), | 285.0 | 274 | + | exit_ | Waypoint((271.3, 585.5)), | 285.0 | 274 | + | exit1 | Waypoint((267.9, 592.3)), | 275.9 | 274 | + | exit2 | Waypoint((267.8, 580.0)), | 275.8 | 274 | + """ + self.map_init(plane=Luofu_Cloudford, floor="F1", position=(432.8, 685.1)) + self.register_domain_exit( + Waypoint((271.3, 585.5)), end_rotation=274, + left_door=Waypoint((267.9, 592.3)), right_door=Waypoint((267.8, 580.0))) + item1 = Waypoint((432.2, 628.3)) + enemy1 = Waypoint((428.6, 598.8)) + node2 = Waypoint((421.2, 590.8)) + node3 = Waypoint((366.6, 588.2)) + enemy3 = Waypoint((344.9, 590.4)) + item4 = Waypoint((309.6, 580.2)) + enemy4 = Waypoint((271.3, 585.5)) + # ===== End of generated waypoints ===== + + self.clear_item(item1) + self.clear_enemy(enemy1) + # Go through bridges + self.rotation_set(270) + self.minimap.lock_rotation(270) + self.clear_enemy( + node2.set_threshold(3), + node3.set_threshold(3), + enemy3, + ) + self.clear_item(item4) + self.clear_enemy(enemy4) + + """ + Notes + Luofu_Cloudford_F1_X435Y685 is the same as Luofu_Cloudford_F1_X435Y669 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Combat_Luofu_Cloudford_F1_X433Y617', 0.195, (432.8, 668.4)), + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.18, (24.2, 372.2)), + # ('Combat_Luofu_Cloudford_F1_X435Y669', 0.18, (432.8, 685.1)) + # ] + # (432.9, 684.9) + # ('Combat_Luofu_Cloudford_F1_X435Y669', 0.172, (432.8, 685.0)) diff --git a/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py b/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py index db8fb74cc..9438b33b1 100644 --- a/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py +++ b/route/rogue/Elite/Jarilo_CorridorofFadingEchoes_F1.py @@ -30,6 +30,36 @@ class Route(RouteBase): but for wrong spawn point detected """ + def Jarilo_CorridorofFadingEchoes_F1_X415Y953(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((415.5, 947.9)), | 96.7 | 91 | + | enemy | Waypoint((464.0, 953.0)), | 96.8 | 94 | + | reward | Waypoint((472.7, 958.5)), | 214.6 | 114 | + | exit_ | Waypoint((480.0, 944.0)), | 92.7 | 84 | + """ + self.map_init(plane=Jarilo_CorridorofFadingEchoes, floor="F1", position=(415.4, 953.3)) + enemy = Waypoint((464.0, 953.0)) + reward = Waypoint((472.7, 958.5)) + exit_ = Waypoint((480.0, 944.0)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Jarilo_CorridorofFadingEchoes_F1_X415Y953 is the same as Jarilo_CorridorofFadingEchoes_F1_X415Y947 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.169, (415.4, 953.3)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947', 0.169, (415.4, 953.3)), + # ('Elite_Herta_SupplyZone_F2_X680Y247', 0.162, (738.4, 252.2)) + # ] + def Jarilo_CorridorofFadingEchoes_F1_X415Y947(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py b/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py index c563530d0..d376ff325 100644 --- a/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py +++ b/route/rogue/Elite/Luofu_ArtisanshipCommission_F1.py @@ -24,6 +24,36 @@ class Route(RouteBase): self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + def Luofu_ArtisanshipCommission_F1_X391Y493(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((385.2, 494.6)), | 94.2 | 91 | + | enemy | Waypoint((444.2, 490.5)), | 94.2 | 91 | + | reward | Waypoint((448.6, 497.2)), | 149.7 | 91 | + | exit_ | Waypoint((458.0, 483.7)), | 94.2 | 91 | + """ + self.map_init(plane=Luofu_ArtisanshipCommission, floor="F1", position=(391.1, 493.2)) + enemy = Waypoint((444.2, 490.5)) + reward = Waypoint((448.6, 497.2)) + exit_ = Waypoint((458.0, 483.7)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Luofu_ArtisanshipCommission_F1_X391Y493 is the same as Luofu_ArtisanshipCommission_F1_X385Y494 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_ArtisanshipCommission_F1_X385Y494', 0.182, (391.1, 493.2)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.157, (364.0, 951.0)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947', 0.157, (364.0, 951.0)) + # ] + def Luofu_ArtisanshipCommission_F1_X504Y493(self): """ | Waypoint | Position | Direction | Rotation | diff --git a/route/rogue/Elite/Luofu_Cloudford_F1.py b/route/rogue/Elite/Luofu_Cloudford_F1.py index 2ade4c4ab..6d9c7d26a 100644 --- a/route/rogue/Elite/Luofu_Cloudford_F1.py +++ b/route/rogue/Elite/Luofu_Cloudford_F1.py @@ -25,3 +25,34 @@ class Route(RouteBase): self.domain_reward(reward) self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + + @locked_rotation(0) + def Luofu_Cloudford_F1_X342Y1003(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | -------------------------- | --------- | -------- | + | spawn | Waypoint((337.3, 1003.4)), | 6.7 | 4 | + | enemy | Waypoint((336.2, 962.2)), | 6.7 | 4 | + | reward | Waypoint((342.9, 950.8)), | 44.2 | 31 | + | exit_ | Waypoint((328.8, 942.8)), | 316.1 | 331 | + """ + self.map_init(plane=Luofu_Cloudford, floor="F1", position=(342.3, 1003.4)) + enemy = Waypoint((336.2, 962.2)) + reward = Waypoint((342.9, 950.8)) + exit_ = Waypoint((328.8, 942.8)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Luofu_Cloudford_F1_X342Y1003 is the same as Luofu_Cloudford_F1_X337Y1003 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_Cloudford_F1_X337Y1003', 0.169, (342.3, 1002.7)), + # ('Elite_Luofu_ArtisanshipCommission_F1_X504Y493', 0.106, (519.3, 452.7)), + # ('Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y933', 0.104, (433.8, 982.0)) + # ] diff --git a/route/rogue/Elite/Luofu_StargazerNavalia_F1.py b/route/rogue/Elite/Luofu_StargazerNavalia_F1.py index ca696d3aa..cc1d221f7 100644 --- a/route/rogue/Elite/Luofu_StargazerNavalia_F1.py +++ b/route/rogue/Elite/Luofu_StargazerNavalia_F1.py @@ -25,3 +25,34 @@ class Route(RouteBase): self.domain_reward(reward) self.domain_single_exit(exit_) # ===== End of generated waypoints ===== + + @locked_rotation(90) + def Luofu_StargazerNavalia_F1_X617Y511(self): + """ + | Waypoint | Position | Direction | Rotation | + | -------- | ------------------------- | --------- | -------- | + | spawn | Waypoint((617.5, 511.5)), | 96.7 | 91 | + | enemy | Waypoint((664.6, 512.6)), | 96.8 | 94 | + | reward | Waypoint((677.1, 521.2)), | 212.8 | 108 | + | exit_ | Waypoint((684.6, 505.0)), | 91.3 | 82 | + """ + self.map_init(plane=Luofu_StargazerNavalia, floor="F1", position=(617.5, 511.5)) + enemy = Waypoint((664.6, 512.6)) + reward = Waypoint((677.1, 521.2)) + exit_ = Waypoint((684.6, 505.0)) + + self.clear_elite(enemy) + self.domain_reward(reward) + self.domain_single_exit(exit_) + # ===== End of generated waypoints ===== + + """ + Notes + Herta_SupplyZone_F2_X397Y239 is the same as Herta_SupplyZone_F2_X397Y233 + but for wrong spawn point detected + """ + # Best 3 predictions: [ + # ('Elite_Luofu_StargazerNavalia_F1_X617Y511', 0.338, (621.0, 507.0)), + # ('Elite_Luofu_ArtisanshipCommission_F1_X385Y494', 0.203, (329.2, 492.8)), + # ('Elite_Jarilo_SilvermaneGuardRestrictedZone_F1_X225Y425', 0.181, (224.8, 423.2)) + # ] diff --git a/route/rogue/route.json b/route/rogue/route.json index ffb40f57f..6f78834c5 100644 --- a/route/rogue/route.json +++ b/route/rogue/route.json @@ -912,6 +912,17 @@ ], "domain": "Combat" }, + { + "name": "Combat_Luofu_Cloudford_F1_X432Y685", + "route": "route.rogue.Combat.Luofu_Cloudford_F1:Luofu_Cloudford_F1_X432Y685", + "plane": "Luofu_Cloudford", + "floor": "F1", + "position": [ + 432.8, + 685.1 + ], + "domain": "Combat" + }, { "name": "Combat_Luofu_Cloudford_F1Rogue_X59Y405", "route": "route.rogue.Combat.Luofu_Cloudford_F1Rogue:Luofu_Cloudford_F1Rogue_X59Y405", @@ -1297,6 +1308,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y953", + "route": "route.rogue.Elite.Jarilo_CorridorofFadingEchoes_F1:Jarilo_CorridorofFadingEchoes_F1_X415Y953", + "plane": "Jarilo_CorridorofFadingEchoes", + "floor": "F1", + "position": [ + 415.4, + 953.3 + ], + "domain": "Elite" + }, { "name": "Elite_Jarilo_CorridorofFadingEchoes_F1_X415Y947", "route": "route.rogue.Elite.Jarilo_CorridorofFadingEchoes_F1:Jarilo_CorridorofFadingEchoes_F1_X415Y947", @@ -1396,6 +1418,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_ArtisanshipCommission_F1_X391Y493", + "route": "route.rogue.Elite.Luofu_ArtisanshipCommission_F1:Luofu_ArtisanshipCommission_F1_X391Y493", + "plane": "Luofu_ArtisanshipCommission", + "floor": "F1", + "position": [ + 391.1, + 493.2 + ], + "domain": "Elite" + }, { "name": "Elite_Luofu_ArtisanshipCommission_F1_X504Y493", "route": "route.rogue.Elite.Luofu_ArtisanshipCommission_F1:Luofu_ArtisanshipCommission_F1_X504Y493", @@ -1418,6 +1451,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_Cloudford_F1_X342Y1003", + "route": "route.rogue.Elite.Luofu_Cloudford_F1:Luofu_Cloudford_F1_X342Y1003", + "plane": "Luofu_Cloudford", + "floor": "F1", + "position": [ + 342.3, + 1003.4 + ], + "domain": "Elite" + }, { "name": "Elite_Luofu_DivinationCommission_F2_X338Y345", "route": "route.rogue.Elite.Luofu_DivinationCommission_F2:Luofu_DivinationCommission_F2_X338Y345", @@ -1451,6 +1495,17 @@ ], "domain": "Elite" }, + { + "name": "Elite_Luofu_StargazerNavalia_F1_X617Y511", + "route": "route.rogue.Elite.Luofu_StargazerNavalia_F1:Luofu_StargazerNavalia_F1_X617Y511", + "plane": "Luofu_StargazerNavalia", + "floor": "F1", + "position": [ + 617.5, + 511.5 + ], + "domain": "Elite" + }, { "name": "Occurrence_Herta_StorageZone_F1_X273Y93", "route": "route.rogue.Occurrence.Herta_StorageZone_F1:Herta_StorageZone_F1_X273Y93", From c15e12226c301db3c479ea90a0f9f8e9fdff5566 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:26:50 +0800 Subject: [PATCH 24/29] Fix: Pass rough corners in Jarilo_CorridorofFadingEchoes_F1_X201Y1071 --- .../Combat/Jarilo_CorridorofFadingEchoes_F1.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py b/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py index 004217fb9..080668a9e 100644 --- a/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py +++ b/route/rogue/Combat/Jarilo_CorridorofFadingEchoes_F1.py @@ -31,6 +31,7 @@ class Route(RouteBase): | ----------- | -------------------------- | --------- | -------- | | spawn | Waypoint((201.2, 1071.4)), | 6.7 | 4 | | enemy1right | Waypoint((200.3, 1032.4)), | 342.0 | 343 | + | node1 | Waypoint((194.6, 1023.4)), | 109.3 | 294 | | enemy1left | Waypoint((168.6, 1022.3)), | 279.8 | 89 | | node2 | Waypoint((118.4, 1019.0)), | 282.9 | 285 | | enemy2left | Waypoint((105.2, 1012.0)), | 317.9 | 315 | @@ -46,6 +47,7 @@ class Route(RouteBase): Waypoint((103.4, 919.2)), end_rotation=4, left_door=Waypoint((98.8, 908.9)), right_door=Waypoint((111.4, 909.8))) enemy1right = Waypoint((200.3, 1032.4)) + node1 = Waypoint((194.6, 1023.4)) enemy1left = Waypoint((168.6, 1022.3)) node2 = Waypoint((118.4, 1019.0)) enemy2left = Waypoint((105.2, 1012.0)) @@ -57,20 +59,22 @@ class Route(RouteBase): # 1 self.rotation_set(315) self.clear_enemy( - enemy1right.set_threshold(5), - enemy1left.set_threshold(5), + enemy1right.set_threshold(3), + node1.set_threshold(3), + enemy1left.set_threshold(3), ) # 2 self.clear_enemy( - enemy1left.set_threshold(5), + enemy1left.set_threshold(3), node2.set_threshold(5), enemy2left, enemy2right, ) # 3 + self.rotation_set(0) self.clear_enemy( - node3.set_threshold(5), - enemy3.straight_run(), + node3.set_threshold(3), + enemy3, ) def Jarilo_CorridorofFadingEchoes_F1_X266Y457(self): From caf3af9973a1005ec3bbf406e738f0ed73d7e9f4 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:35:39 +0800 Subject: [PATCH 25/29] Dev: Save tracking image on each waypoint --- tasks/map/control/control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/map/control/control.py b/tasks/map/control/control.py index 90d752fa3..bf99c8302 100644 --- a/tasks/map/control/control.py +++ b/tasks/map/control/control.py @@ -133,6 +133,7 @@ class MapControl(Combat, AimDetectorMixin): """ logger.hr('Goto', level=2) logger.info(f'Goto {waypoint}') + self.screenshot_tracking_add() self.waypoint = waypoint self.device.stuck_record_clear() self.device.click_record_clear() @@ -353,7 +354,6 @@ class MapControl(Combat, AimDetectorMixin): list[str]: A list of walk result """ logger.hr('Goto', level=1) - self.screenshot_tracking_add() self.map_A_timer.clear() self.map_E_timer.clear() self.map_run_2x_timer.clear() From 5f9ec0ed579379a800ff8daa611c78112f930821 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:45:12 +0800 Subject: [PATCH 26/29] Fix: Multiple right doors are classified as left and right doors --- tasks/rogue/route/exit.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tasks/rogue/route/exit.py b/tasks/rogue/route/exit.py index c5d45ee48..cf7c21bc8 100644 --- a/tasks/rogue/route/exit.py +++ b/tasks/rogue/route/exit.py @@ -253,8 +253,17 @@ class RogueExit(CombatInteract): else: return None, results[0].matched_keyword else: - results = [r for d, r in sorted(zip(directions, results))] - return results[0].matched_keyword, results[-1].matched_keyword + left = [r for d, r in sorted(zip(directions, results)) if d < 0] + right = [r for d, r in sorted(zip(directions, results)) if d >= 0] + if len(left): + left = left[0].matched_keyword + else: + left = None + if len(right): + right = right[-1].matched_keyword + else: + right = None + return left, right def choose_door(self, left_door: MapPlane | None, right_door: MapPlane | None) -> str | None: """ From fdb61da22308adc4538d33b4813e66b9d4bd7a49 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:45:58 +0800 Subject: [PATCH 27/29] Fix: Pass through door2 in Herta_SupplyZone_F2_X45Y369 --- route/rogue/Combat/Herta_SupplyZone_F2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/route/rogue/Combat/Herta_SupplyZone_F2.py b/route/rogue/Combat/Herta_SupplyZone_F2.py index 95a9e606e..46357df1f 100644 --- a/route/rogue/Combat/Herta_SupplyZone_F2.py +++ b/route/rogue/Combat/Herta_SupplyZone_F2.py @@ -15,6 +15,7 @@ class Route(RouteBase): | enemy1 | Waypoint((46.2, 328.2)), | 12.6 | 8 | | item2 | Waypoint((42.4, 299.0)), | 352.8 | 348 | | door2 | Waypoint((46.4, 284.5)), | 4.2 | 1 | + | door2end | Waypoint((47.2, 274.8)), | 11.1 | 4 | | enemy2left | Waypoint((31.2, 248.8)), | 183.8 | 84 | | enemy2right | Waypoint((55.2, 247.2)), | 96.7 | 91 | | item3 | Waypoint((68.5, 226.5)), | 30.2 | 29 | @@ -32,6 +33,7 @@ class Route(RouteBase): enemy1 = Waypoint((46.2, 328.2)) item2 = Waypoint((42.4, 299.0)) door2 = Waypoint((46.4, 284.5)) + door2end = Waypoint((47.2, 274.8)) enemy2left = Waypoint((31.2, 248.8)) enemy2right = Waypoint((55.2, 247.2)) item3 = Waypoint((68.5, 226.5)) @@ -47,6 +49,7 @@ class Route(RouteBase): # self.clear_item(item2) self.clear_enemy( door2.set_threshold(3), + door2end.set_threshold(3), # Go through door enemy2left, enemy2right.straight_run(), @@ -58,6 +61,7 @@ class Route(RouteBase): self.clear_enemy( enemy3.straight_run(), ) + # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.243, (57.2, 351.6)) def Herta_SupplyZone_F2_X397Y233(self): """ From 8885d0e791334784abe05c1c5c43e06dddb96cb2 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 02:58:10 +0800 Subject: [PATCH 28/29] Fix: Scroll was never set if only one button is at bottom --- tasks/rogue/event/event.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tasks/rogue/event/event.py b/tasks/rogue/event/event.py index 97daf9ccc..d6aad912a 100644 --- a/tasks/rogue/event/event.py +++ b/tasks/rogue/event/event.py @@ -188,7 +188,11 @@ class RogueEvent(RogueUI): # Only one option, click directly if count == 1: if self.interval_is_reached(CHOOSE_OPTION, interval=2): - self.device.click(self.valid_options[0].prefix_icon) + button = self.valid_options[0].prefix_icon + # Option at bottom + if button.area[1] > 500 and SCROLL_OPTION.appear(main=self): + SCROLL_OPTION.set_bottom(main=self) + self.device.click(button) self.interval_reset(CHOOSE_OPTION, interval=2) return True From da52834bb4f6eff57cc2afbc50531f6757f96e95 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 14 May 2024 03:06:36 +0800 Subject: [PATCH 29/29] Fix: Special match Jarilo_BackwaterPass_F1_X613Y755 before Occurrence_Luofu_DivinationCommission_F2_X425Y791 --- tasks/rogue/route/loader.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tasks/rogue/route/loader.py b/tasks/rogue/route/loader.py index 55b32d27c..ecf78455c 100644 --- a/tasks/rogue/route/loader.py +++ b/tasks/rogue/route/loader.py @@ -196,6 +196,11 @@ class RouteLoader(RogueUI, MinimapWrapper, RouteLoader_, CharacterSwitch): # ('Combat_Luofu_ScalegorgeWaterscape_F1_X415Y261', 0.112, (371.8, 289.4)), # ('Combat_Herta_SupplyZone_F2_X45Y369', 0.104, (11.7, 367.6)) 'Combat_Luofu_DivinationCommission_F1_X97Y457', + # ('Occurrence_Jarilo_BackwaterPass_F1_X613Y755', 0.206, (611.3, 759.0)), + # ('Occurrence_Jarilo_BackwaterPass_F1_X611Y761', 0.206, (611.3, 759.0)), + # ('Occurrence_Luofu_DivinationCommission_F2_X425Y791', 0.105, (429.7, 791.6)) + 'Occurrence_Jarilo_BackwaterPass_F1_X613Y755', + 'Occurrence_Jarilo_BackwaterPass_F1_X611Y761', ] and similarity > 0.15: return True if route.name in [