From a5b77b50dda9149b46381aa052c255f2a153dd13 Mon Sep 17 00:00:00 2001 From: 0O0o0oOoO00 <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Sun, 14 Sep 2025 17:06:37 +0800 Subject: [PATCH] add: migrate gemsfarming --- assets/cn/campaign/my_DOCK_SHIP_DOWN.png | Bin 0 -> 32476 bytes .../my_FLEET_ENTER_FLAGSHIP_HARD_1.png | Bin 0 -> 19131 bytes .../my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png | Bin 0 -> 7327 bytes .../my_FLEET_ENTER_FLAGSHIP_HARD_2.png | Bin 0 -> 19631 bytes .../my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png | Bin 0 -> 7751 bytes assets/cn/campaign/my_FLEET_ENTER_HARD_1.png | Bin 0 -> 18362 bytes .../cn/campaign/my_FLEET_ENTER_HARD_1_3.png | Bin 0 -> 7979 bytes assets/cn/campaign/my_FLEET_ENTER_HARD_2.png | Bin 0 -> 19147 bytes .../cn/campaign/my_FLEET_ENTER_HARD_2_3.png | Bin 0 -> 8804 bytes assets/cn/equipment/old_EQUIP_1.png | Bin 0 -> 7545 bytes assets/cn/equipment/old_EQUIP_2.png | Bin 0 -> 7629 bytes assets/cn/equipment/old_EQUIP_3.png | Bin 0 -> 7522 bytes .../cn/equipment/old_FLEET_DETAIL_CHECK.png | Bin 0 -> 10170 bytes .../cn/equipment/old_FLEET_ENTER_FLAGSHIP.png | Bin 0 -> 6492 bytes config/template.json | 16 + module/campaign/gems_farming.py | 544 ++++++++++++++++++ module/campaign/my_assets.py | 15 + module/config/argument/args.json | 176 ++++++ module/config/argument/argument.yaml | 37 ++ module/config/argument/task.yaml | 2 + module/config/config_generated.py | 16 + module/config/full_config_generated.py | 12 + module/config/i18n/en-US.json | 164 ++++++ module/config/i18n/ja-JP.json | 164 ++++++ module/config/i18n/zh-CN.json | 164 ++++++ module/config/i18n/zh-TW.json | 164 ++++++ module/equipment/old_assets.py | 11 + module/equipment/old_equipment.py | 272 +++++++++ module/equipment/old_equipment_change.py | 168 ++++++ module/equipment/old_fleet_equipment.py | 48 ++ 30 files changed, 1973 insertions(+) create mode 100644 assets/cn/campaign/my_DOCK_SHIP_DOWN.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_HARD_1.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_HARD_2.png create mode 100644 assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png create mode 100644 assets/cn/equipment/old_EQUIP_1.png create mode 100644 assets/cn/equipment/old_EQUIP_2.png create mode 100644 assets/cn/equipment/old_EQUIP_3.png create mode 100644 assets/cn/equipment/old_FLEET_DETAIL_CHECK.png create mode 100644 assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png create mode 100644 module/campaign/my_assets.py create mode 100644 module/equipment/old_assets.py create mode 100644 module/equipment/old_equipment.py create mode 100644 module/equipment/old_equipment_change.py create mode 100644 module/equipment/old_fleet_equipment.py diff --git a/assets/cn/campaign/my_DOCK_SHIP_DOWN.png b/assets/cn/campaign/my_DOCK_SHIP_DOWN.png new file mode 100644 index 0000000000000000000000000000000000000000..412a7c0f7c2f79c087d116471dc54d286cefa4d7 GIT binary patch literal 32476 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 BFYo{W literal 0 HcmV?d00001 diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cadfafc563d5369fadec5237e6b88e5609db3c GIT binary patch literal 19131 zcmeHvS5#Ab^d?rkg5p&H1qBrmq<2t|C@4x*O6WzT_Y&!W*nmqH6p$_=2nnH+K!AiI zy`xEh0HL=)=#W4NlX(9RGi%N3Jk32X=d1;+-#)v3``h~v^+NCIxwAZHSy))kX+C>w zz`}Bh@pydT%xT80KXlxfh2;i|=Ho|3ftf4gkbiEwge~m#!z)@ZSt`Ug0x$R&sk4$1 z$}ujoX70Rxxzak<1!NzrH0f1BoO#Wj3H((&c-_?eWD1w<&usdII;RWfSM~VBQx-W* zd&C0MtZU|6>0k1+0w2$*C5Z9{WH^tV`rDE_zA;OQk2t&3v!#*Z*MKFC18Y>h<`C;WLys=L*oGqL7CTA%o&zrf1cj(39y{}^TZMy%W~o0 zr$y=G5C47o+Wy}!{->TlzVM$@{1*!Ug~ETKz|g?g_S3Yf<1AeCxn0a`CFL`%1r8aG z*<)6e$)f{im}p0{hDU!>qDOqu_V-K{jFOY8z=`njm}&YuVi9l*k;vB`-S^~aB#dO< z_GO)hU0L+sGY$P6(cV)G(YgHO`Qf7~vh>yr5e~u5Z29&yUL)?tddUZtLVS`ksp(BJdb zx}19jsxM(sEuT!0ZZ&W2QhVt6v#Z36{q?>>v?|ZtsMu0=xjP2bDLJE)TBCtJhSWJr z<+ZgB7rX@x!8eUl993&9J_Jg5gPL;Zal{GK{YG5siLUdOr@nTN-%8tx8p7&yKFrk{ z;Hmb=gF>-=#kVf;V|pK5Lm#s$bmGEqY*Z&~PUj~$=yNYNw-}e}X+#T^#zp09L@~u~ zbc$r)gR-9{YrSrq0c;JsT`3hxg9Kub#fX%?4>249-z9TLN0z6zXyxgb%$Mn#kzx1U zX}Q)%&7>~L*{-3-b1epIwCBhB0HTmjetv=priCPdgkl#!meWQQh&Y1q-@y(mpYL|$9lyGXh z%c@fztyjR&UqkKXw~~XE`B$7}(p+EP!?)$@w)%V<$BgKk0mJ5r+Y?5?7jKns`s9P< zhW6(Y3mlf-SInxBVLQ=KBR4q5Upt9l(Nfs=ZsV4*M-Us{csup1tc$;T=@}U>vJ{c7 zthN(hvm!^{N?Z_wgLiEGZw^wrA~uH?;cM=&wCj~`CCG)8MA@avB=?H;w6smVxC$longL^)45|eSYAeDiSuq?QJ<9)O+zLJ;V=6iOk~ne^VU4Mg+r22Tvh;^ zfyf|udRpCY6#W%>fz#7+e4vjt1U)@)DwtfJCz|Hvz9QQUA#oG zWR_=cWa#dPgFk7)oq7$z$MWV=(xWf_CVa-xk%{1oifl3RG#n9S%-24OLKKzKMl*P9 z`l|Pu;-OFTy^f(b!tsXy$?;te4DJX`4Hq97cHWzK9G5{zy(45TZD9ZHh5CZIt5w-T z-;`zHGDvpsmEGray4>YYB=T3XNuywo8r+6QVsR44AoI%APn5F{&t0^!UF_==r+7bl z8795O_EZbc=bkTizVg_3X7lZM?C&@pUbXf-1d)6nv%Xyn5cva|GoKhS;y0ys6KQ7B zKCiHGKFmy-{rdu z%{FaK1hB=&M^D>N&9w&1InRJ#Y#vx-^!7K+R`K~aCFn0k2is{HeK_2#ZqX>i)^ z)GWBTq0TTlGHyuX%WGhQ&uv})TC)$m26M#b#a9I=voNdwUAXKP%4*%Gx)9Y^LOpt_ z1^rrHANcuc<-u6Qq?}&0;>gCv@B}%2Q=2q;1%7ZA-SA$m*HX)hq6pbf?x6)XY4Egb znM`}mcv6l&y*1~`DEp%BY5QzT{b*8;)n_AU#v;0*7Kk-X_M0IR+Nu+~Dt6lg#^zrI z)VW<(wW9uz5D0~y3VI7MKf!QS?>1((OQFWq4GzAG-PqA>*aek_uS@n;`Ggw!q&OcO z5VR!bO8_RMnRA>^aF7i8=yN{!am{cv=)$Bk8RT)I{D>6jVP4cUsNwND`KbtbXpf?QCLmICxeZJ)#`#0N9D1@h^e6A-3*&&U_ZNI z$yY{-y|RShahHZI`t}mHAnlKMr~hUqV}pLzks$a65Z_jpE2ovuv^ZTsT|UQ8 zN#;Ptv7?O7t~%f){*?+kDI(}S+xRuLgV;Cy;Sf*F zf54oRn4_Gm5XWm7d3adP2bMDT;+%tp`Q!V`s@yWFW}XKRLNf(FK$y|oCrk&OVq{i! zyIRdaBzoInE)`!57&mmV0GyD*WWuual1uH;x7M?~h{o9qVV!Mo$p(pYmplMsMzyWi z-GWS}0&eB=E*4e{bVihKDv9lR$K2!c$#6U62`eD%Y`pGDy&`b%vn$LVn@l?Vr}CGs>%>8UEDzoOW=}AycCDtKW`aVDXOL0R~A7i$;fHsQ8*_ z72Xp3R@n|d+5ldY$Pcw%r{AalEi}<* zAF?!FG&xqYGgL4^Co6YJ#x*NG+4IonOHn;j3^iyi9&jt2c#-ZPLSA!Q@VYakRWKO1 zt?s|c7wIr4+uW45a1N!*i`&2VMnX&_lwGmC{|XFMtT~TiNoNQlLMQPnBh*}3;-PMHDy15$* zDQgNs{(Fw<0?N**qBNAlb+#~zwfc-xN=G-7gGH_WWV06HyyfR1I&g2>t^&UOFgGVIXuM$G{|KFN0Febr#{i>pcv zb!$#@wfTO|f_hWa()ETPIoycT$RBC|%*pS{1=1RAenQCpB9wA) z_D1f+7Ie!}K9}uMcYE%s;VcVTHsE_+lc!Lp-b&FUJgel0nDkC=D(tKnnOpVar}z`7Un%eEL4f9kiSQ3` zY?EC5vfUwoZ?-F?q=kq#xfi8>MmYxE?HshDB?1-v@SbCQ;w(OEcWtyoMc4JuC=KZ6 z=iCc=Aas)1e|Yb%=iFtSe;IFe(w++i7oLhmi^cI=Dv3>mV%g_5VCG9y*XRlHza&Nj+*%mR7l=ON$Kyn;CU9MkFr?p3r9_&4xO zU%r?EYNu;axG?0Pp$GvGQ?p-kyv}D%q!WhM!;*k`gW-><(7|2u_D{!|nJ&x^wTDcx zl+-Exmzg1z6)=P44JKK56{)yi=78Tqj;n##&?n86KirH!_D!R#%il{Ob%n=&KP@20 zT$^VNUTB_~7|(KDur9y+2qn^diklX?rK}7kd0X6b!wwtU9PJ{KZl4Dx#_d#I@PY(9 z^@0HEC0nLBn36hOImSRXnm}Oi7JlM4PShfp^qjc4wTBR@i=HvHko0mnI0*QS%df!d z%$O*KR=X%QC ztO-yunWOSFcYDRukGHdTPNBH0vt-fV`mIJ2xZ2OIHt4z>_WuxNCxCLNOS7(H5Xxnu z*NPn_gxxFM3d>_7t6?pJZ9iy#Yl)o+L z*2&jRxy>`nK``gV=7+H155^OX4~UeH1O10?`QTOxVsf1n2taeT(0zxit4{vYUkppUPxt+JEZJ7GF3{cd(8C7X#|a2kAZ{5f8pZr+s`3K zZag;pq9Hz3^L^JxMk54yO1^nICb!)z(>`sGlFwt+>EKu$-3~uW@d9w`uLZvk}fv;h^;C$FTK zdXP`U=YPx5`%UMCspC@*3{Sw%UxE}j5w#W~7mN;VWFPn>f5^!o5&N8=j-ceoWK0i4 z%lvxwUQ;$3OAdQ1AE6dnF!%|Ps2ZR*I6$$xx4?ShTplQ06R?&Sn^o0DQ$@b7(=F+`%W?uVE1W_U(hp( z!2IX}{Y?Lu2i8~aQiami7UWw@9j}P2<0P-lxdjF4;m?l!jw6og_iM*RluwvOfs@CO z{GVlfiYuVMXQO(SB*r`+{lm6YkxcG;g!I6RpY+kz)NvlnLS21Nt{=MHvjaK;B?s!x zSb%#c0}V@+=O%9Q&1JxQFZge%Kjg<`l6gMslAFHqUw({xZo}-DrIOzMKBlH>E zx3@qPkK1R*@iFv_DkJGHq7o6fR}P*&kvRi+k$~K(`ox&d0w8>&)tmOI8_;Do!|i^% z!HR3F|D#nh9DSH8Nx~9wJN+lsQl_9U68f{vgQ2mtJH$xP= z6}kTu%wf1k=TO7TwNwlkaT;--MM%!t|=DN896$ zMvx>&iJBN-N^AbhXYEWBWaht#*^G2(q^Nb!WAYI+wVNIuAMx$Ig=F zjE?SB-K`rK=oMhXmN%6jnDwHkmlRVscTMPB!zb}dvy{7h5?EG=>&<g{VffM(_1ogliyt4&syDh`I3NwSjv=Z0wV{X|?Wak%aX4*@ zE=flj^*khNR8KuN?(JoO=WoQ1zHUtEGnW*X88zqY{-xCih1+aun@WSdFo8KUQ=X(R z9hkkP2A41D!{J#mXCLC#++PR7{!EI%h<^bl3o=Z;YE2>~G;`O-qr^uvUnr-}nH7CS zVcxU&*-r5T=yzGG8>Vt|gNE@6l=K&e$S-iDVuz(nVOQ@SObe5Y5BHb&0)nGUwC~k@ z6xNF+8i7N&)Ks~Tdn!~fKgH^QT|Ci8PC9of&Lj>u4t}Uv_awK1O;FKTCQf1@EPnD9 z1ys5^FQ@>_bLQ()w9egU!h^;U^*^O-eq%0m^F_PDB6M>e&QWuVI7EPYc3l|ogE#fs z!Z*Jf{rZhgm%J}*FCY*y(czdzj3;r_yt03qHhue7Z%|%``5de$2hZ(#OhC8JE`wZc zcPYF~&vWVNEz&M4#@mXDO|(9sp*%aFH5Ro`yVwnC&q(lI@%SFaNT2eeiBPc=d3c2> zD&KrppA*W;J!YwPY5sD7&-cM_ouG@bK%>GhSTtH11dJ>n+|e%?tS&G0)seXEnsa&6 zLNhj5x$Xy)|KEz%R-(p4Wmv?^K0iX}bN8jV(~0R7iMlN-m>0QD%|mfPux}#y1;)y0 zALg!$7EPP2sw?0%uGKo+cwW3ITDyB5zNwN(>hb&A=3<>zqt0Btil@jf+e0<^mvXV8 zlZ)0O4KhjR&t4^n|R41C1rFcs1qgfMo9rHbF6s&CqP2Aj!Va0B`<}g~b zkGvh>0lt@0XXYnTSTPRxpftHP7bPjJk-;rH*XHb10UL)Jsd{nd^vA2|GYrC_r2Q|l zM4rO4hHW{4B_!5Ct0)j`+BTOqv)R{=?z$X13adrcwc`vgNE z%TDxFVPl!G^#niU57DC1hjMOd(a`fmgOUdSE7mOxRzp267$+PrOEkFFKbIOe{B3CW zfDn9$?ac%E#yr_fHl3^AX?I;V@VR`~I*!)-v6(gUfWfm+Kz=vvNyrOGtD39SR-qE} z0dbMeIxZVbpuM0zz3bd+SeXz(uB*iJn)nr_A^s;e-MyD920V`WOquwr;Xd_g-nzZB9#+0=im%e- zO+xXEexGpMePKugUD8#3zHX)lH>q8_85v&DXt=94t)&Qe~649%7R8Pjfaybesa+m+`hTNctb2U%aGLaD! zGC&je=M=%~Uk=KK{yF`UX^ua{;N;yq`#0gmRu7%~+DApTJ*-qcuOednr&_xvTMc5J zj4q`oTb6`*|9W;18K;1Ig?(N;(O|JWUp*G-uE_)QY_@D@mASw@!O0qa`BvkF zxnB|U(M@J#qhDL{gYhepMJC(bzRP|VAIA?BZ5oQ0M2|HQydU>(%O5LvgVEDjnR0V^ zW!eMzap<%Cy(m!S`dEKH4Eia4)GzOnEM+@Wycs>>f1&d`Nh>lj{b_j4YQW6$Gi;NQ zGC!9UHb?(rB)opgUF}TZ{TEfN`AJwEBqro3ghqrI5-DrwqSZYFkf6}Rca0~mofmye zn&)-9FK4(cY}03Tt4l>egu`uhJPYc#)>0GnPgelKm z5$swjF7PU_)=l>JF7n>)S3>;7`EFbgqckKORSgga%a1E5$Rx0>)?-BTI=qhQMc7`| zlsTiVL@Rt`!5(h3PQz|4@0>?{eZFGYmgxTY(R_g4 z44dNTA4SoTad#jOHrhKPJtu4=WOWYf)r9(G0UQHB78LZEB3qf5Xmy3Fqn~Nu(1z@V zPo^P&;RVUdj8}Ri8_uXx>s3#ZGxg5JT5iI zRA5*YF(XDx;Tk|-h4jrfJq|*bh;@JNwOFOiS%l@4ap1YyK}|DS1e|RnJ z+Jq|CN4qVB`e}R7c1`Rfix6vELsGl#g#;XuKCwR}ez=iSpAR=dFjxiGy^sJJ2nO9G z#BPCSPjo(^jL22LLUIm^(>p*!gE3W4BY=oH(4ITKz@=d2)g7iql(fGbJHrwfoiGZX z#QAG0&BADw>&E@ASOsGR9onI%W&|t(wAyGqzVa}@CX*rn!c?y&f zxmBdPaK3YSI(fpleQfzIzn;VN<2gGR+>KXcjXPcMN3`Suy*e~-ah}>*?w|gEA6F~V zti0xNz^|wZ!0{fFY4G?^;|ACZE@aR?$_F zqH`+?wAxw?;UFL0=9VGulZc=ZVKn$#`rxS?vt`(2BDFi{4(diL}BXU?!{v_3l1U7tH>zh~931NU-U2w~9D8D*dI zlxI72YfIw2z=C)@j- zV>f?uj0NyHhwAjr8$JWMUlG=%f&80E6pGcQ1$rG;BK@}b4gpJN`m($5R?^(BI z{L^Z^eo8{sPCg!MluQPbNN96O%zc9msUCJ6-CHvXbX74q6yk2yCmZ8etiV9zowM-P z6QmQ}j<`afj5qv}?{tt?@{L1>JNBW?9X6x6zl|KuX#9aF>^E6XvZ$mUIu91Rfrl00 zyYi?cSfJDnyee0Z9C$C%;r#IAQSDw-{oJ-K%Z>mNjx={#<^C_^PQUZEf&|zFA6_U7mAIVAY1~?zC;O=}lVQ zP6F{oeL87;4^d5THth^A=U9r(NZb4ADkE;6^Lw-&u|)8#>`t?}GySuFJm0ozhk6bO zTqSsB2pP9FsQFwxaJWXM)~$KLs^cySV8HgXU0fMjt%qtnm+22`;(pG=2=LQ&*H+y| zBhCVd$5$j)H@>UcOa&~9S*|Yt63Afg z%ZTGbj&3P#?=Mt52>1pa-7k4HD*kytk&CST>+y`JfQQv}O`np%{)vxfo$AR`O-3X2 zyN~j&njV!{7I5b%$|P>!SEqjSclWOI9`zJV9QGk(khkrxi2BH$n`6BWC4__b)qSbC zNendc*QjyzSca#A{m5~4#(PZ0{_8fdMT>No1q4gK`jbqy6-&;^=2wQ^7u$I-QbQER z{Bd~9L*iWq{pB~*XzBwoBb70>N7?4g;m3nC3bfAN*$7YqsRCTUM-YCGVr+ylf%Snc zSs;>iz?Y6pMJ-FOk`Rt9@0^gh^_rjk@|MHFL0d+Ld9>I^vS9zO3$QcevJso@?oRm_ zy&N0VpSfwyU(8I?KZlsko}Zsuh19I6Bc~tbx@5au779C^EsI9nRQAF8!5MS78BDMt z)!7PpG)u}&@+NaR*=tqmn5B2wlT>f?*qm8y(gjj3DkCr7*2~Ka3Y!>08bha>5Swgy z`5z^8WjRmGq=wv%@wdkG*6ifwcduFsrxm#Dv4_0c==33!vfcmmQ<(RTNX+z7e-ls) z^>JN|!Cg|nR{6)MF}p8DE|EU@hULwIuZ1^hNCXpTd2J!ZRnBJ`^XOa9_g4naG_3*@ zY}W!KH}tyxW^3ZbOQH;_;RNcZ__?dk@a?=^l5-;DRanqaVG$ePc|W`PTn^CyEG>3a z=maOzS`i5AkxkoI(pk_@h{bNxZ=#oEyirenFXXi$cB-UJGTvTiPE5Mv~pJB=&h$}iJ2@84|`tkY%KIV%gJ$P z^vc|j9cm;t9Vep>2YtxEiL8knC&vG99dmE$7T~|A5LrDWKXamCJ6xP|G$jigedtIm zsqngy?2zw%L6b3&F*MO|v<)6R#;r`LYa%ciOA>5fPQ1C2_m*rsXGK%AJbm=_O?Ylrr-7PL4ZaQyqOAcU)C7omKeU zNZg)$y$7;KuFnG|h(NiIL~=&4hF0h>_pFJ+ZAlHX<-0qMoOo2Wj^bR?c--FFR2R~V}ijRz73ho{8uLU0V^u+a3Y5N>V z;k-;OiO0MVx=7Uy(4$mB4N2srpa%w-*PGgWE6%yqd2roU#5;5O(LK7*l>F?O{faF*N`bg~sEuhv^xa38B2}l{H$J4&(;UYG~O)ixg7j zr})ejNLcYkjGgY99ymEODwg<@&|}H#J)`~*Zr^1yGPIaa8Xru6t@sB7REK#KE7Chn z>?PtuGfFeC3$9yoI-eQrI7Ve?A_R$5$?V|MQO}qsFb9J7-1(bzB%SHH%()F|% zditS!v~}GB947D~d%h;RG!q-$*M8sUlY()@Ix5La*MCijhbL{TQy=>^gtEh}NMU0x z4^QgkGDfUrKY>l02_kc5%QF%tr%W<*TF0YGa-7R|EDIH5fqV++RXoC&z`xSPhZ{wq zi^!ITk8x`(pxjhx6AY~P^kI-2WVdFje zQsMp?m4Ew$$&)XO`~5^C`qvlK!hwnJpCin^*eRW{coQmG$#yDEp8%xS653N`#wpDa zT`i-M%9;@y`Z1+-(Q)_m^{=Q#?uhNkp6rec*N}`4?N~Jb$oa%|6bBdts?GyGZKg6e zqZ`v6onnN~|y#C+wOId~VU&VtHtaYO`3dWgt!ruN9Lhca1 zbWgD1vm0&5Z=5ns8oicKkmfAyTX@n^jvwIie_G^}nS&wBy~}&6p0NRN@j$nJ z#QCsL9^q&E^uj>bS$)!Tig6ZWVKUil zU~Dd%<_R3M>rol%_3GleociM6mqi=1oT3{-eiEKHrQ0;7T+Okr%%+2^&W!8uQf8dVQN19 z^+CeKP~U+v+Cjm>r;>Whj6fk~sKb^YO6rA7$%@VqxF{skB;8tLW^#qZ%Rw5Rub9~fROUAlF zpdbftz`~uX^Dt7q-_7AmB+=z*69rmqBfiZp&CK-U)M!LY(nsN{fxZ=eU^bU{mG+bk zuOo}9@OReyArr)9o3aWA@dL&1o_>|mW%A=;A@T4pCB4+uJ%6JA#E zL`PB4dqa0g;Z$nnKBXhkEi!w5FUj6kxgzGAI73Q?!^%c*y<};u_;e&Ud%WIuMZIMI ztI?{+?)2j**sO)7!?;>PNpne7xUm)S^jP)Zb)>=ML^60U-cr^FENxPs(n&ejLZ+{S z3BAW?O1;HER8ohkh&?|xH<=RVvz$};ZH~y@^bMtrzh!9@j^2p0G4z)<`Gufc?%fHo z5}b)z$oAewkKF?lskhn~!orO9qgxSmf6U!?@%TfQ#-!V-6JZvr64=+dsim*AEAtK* zsp!BHWV-*N?0#`PdFxmjVbRUv$wC}@Ul{{i4Vc(Sej5`NL=O7}q^2dnp8`BP;pygg zx;bsEOoBbs;UQTq`+>W}rS-Mh{`Vh`8CPmyHZr`rvY*?twn=V#!~3w0^4$gf>Y{S) zzekme@GEL1UHAvJl`#Ey@Wzm{ps`iTc-yQ~kKmudLH`AY5?@AftnsBnW7Kxb^g~Sd zmsPmwwY#R=t<o$53g35=yTzt#=Y}G9Cb7`3A+rs5p+}htgbZ zvST{~nWMW0u{S*UigpP8m1Q^VCq%Sm{>#y<@S&}7H%V)Vr%_)qw1BBog|H#JLO1#|53=|xMLul1` z3lID@dVT?N0(&W1^d3O*?rUR8?AGgCJN@L~tpIdM02(u+t}MjMlgyf5z`+I}NY#B2 ze^8w%k6tbdeRarXX9K@dyLSnOsD|{HoRzwICwR+*_`7Yivj1;2)@3%4*g1Pl~Oo)S+y_5a~mDXyqq33MaZ>u0yBiis73uZ%g9v=ytj%6==- zH~XR{*M6^{n~IDlpJDPFWnxA># z@4K5A#+4Qy2$#Gl!rO%QBBz!Gi;B*M9vsx|Z*qI8)LEGbiTssH4k*3UZP|qi=j{*D zaq{(oDiiAjWMg;Q`iV(d*r%LtE8uN-g{r!`JSHc{LCQPZIO@Uezr|iRgF1Ed`O@)r zv2G(=wI^i3V>~d3;r`}nQNSLzA}qeZVx zd(--;7EIJC*ko#RTYQzilMNLS`+EZmS(b=7+a$P4*(`=*HU(o{&ufiSVF6W#6AVIX ztZn+q%Y_6buS1Vdoxl4fx3%@AA2TL_T`g^qkg%qx464&D2CJ0g7ib?wvx6D?Bz0JJ z?X0ei--8POI~jcUXWxx`)@&Y7g2 zcaB{~c}wyKR02-o$-M0vr466MQyec%APKhasJWXV0egpbo83b5*TOFIIrOIu6oB=# zY_1dqH!?CX<8op<#z-bRfX@aO%x|Dtm3cI2eryTzZX;o ze(h4(HS`m}eSOX)$J=e4m?KT*sf;B$@kT~FTWOr=RwS+sAV~7~PvII1?^SgTm2C_7 z!z;+sqGwX4>z=Qy0s^fRt%HLrOWal)wwxfvgRK<9pzFvY$}UpZXgL`WEzaWU?GEnXf*DCKAzV_0%w>ouDqc}36fV9)b_NTj}3lt(%5)M3i} zEWPldF%49hjjC&V+=6k24ZSVl5S2)z^O8*H?iRf&XL;X8CMG4DGAOMel}*k!bl+R{ zRWU~k8JtYhUTuLCurSu4U${xkar**hO3k+$`uu)Jlg!^)O>&74-!1-pqzbtLu_0x=QD}5g zXk4su;QWes^Fy>5)4rL~G^ewS7ysRh|MhJg$#$~4fSn`50;^!uh)oc6aM|469e+MW z5acoCjI7p(8*IZ`_KJOopKH;g<{N3Ihy!dTR-YGC`0q!V`&f0<1Oz%m^2#p_b18l;j)kY@gT+lkOE zVr(C)p@%hZD3t%z;Im%ayb2cwkNlriu8z+Eo`X=Di}AP>=Dx8kk}&|dgwzd$Te$oB z&J!Cue%i8mlTr%CGM3v!6=~Gj)XnE>_RKRU4cG6fK4xsycs8|Cd`sq8FWpT^e+v{K zwW$736+YB>$^Gt0`Cy;@g780}x;HIzpMpqrb?D|2VR(rRKPdyU5#Kex=8Vc_+hA-u z1qNx`9Ohf>Z(@z8#YUl~e3CS&axZ1Q*voKx5l7=sb)TeU6aObuvU4)=f=l}T!&0b7 z^4e<0Yfg{e+?}np^!EJetthWhKfkvOm>qyY!gsW5d*&EpX8IRfEAH&t8@;CzTUify ztQ1gWC}}=l&Mh8Y+qHSGRGMOc({iWAXzRN%wQQXe;(50V$N1`}E+l<|V1i02^n3Ib z9@<^1j0cNjcSCX?)K=%H{Q1=Q&GSpg7}4H|>$afdc}rCv5Y}dXz8~OnJG~=Be=*M9 z7>vj(r4J&|n{FBH0qn7xDkeckLb7g>4cA7~NQR$ILP*;DTS2rTUO?j3pDg)&c};Ua z036L!F$>E>fb@y~KK}iqivPH@Ue4@pEln(_*AO3%%oFea-U>26MuFU@n@SijM z7by>!Y2d$X@L#HA`oVwY;J;eQ#9{y8f&Xvtz<(IvKMe4Ynfw3WU;wBG>$LH)2=-AI Q0`m~fCwh-d)Ly>(Usg*~_y7O^ literal 0 HcmV?d00001 diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png new file mode 100644 index 0000000000000000000000000000000000000000..29a02b1525779a465c7be649a1d09143a597508a GIT binary patch literal 7327 zcmeHKi&s-e9-ahLPyu^52UtK*TclK8LLpIJTG2?W(Ap{}5I_)GizGY~9!bD1P|72= zD#2o*tLtk~ltu^$Bq<0{BLvqXqyZ9%5HSP-m;^{jb}n}RiJs(~oVhb|=kfdI`+eWs zvd_bD7VGWT0{|?-4u&29U=4gk516fmg@7`83>K)&Be+jMW544RteB?kJ-ioyCi(_l z0`jUk@!;`H04yIOf7HbtmJR?oejFCM_bW19G3t@;kaDH)<9AW=NTU-hveWG%rMoP1^w)7JF)pokkFhOfaUy-&+&n?)1*q z9tNOpTuajlh^l4P6FhmF$rs=eDDP1clSrR(SG6U)at%fJ5*_Q`-{yDtk zm+BS$DKx`i`lQGFAY=ts-TBfC#F4gb==j3H-I{6=n5Z^Ri^7V>BSghv2V zfc=p}GtghE{DFRAK4YbI4)@L(MAPLp0HM8P1T!MbS zPbv4}G_vCU&HF@B)Z1O*t5>Ub*O6<+GW_^t(6`0P))pKjZCsAXU)zn3@7|8d9&nkY5PEq0b5Ly-a=gO@*_KKu;V%+(h!C;bj)7O8{r-35E5HP(IDO)nIYos{eKi7=J;+BBB}R5 zV&h90azKK^$h7H+i}}RsV|Hq%AM!PwoGfIvGGw;E>6jrPYy>Ge)6y94Z z@GsB|8JyVKG+&$Y1w{ZIE6iT9{660kZ3evE;CXDB*69X`>>4ZCLLWJsJCe(CxB6<6yJHL{pymR^aTBQpQ^GX)R@5pw-*x#^Ck%E29A6mm=|`rZrW!%oHM;@X z_@~G=txs5fMnbK9H2eJCCBB9St~U81(~yoXb8@DaO=7 z;CsY+^@?&?C08(?*9cO&F=A>vC8tA}8vIny5^*ezz~~lDpfsbMDJRF|LmW#;MwY;7 zXY}UDAI+)dJxfZ}#Dwy>m0^U92HaJuxcck|G46N^F;zR1FkDWyx>R3pg(0wt(nL$@ zklnR{7hj}pEV6Q1s5^kAauPYxeHO%>Ao2ebl;p^qd=*X@n(4iiExo4db>T?;P=XZFh+Wcpt@uo~5547KdVOt* zXB7Z(c1R*5O%oP+PC6L;`BVn0*5SLSlQL;v;SJIuNsJ;OAYjr2-j|WYCWqhnI+o;= z$Yhh6Dru34I#F#D<^XqYX0xn(^bohqW~_>~aMPT^+>4|Rk{C+I-bdL_2C`*y{tMa{ zzJ_X=Wx;GRx~f>YuU$Ht8v_8|2ks#L^p|U!HC2@MN}5zXT26tmS@I|P)WT}XI&cor zgbylypFOujSJ^yUM4{umv_*5u_Vi!VvwZ+~jtJNFw~kDC-8?2(H+`#LGjNj?lhzmk zvm*(~4!4S}ie2O4{w5mXKMMglYhS)`99d%r;!hxG-J(3H%YG!To7YtZx3ojz99k6{ zN`ytmStm#kB!jTm1Y4;=S(c?EuCK}%ucGgwZBQr>?65k%ApF_4feb}!kT%irsHSe7 z;-vL$Ux;oS4FtgZJp|v>wgS#W4}#UBGx_N=ugzNP^ekb=P(Ck4Kjnx5SP$f#>E-1< zB`w6DON;5$pV9UQg%6CYwJ*0OGZS~b59M|f401dzZH(c#AAeD2qv-P@q*u4F+GYka>Ly?@%Ky>pPWQ5>D&JQ`d zv+e2inq>0_h<5&gz?GtmvgYUBo~oQBXf9EXb2b7l(;6`cbx$$p>h`yNCBFan2JqKs zjkQmk1r$UCxf-sWp8aZ(wD^(a+A5rfU?aB4EANH)4S#lAOnFaP%jYLFVa0*R756)K zy}42Z=@kZFlH7ON@vC%hQj-vHJ`IY0kf^KI3z(p8TF1;>!ktR1A{o`y(K zN?eU<_iF`q;7xHfp$hybJq3(G-%rRG{xxLNPog!55uWFdDPy05<*aM00+riU1wh+eU#$J+> zuy7swb%sM_<5 zmFTE!t!?74s63y(+uP1F(lBCT3W=YL!1t)s7m)mYQLKpdmR0$s+M$S$G#0$9AXWf> zUGC7t04VhSs|xXhKQm-|0Bk`{)!1nS!N>$-Iv6#_nK?2Ial)XZwu3t$Ic$( zJhwsF1>}}^IZQ+2(`1qn1+_wDoV|~m$&36D;|3V$*;|JFF#6ypPh3}`w zfxq_Gd3FAC`|ElZ->LmI+MMr?{q=?d-yvXmEPLkPm;bwU|6Us)7yeC|f8k;u8vljL zf6K)FJ@~go{y#$xPVUVd2%2KdlHg*zw7uTQVsXqtKEAD$OMHhWo^m+G%UnDXL~ka+ z`%N6u)t#?E;6IIoy%@49FsY4bNd#J}^h=62NijJI(v&(IBx|gb3ONN^U4Xy!lw_fk z+>PFPzV5RUX&d21${Jgh2TU$Ew$z0-E5f(+NbhlkppD1|+Zhj1-AaCl^K{HT_OBXf zjVZ#uXt>tZSbbi$OO4*TD`nJekQX-RAhR~cKys`BE`~b6e~wQa&q6CucNa7=h%WEL zf=1e}xW!ytEDIy=EL7NQBEUgn>XOF(&_Q+1Ls>+dPwY%bkG*s^WbIdY3IPMKRw^7-`LsRp z$diPj^9gCEz9esMkv)jwC>4Z!$Ls#s!D;6&_Ik(v=u3QAouKfjS}B>>$fzyoqt%Z4 z?fu`NKm1*84{ldMBm1MXuT1>XBW%5diSy+vmPT%LNL58PBMr942NJw(Oa@HwOmS?XVyOgbDM_t&{H8d*!)IE1xj9l< z_1R-DV)?h`G^M82)o)9ej|d$~yp$d*WWy3oaIdM-=j=?(PapH->Vy)-bhgaX5!-lU zVFWrsu`;E%m(|fwAjHS__59bPXfq+BXdc@hnMCsBd2;0;(EYb}bH zV~!OxiC6F5!*i%OnBQ2to*cG8|Ff$U;h}y?PjLowHa@#!x?v@$7KZ1bIgu>2K;jk? zrfCXO-MeCOu(|qsz}C-}+)YGCpH%r+yydqR+6*S(yn!p2c_WA}!kszR()xK#pOL=)9iz%Y#o6+64r=L-aj{%#27t6y%-7!i3@+odlQXn(?E zH2fbsUql`yr-R#vC@GNWAjR)R=O?mz<4K4nOYy3Wk3EV4ton^sSF*G}5zAX5F~=B` zBnWuPV0?E0 zu1u*rj)pNKOcurORm+AV5G9yYT6Em6WD=OaNaw}nhveAOUbEYf>urH+gInL0yjl7!@`>?1{Tcz3 z{EiACdV8S*VfNvmipt9*BvRL8sV$Pt@xkv_H%SXxEb7*2DKy;u>{H7Fx+IjW=wm+p z_kM9uJF~xj=^0mU`H}3YIdkV$9tz+7qAyF(WAv@*12&Ta*SCAXaR4;HMw z(n#8P%V`|X!w|kY#~`er-q{N#$oTR_;EPWo;uesefG+&*Av|FGN4!POQ;Z>) z5G4Ad=+)K3&-Adx+f0}P;Wuj-?JPy`j>~mQAnkSmWhwIQAAJ1v-m9w-iJH5rpGuXm zoO}n9DqCZc>ePxHWBM-MT|E_)JkmrWaF;KsH|h28yWJ>7J72+_V?>H-2sV03ubh)@ zW<`j0*Sgh+kG;8+cBlJMby8Z$-sv7IHvWr}ya7@I)fM|7e=Z`{pxiG+FUVT#9^5qs z|K04b;H=1io42v#X@B7#+j_EK$H)A9k4+JLryd_~G?p-~N!a`)r11RlcWh=PtF(Q|deZZ(uB+hI`CTwi8`Xuac=ki+Bk%7s2-_MUN30dCF1LmH^i zV5e6r>Q+pu?~bb~OG#Fqu9Z)&)xsVv zc=mJ!7IOA#QP7uW+qq*+%t(y=@Oy8Mwqd;9-iBtHMF4IDiW<~`=_V==MkVApC~8*_R;J`o4clI zk3%h~;j@2({-;f;@M_l7p1RBD46VZjHZ+y{U&4PC#r!JOvxoM_{e+3H)tW-PtxpYK zjCMg%7hT7^X`2FiE)&={|H0NdZ2{E~-ANSl>T?M1x@-MaI~t!d%c^ra_2rndWu-$o z-Oo9_0aE4Y1Qr(@Qyi9GEDi`whxZeD#1&wiAF#dYO=ZEcq@^@ndhDQ)Fw#vC2=lc( zP<9K4ipXE2iTdDenF731uF6D7uN_^*JNRn+nSRfyCblyUg zGHNIK1nOEZT+HIv>r(wJB?h1yQjr*@{h!ZBdu5#8jNb=a3YzXZkkT?p$jOKww0vuo zZfrAiRc$8;B(7AH+%CWN6!qgiTJd*d5X{;xO7%fZO*g;$a4Ok^^H4I!a=0oYLbf^v zT6x!*Y*;Um1f;ya{Qjw5T|Vo8F6~vCw=h)8EVJwa4^bQ@t~*Q3mNrVCs?3~obmzI7 zsVAo;!Gh?0b21T}dJ->Kk3fTo*M3a+El==qb+ejz52I}(19ll41%YR*wy1nFkgKIi zBSLz9WjwEAc_1pl$|46omndN6c7^tPch|~I#jc{;Wox9zNZO>9>hjs8uByeb$9-ax zaG@?=#bYiZO0y?c)Nv;c2vb&tn|BZWxs9b+OpL zOBE3sCS^Y{H+b}5_-|@k-EleIK`Jtpq)4QVz}@vq`#~9>RvGikvHo`HQJ#&ieASX#Q5MXSyVyE*PCgTt~R>~+_~s@QE4e*>qv$l$1& zBv0IT_M41n%hY_+5D8`v25NjQ5MtogzFdN|K7JLz|0H3)13|4Du=W+3qwIEDtfq%P zU29S`GfHa$QZ@f*_GIHnaoUD%=?3#hG)mPR;aQ`u?OPALgQVA&>xb(hy_g!Y42-vFGcw8k1WD71Da#6m6mo^RNotz7Ms*i>8$_!BckCQ zJL31doUvzWrU^m=vv?I1AsrpK^>7sj;=3&~v(zIbR#rzHx^Ahomzr62vTZxL;Z|Tn z=`nLJGgP0Dc)#kB1SV6*$h_+>v3qBrBfdlkdIMN>NZ=b-i`iHLmqf zY=)BX`FDNduNTkVKUc5sN?7d#nG7okt8bVA@}s`Ses*cjAKQ5WHj0Bvkov$4(E*xg zJC@TNDzlcv!g3EoVAdDeUvYN@S*e*q$_Fm5W%h84^JTJHt|>y+_Ab~-W!ROLbZV&0 zd82TTF?aZ>vEgS0>xf?b4;lkP2HOiIiIGj6C);%*&7IjDGcL~xO;rx@4&L-QD*kH~@=yw%C?C-LH<8U-!oh+V=d|)$gnK4$<{t#@UDtETDe}v{Hx#^aX4qq? zi&Vv2Hfb*%(te&2Rb`4x*?b@=;MNW44vuAPL%)Lp4Z4yd#>z%j~brQ|GUsSY-G zHC*k4A)p5Jf&7v}|1k%kU7P zfs32*>V0!}XW8Nn(5;R5+PIxYYrl1WEyUDa$Bf`pT_%430dkMSNX ztw~M=E$f0}(mciM;)G!=CoF`uz2eNl#>8kRx(@l?B)ptqHdNrNd|U7RLxr__>!@!btiIXps5T}@tYDddix1X=d*Nvj`>AJrMd#y7o%J@rsZwZAH(qcRf|UTlCeE>AmE zj`^eP_^C<{&4_BLxQ_EWxq3$z#({h|NI$I7;88J5c9%%TTJDz=W#x5 zjAgo}Lf=r?^FO=5?<3)AFj0YmUWiSAQ3wdNHntJqb7xEwZ)?KxZ?BM}6A88QrA$y~ znQ+I@op$ElvIw!PqE!vdq`I}7VRdw?i2w!Z_O>`zm#_W;m>Abjpi>~V9Idq})M#<_ z2);_vNzK2*kGCl_HOtCT=Rzbs-#uq9xTc`Qt2omj!tmnIRBGDQs{6_$e2PbY2FwQB z&QVyD$`ST!v#+@~X!*M#4CE5H!_-WKry+Yv+{mf@nb<<^8dAcrMR-7njhm<_Da`jL zthY6R>&1&_5H7eN;c8q&uM(eJmXkz+6*-&wW2JfJf$04rG3wB-*K1=J#MU&T|Hs8mrhWb?NK+!tk)Sqx!sFSb%=rc#htB%O6WUKT#x*_4tcq2 zyFqGouFaBdv?TXvF4G}yXOD|NPP6`5=cr*_S^N{zyYd~1OX;t@^VZK;dip)1FxtkH zlna%l_vR@bCYJRBjDV?eN|!u#wkVtueM;RT{jmVcI}<8m*9k@ky)K)v_8gCF z>JHgkWP-5$b!EtAVal6Vl^pFg4@%0{n(6Zw{SYIO+mDvvcyTMR)mu;h_?4xGM$C;| z;&Ncb)C65w{zkEbk;7Z{sOZyrhLo2aUh|m^gwv%fH&nZ~ub7017)!2L8C7Ye)@5Uq z&JL*GYqvUswvwcUy0K@gb_dvn4cdJbtuFHt`v5Pp0B2mMWDm%{rX}wE95a5qWSp|J z<8BBTgOB629s#W9M=w{Nx;KD@7*Jfmy|pffsZ5Q;2R$&mek{m0_;%JYZieZnI4$B6 zon)z^RkhwRcf?KcZX_l( z#YCQyp1NM{oUzPsL8B~sLnH74ms`M1tlwTk#!`M<%BkA;)l+#uy>?gDbkH(@usq;1 zxD-|+5JRzkbyE^nGe4Fz{32?Av5fZdhx)gN#%pW2?nMi7tlwuT9V9Lo(0f>K($-mu zy=upQG-^$VDE^KTn@s2e9*>W^y?h(KMVn&zI<`{ z#T?c6R{>(E5oL22)M!hbq8TgS_pT2Q*mOO12H`%~7uX(afPzI^ILv+yeEY2tH{d*q zZK#qAa>o!hQs0lR_GE;u)yANH2DII_Nw}>|VNCkjNlT$Fck%-Xa=upO0@_lLGtetcJrh6KP}(QXRrMDpS@B910tpU1@H+LQ~AoX}|Cs@d>g@b4Vd2 zEq=rhhuxYbt6M02*Pj7tKtxJuLoTWO8RdRO4yTtxpvI~trf%#g3JMBNMf=XUNQH|= z>6CO|c1anw9-UI2Vp=I1kdbTN0H~E7U;0IEy<$9kgscqF$uZWqn#-W|*TP))tPJiG zmu;oOa49>Ac`^OZQxc}gw_a(*=fx`k2ZlOzZ9l_k3%Yg9HNv!7nDYIurGwWPfTEY& z02u-Q%Ck986h3;UhZAM4kfvygcILM?)O#tV7SJ)@(1TZrfX54?%V?_h`i>^M)lU5% zJf-YRnX`wWJt8@}P96zu3@U;ao+3;xeOD@)$*et&&S9Ua%I(s!J8fLHnQdfZ1IWR-Cq6?FIJ zXDA&Qcr-p_THgCQRmSyGp)?XLJw!1X7y0?IAsU4W5q%KtDlKaiQlGT;35I7~0(c?1 zX{51AG>|*$#7qywpN@$rRySM}i&dsanB69zG6B_9jJ9DFyE`7Ir_g5(+3i@#g6lV} zM|Xm+>HuVSo@oV0BXk3S+oTgfi2s`fpoCAjTeVM7^~Y=|Sbx^jH*0q#1q7-G9Ji5P z+9C7VnR|6*$J$s@@hIHlo&D!R0?(DG=;0MF=7LXGn#pMBsx4bLyGfQ0H_WRLqtEik zH8iS%TY7R7HW}2HAZH`Jg1OSK(kEoQ`&926r2tnCVt|0y7~^c)=gUaj^^?(}82Hjg z>zA^)elyXICb- zwa8kKisVVh_F(v{%+T(lYHvdyTd6pbey3WkA_K0AWLBq1$f`l`uI+p1rljzZ=P{P3 zLPyISB<{1C8``Dk6#nnS-bc;>RoC09jPL73pZ^3Nqm|4yp+Oju*3K80Em}8tRD_5>G-w6}!5`@Dp+5Itl@|#`R z)~p;{uW!aLH6zN$l+&(QYIC#RwS5yI)!-Y%Zfm+tA(DVca>%G+aRbcrN0T>$GRjV{ za04vE>$n;w`-0Uzu1yzjj`o50GUh38yOktCZ-ff%&mOuDZZrANqL$oq9IoHcOc%C zuonamaGlV=iULy6B?{B$(FE5OyF5Kn{xNdzVV-zaZp}_nMGMq#L16zJ?(_fg_3#R8 zSW?d{C)iHX?HKEq#w(HZkDd7NiWFUyw%h-V4C!L~ibi7sIm1rsPRbr+Ei2c{5LWgb za-_T7)IgL!KJ;2RcW0%fAh1w6v=tIft1*9}fzOGx76?c(ZP4_W6Q{}9}uqXRL zVgcqWoryxB;pIuAec^>%!m!6qH3>$0j;vmiE%0OBQ)yjTDsst-ujL2vj1E2BC)>t= z(4489(KS%mGUJO5@I7F0jgQoqwLN8JY5rn?WaCtsqC+xuIe2g;Bss3o*Jo)aH$ zNac26J=Q)hm5n}oO-dv#L>mhWL=+d3qRtDv>+lT;l%jn}4v(t)e8INs)}lC;HbKQZ zJ^teRq}O^r(=9}5WzOqQw^Dikv;W8ehca&s9LmMA7bMj^-R7-;Dt*^D2HA?Wt?ass z9e-)p9DS|yk~Re6u+|%Rb7kyw-MzGg)}2qfkFacy zH%j#6Nr$Wm`RA`ps|TR%pH4=GuFNhrk5$tw>9vZ5<~ebOImEU4mpco{fyE|iS253F zYE0~xQIIH01yW=}OV49mYl-3R;LoSOFF>6eR;sae0=;z zMbFHTZll5cjL*D7%3}3ya+>W#+TB}||K0L^S*jn_9yIbCvM_+dQV|PkMOLXMR^#=; z;3mf@rv2+H74V;MG=N0%<9<1!1tP}Ee1@GF+fF1!UCB@vqHlGPzRp!Y;`PMcD)i5pJ@n}F(hm1`!qIO7pB?LHj_RHh^jfdLiN>g;2G1>omYU#8@E>EcS`=dx#{dw0P+~wwCjQa4 z9&Eaz(YGblK{egAx?#0np!LrL)gK!TepMH}HcK!Gn3Dm_ft>iArjgjX)Gx|YG2bu zSt2}2$uCDYYjsYJuZ!<)>kr@tyyIxG}U?K$2q^6 zX0Kj-9%qUe=$(wMyoo(Gqqzs5As~=I4gt!P^@lusLM2Fb#?eQL?%$Xx?tKE`UOBDz zI@71dW%atD`3lbEiho>1uT#7m&#gr^FrJMZsjmtXTR!A)U?v939Z z8#v*Cg65FMRho8fH$pF2u?*JS^5aA5HYcjmad}qC#PxtiK_40r*heW2gBu__?u_mD zV16tJar@87JJS&()7eQgj@e}rA;uFL9Q=#zxwl#efRdx{yC3SC(zP|>!_xx^O-5-%`}qf zAv&q{azxPKP*zlm90tM8#_#38GI0hLOd28veR?gQQ>EBL}AWrJ+vT$@48 zkr2KR@5}@3wHk?0UEz{oaK}`T>7y%oKRe_vyU6!7$12%EwAz(PN-v3n9YsW{7p5Wa;;d|uR1rt15JJ8e$tRC1X zHkp?FxFIjRKlkvXODi~{Fk<^A_06uCO9k3l4Hs1Dvo`g5yDy@UI+C;?fbGlQSbFjJ z6B5wsrMkZ8>k;1{U$Y*`x`qFuIA!AczxP7U;kjyYRx`N&0f+c@Gc-$V}NlogT|an>jzL-Z=2%rx^yOgd3JtA z=dtnYHq15v4K1H3;5Hc*kF`iitRWdWx+}ba(8ig~Y);NNJc!(geoJiAx5W5lT77sf z)1g^hGI4gdWxx9|1&Z=td2@ej7&ba)602q0S6zxjZk@$#qr zLXlijPy&gMR}1{!#QGs0Zjd|oGhlN;Gg;F^4NAI!EkT!eN*^imJUjRCWTTW+PCq%P z1L)lwO=Zb%bM7ux4p|L`1qcKn+?DBlXvHpXA;HE~%+|@wrzaY-AA35?sIh|6(8ejU zm_iHw2@i^UN00<uRrvRT>&Ah7;Bu=7&ccFnjbmz3ihR)U&7mxEK2)Pbl3wMBk`IWWc^W2=$GhUyN4_IMzkPOHBA z+(Q4K=aL0*AmgZ_@vD7pWd({59!={-S^&)Cu0U5!Ij!1(z2PYPIAZLGQ#!bt-WPn) z+2uDy`+nK#{B+*}?}dvQ17n>UObQq~mzxnP!p_OMSNz&GYS4|km_MSbhCR(YwhbTf z!@U`MVmE}Cxr!C*6PmR$w3_p%8IP!W5*So(bL52KMbWmxGCuv< z*m;-`R$s5VyfAVtTEq|h7L{pbsi1Qxm&?vm-9u~%*d7dbcO6g;UZMxpN`ln5_HxGH z)U_q^Nvb}WU$#Ol`b4rc_v2jdv&TO7S9=9;RoE7+uX}*U=BTpW0gL?6lpobOI{JY4 z_dk>Wf(rX~^-86oLx;DG@xbqfllAo)DVvBiEwViJ*qm=`$fesARX%5e*gYYr-0nTS z3a(VRTtbLkKX^LqxS?%MIOex7TDMakvh+zed0Rf5JDb=atE+codYLSQf1_EzxUg(C z2e_b{Q?YKJo?=RZ^+GgXmvNKRcpoP)%4^PT?&>L%>Fy^I+e%86GWXC-yry?B3uK z82iTs#%@XQM@nlk3k1sT@Lm@>(Qfe+hc?zsgaW8P!>Td8N8Vbz(s1@_GE&hX&%`BD zT{(FK*Cf}*@$tvkh#DVbsy;(xrhoEPZ&|7pirbsMo?F8y`pS5E6Wd=OjZfB->zVp3 zFd*SphHiA6>1(*VI_!N180X(A-gm7teaGDKYdFkYBI`s`dN}xE=7B1`h~kEeAZ%}? zWAKt6Ez6S8K0jtBpDKI0^JJsW;{mts!n>@E-=*F{kNPXqt;$cLqkW}^U@|NH5O6DY zIiEFsVQS)>$%=-FTT}MI?@{ks#aSfkgD+G)3mO+I>>tWh9V}l zQ2HYZkd^Up)mW$JkIOP9HtEWpXwShuX#2ET4&@d~WJ?r1vOQ{n-xxO3$Bp>Rj028_ z^uwatA=ep<^=P;9%AJn2;24k)haUE5aMI2_Mo^{P= z*zKK^lbT)m+Hf!OR1}lw*TQqmj{sQTYRP^pd@&{>Crc)v-7kL2)*P5T%AMt1zb69L z9#ET!?;0ux%5-7#Z|Gsy58>lCu|a46$sL{y2!+f4N@>0sM%U<4UG@{F5PxirAMeud zg&s;}9XGO-`!o|-(K+tNHAGl_9I0IphIW z9y7+Ttqr4rIhr9itB)(K&m*h=sTBM47*HK=S8oG}E#XEFT>hG}^% z(R1rm!cxmkV7z8@PCBTvxw2HLc@1gj0SIjpH(Wa+H5U(<020~wf&JQ?)t3`FS6p2g zrv+xoM6k9yzog`-QBpdBCA&nvy7q4KT=K@$KV7E1Y6pK{)bo5f zAI$1wnpS?$Eoasvj1s&HP)c#Plh3hY>>mpe@`b3k&p z4QzAkc2bAssc{SnotpYiLJ;A0!*A8@(6cB~;ITufv3*HY+pRg<>-g*hgAug?n6UGXLo3T3 zt3q4vsnoT#&Pc`>ALB<%It)!PHA>~df)?j9?rGjT11N(Xe&h9$<20M8mA;{!?!HV8GW=K!zgr_bT@0`*W6IicLD^nbp4CgW@4hbzk@7sY0-rhYmF|G3Lr(610=22R=4)@#3MB}w{qmSUdZpqm z3s~&E%8_G$;jI7k(0&hIZtQPhfaIXq9<&DJK;r$w4@&2qH1DM#DqXa~jz(-dA3HRF zZ&?csc;LHzkNDfpw2JLcQW?H|?T8n&o8Ci9k7sRU2`)y?VW=+|?N{Ne;^Q&jdqVpf zHs%5ebOG!>n2g|UO{G!@aA|d%b{DidO8xfOn;4BV7!WVO`op?1Ff|%7$DXwkb-76S zjjR~io;Zi)$6C$$ep@i@8i{O7v1{J+H8;%dpe7Cgv)Q~DzzLEN>);JjWuASH$`_E1 zKj5)-WOMc8_p1kwd4GM8Qu5E~_4m)EmA!bG~HOnqobWAQk+_w?xS9PbD4j zkJj%x5}zg>%+(pxFUvZX|Ai!;YCEKyby%%iz%@&#@zol9yxUil^wKBhZ#lT3y}yr_ zm)FPV&s(T-aZ@Yo&D~-dBjt?5s@?96q~NK*YM)4o)<+dWNhPHD0)uh7F`mtC=uQ_iaI#XnUU(3)vns@p=258t@uK8)VC&DcdK{>ta=b`r0JfT zIgP%=hSc8J#%|~K^aqEeVsxvc>Q@+Cz3t?PwLBwo^tP?IZr6NZL@6_Vr_Y1y0E|FK z9yt1#FV;fm=rEz=cp#;2ybc8!U=7e~TyocsYy9SIc9xT% zx5%KP%t{j%6`cFz+Ezz`Cpl^%y(FB#6f$fOZ7VLb&#R$KAvKinT>qh_lU+-rk{x@K zUl8#OL;tCcVFt0MU>s4h8}oRjyYS*&y0u__#~7@{1m*L5sVT~o~S-x?gX|GmlPLCdkEoB7Fbyw(f# zn9X2wg|?Ehp;?{9dRAWqgvpdI8qeye6|V%`3{5D`;p(sOf_N8`)IKC_2)j8&P@@ya z@q2g4aS>`__u4-%j<top8s!L zc$eK-O?p$*TxfZ%fn9`E1wJt5Ze@Gj8V}6QDiwmy)KHnFq+d?AoTK97;L-yNn(sCm zcf%Zh_G@uK%;jt!GH*1GPOH4Zvs2GD$5~CT{1GVmL!}@jDs&{y-$B`W7@hU@KHSNx z(5XRh^;bwWW<7H(AR|2#)10CZXmJHTT5zYqDTv#zFS|#~#tO~CR&Vmgw}Cn3n20{@ z{h1OYn3FIcDm(sHd#Kh5yo~cuO;FAi1sk1kqR;7RClB?@zZm)~g{$ZTQ(laJSw*+E z1Q)6uS)#`!LZt?7ilUhx5Ronqt`zU|T6*ZabVN5NO)}+eiESf*Da2f1-17)`m#|YE ztcv)&%$W9j7mRabGbwpb!IHwR1ut6f$W&3YjdvGzVb@%lXFrzkP3K z8n$!YrWiwO6_6t+t8QMBx7;x-IDHf-#Q7IY9s}VoFQs{pDZzJ^Je_$=Jx?tyLGH@? znA_sJb?2)SCOwW{YpkNopSPD}^bf~EEb`YDSG-0S`fzP*K| z!1fhww#SXEj#>Fu?nc47Of@A{0W)01E%(=Rjp#BOJADL&CPe~OZ}q}|cYA&h6u_H) zbUD1LRH4fIoqgpn%3{32)+$rcj($km-`4-_-`MJxo(b;dT@wL1_p~K8`^y(Hqm<#; zBnf2?U<#K~;z2g)ZnPS2^G0O=2tzquHedAI%x3AEo6JzJqHWKj<{uV>xEiT@1gjyO za95Jg(O1NK=0#~G7UGZhgcIDm4P8u}nqRbDU2IHEU<*!BF>D&)I8HrT;YGjEb;Sr# zElNmc+RI|gnA7UY>@yjk8yswZadc`d_CFDBDaL>5F|k}w$YX88hrBxk_;lNT>V_jI zv$Q+$I{|;2Jk!p3f-UA9=~tNn)#~sM=S^G@x=d@l1nrLBb!YDi32vfw0??JasFvt} z(_vtu#+ZFxN~7nWutz$k{@SbnlcX+&r52`GS4K~k5QNK%JXL(@1n)x{cN*dlWIaV~ ziZEQxpW8W(gDriO%0Ye$WA7AuRSM(|mf33yz*e>$_T~j}ACouTysn|@Ty|anG3P5D zILC*Qq}woio!A~Wwah7@K*EPg^mYx(@nZY+o>D}>jE(D2s7sLEwPVg&d~&K-;c}sf zi@z((KxF9xCmB_o@Ki+^&F8J#jVR~u8aR<09HFRWdc|(kFHY;%VG28~o)AoV51 z3_ZfB_FQg>Fw79Zv~w~sCb`NUOrPzuWAz*CVcM^2b$o!)VJYSWB(k|=Uqz{c!ng#H zQ!t)tW*1K5jKBRT5tfoK+p*{^iqJT)mlGACix~?b$gDR7a7o64Ll-i-g6{@Wpo@9t z#mq?}tA1;40JOz!@=lfCJkpgFz&NS@2@(z$*)6D5chl29$TjRx2hPzzAo<7Ug6D&VC(~SRhOr-tQH57c3KNXvfm4k9p>$j zfEkp{Kq2v}_|M|Ij8qRMmEt`MWDvVqj)4!a){_J^T}Aqk2o;&GDU?8$6)g!lSylOb z)(t?u)7NPh6K-L%`Tt_>eq;{uuDIna&urZSI$a+7&|iGO&+TrR$NTH6tp9xy8(z;e0=|2hJSP6Uu5_f82^QWf06KCB>evm3Bg8t+L(Hx=jA7!g8S!x$JoNC J^45c={|BnJTL%CD literal 0 HcmV?d00001 diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png new file mode 100644 index 0000000000000000000000000000000000000000..646aafa3029c865ef552e997ebd79a9e314d19ee GIT binary patch literal 7751 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 z zJ?K?wY`5@YQn*>qKo=1n8{#2-iU9fZ9=Uk)$>*MP%ZC55=$>tHCEj~;MD$VBL{HEx zO4!`h`a@hlkgk1cXRg_9w@5zhe)Y+w11LmdJ&R#oMGSD|u~^vAdW>+3M-^MkP`phk z&a|nXNzon84M#>;LJ!&@2s-~~8PhN{5k0|0vlG-r? zMcXTk4p4jqSY0eeFn7zs+P3_&BeI@6KHcpx$-}g2r(a5H#BN~gX|I}onR)w)AL74e zB0d(_-~E{%5gUT_&t2o?i0{VA0#+rTO1HZJfK?MOG749lm@C|gnoP74+orC=tYvLz z+u|8NNeWh*@3kvr?g%!nq^u)R;h$t$kT~_LUp3 z>*4T3uc16<7(FgwB^O+H%5Q^w7~re0Uz$M--=u|)dWq)1WJgcoX>c+UE1{Gx zwVKovQR!Cfg~b)%?t7L9YuybQ*@$Px7LBG>>_%h#)S7lT*?2*sD<4_YOFc*KMG5OBwH1E+9srO{-1}bu@pj6N zVSIR_7ih~1f-3nkaCN7JvkY4!_dZOWsWU(<+4SAHd;qcnA*aXwsIIC(-I)7>a zIUClj8bvGJ-)2!e8x7h5O71nI-VrL^p&pKkKeL@R&*<;l_duEGf>|W&HUIz#FO%=j zfF~sv;BYtx?oQ_1pvDC6iWc$!Rulf1*qyG;QHa6q{ literal 0 HcmV?d00001 diff --git a/assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png b/assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png new file mode 100644 index 0000000000000000000000000000000000000000..819fa9dcc9e53797e6d40d603d1f5798e7a00809 GIT binary patch literal 8804 zcmeHM`#+TF`+p3DBB@P|scdRLPRSaTQzhD3u~rTljIv0K8OfGS&j58tmJ=5;^!yzb|EuKT_Y@Aq|IdEfb+ z(%)pd2><~7)8Cx@9so8dA3^`dC|0m?&`A0I)Cr)W-+W3r(TY2M_Ba4E6>gSZ zSX-)#_~v{H0Bm`=_R}b~*TsYJ68;b8~J| zhMbq9y~Wn;hGt+%<4?nhgc95R&un|sq_j*v8PZyk_-${_K@m>pwLi4B18dXWcLANX>7QE1)&?DG0Hhp_9n{#mHvLf-yEbg~1+=>CRB{CBV6X}O%tGIPNw_}>h+DvnwU6qba@ z2Jy>>@)TVMhXLBm41`2vRe6$$g+PC=-Z3SK@Vm%aCWhp=?%tc^^E_CX*LO8z7nD32 z?Bdd#X26xG@bxy>;m@Q~EjDAq@RT`%54EzuhdT8~!^VUCc2uQ^o6{VSR3ZuM>Ozf< zcO3qGy4a^Jq^>-%Ae9#YLmWuZE_K!RJvhp|dMN%mCpS~HxbR2Vn^MNdLTN4pdwsLv z8u2lv8DIwn2Kwj+U^qKS?oZU1jUQv$>fhoMLOc?;N6XURx}%26>evv^hVBuIBymTy zC6C8zD8!^nXO{?hSXPRgEUOmUkr}M9we5>FwuBAf?6Sm>z<{51k+s~}31ChK-L8KY z+H~m*_o9_fKYwDV6D@1GmzGp0u!Q@C*zn5+_@bsMiSslMFG6}mlHAClovnCEJQV5^ zFaklzR}y5k<&t*Ev4wEdEW=wwk0c^VNk_z&-HQ6>4;A4%(FESIpwxjT5S&esPp(MX zOG`^9Q_?6kmY(uUmKyg<*SH<^NfKZi>;!y!X;mU>aPOGn57bPijb;0GGAoO%ieSkU9-c4?siUNXXt|wRF((p< zG!{zMMceOC@W^)BQ|TssH(#CrwCrE~M`heFmLD_qQ`A!4a)@uaRvW5Z&pd%}rKx`d z5xR=NrP#%tA=^_Z63sizY)XUOHW0!@#Y(G7C{yVknyC4R(-`JB=g_1x4EFxg=#1MD zNryY?e)Y}EVeYb(=4)saj*U6gh(-irxDnAC5ARdkE^afnNFpqmCcKG@E}4fzCk{dE zTbEwa8Ck)o=g&6HT|WNHr?Q^7NPC_CelXYd@g17b&M=Yr75xR2Phhpe;!$v7{R@xD zg~U*WR!lMXw^e#!<>HS(waTkK_`l=?MMB`D=bUR_GG~9EW4KQ3dExQ$btY4Df~e@J zG7#}lo(HJ9I@mQQHx1KzbO1Lj&&mwTY4{bkL)HWSH*pLfT9J|ZYZ?Y&EBF(}8y%S3 zUq**g7iDwFaoWpzs=Z`8n9sp(S@{cgl#UU;sjwF6R(LgeXYP6Wr}7lDM z0|X3d)-q5>IkcyVbjzfJzS;!SJd(V_76)jC7pc7>$iPMcPl(1fy0i$M<)c?~DC7vk zxu{cBa9PovAS{Q{USwbt<)TtKSrZ3XnyyHeZlPZh=EUg%!5Wc@-%cLmK2xg%D;J4P zklqyVvc)zz`o<%IV@}iYc01#?-Ky6uMnY-rMIxs_K)eMbn0>os&d5wekDy{*LHD!O z+C*oM_MgXe=TPhdzaWYz;wC-)=^sQ*K~->ahK=HD(!_5yWG$+_%9VII`Lx>UdV+?P zza5S5PP<9DwXy9Fc~@Z#3NdX=M3X1HjqrV#1V2;+)=}+zbUHBH94@ew_fWi;mD5ed zW9}Xv!3w!p0cHv*3gk-oz=yl}n)a@-vac5kg>XIq^n0xpRZ+QwD1qT$XLutc?bBlX zz_OX^*sh%kXKMy8gUefyF_hY*SQi2N-N@aMidLINd!mAtTTj6R0W;MT!Q4;(Hthrs zV^v#xyJa(G|GR!UWO{Ug1deHPYJg?C1>PK7#zJqX&mdyYOv;$>FE@gbf?mvvfy|(~ zj+3FNDC1MN6Z@7@U@|)3=ciIC{AosRE$5K5;mYE6{>(_Q{BpKGtN^2V+kE(U?}a$_ z{Z(_m_K^45TJB)ZWK#u<4t;Axe(+B^LOP?**Qz#a39U1D7|su8fQCLHBoc@zD|Hg2cNCzjsb`XPHB-uSRMyWC%o+!AnQxN;tT^giug3YA^K!q0^6BcN^zV^T_FP91lgK(~ z^BXeCt1mLXliJXPdh^2XBM|Sh?#VxB*q>7C|L23mPkB0_?0?Adf-acL>NyY6r#GJe zHEr9g@wt7rOSiBUbLmbMU}g)c6;q;%K&@sZ{q;lUjNmV@*&UWmE-o{Sp%_tS4w$%Clc6do4mNBb^svxK54AnBj~Q))$0_W0S`T+R zx4)ziUop{|UB3j)X|)-tL!Q16bUK-t^_XN~s<(6B9L+lBG4xcKcj$@nWTL`o!aTa_ z)3L!r{S#qSfWdW9LB42ixxPbjO&mELIl=+VH-~uz;F%NbDq$xAOp3RxNBSpsS-X^@ zo+={F!3(@at3*yYePq1DEv_O&@nnx8ok;8xPz@B<>K@}5@A(Q|q369D;IyNRmQFuU z^G(>8M9d~E^+wwUV*tP=TM^&ya`T@(Igh`4w&pCwrdf3Fly>E6;ynICC8?}9W6os* z;*iR-NGR)3i+Edk&|rM3tIcNgIa-3#AiQb599!LQqPXUl>FP+0Q|Ei8p@J|`AHA0w zDlPY|p+#(07%BPLCoqSRRua+9O7qG?$pk-^*cd^V9|9IC>AZVb=h-_cqdsx+AY2({ zpS%n0c3wfrh?uSG(~|D!V79pa9Ec7CR#lYhaQUtCSTk+9GF*$|gWM^iacK9$GQ%N{ za6>o9Z?_B)-${3ZGucRQLFuu0;P90=kz?_ z=uqQ7pI7t_u6{*-Yfq$Xk>)O+A3e4VF)@4XyiI!K*R1@QguV_z`! z&^A_Mcw9@1oY2i|h-usm3Rl%g)VAngn!t!MyOcCACw6HWT291W)cvezshIqm@aY@R zV50_N>+6h|f|c=7Q-iqyD;3t(%Jz}0>VJgpmsUKwWWOibUPdT^@EwBW{Dpn?&G88A)m6;bi=M*y@=Mj z2cN#fU<#JJ$enI94hJGym<(p7k$!d`hrZP>0vNm3 zRQh~1h)rIV{v6T#q}vc={dXB(TUx71%CA#P8FrAV>j_N5dHlKN->(oPhgq=J{GQjz zST*lH{QTE>p=HzslPGSF`V|-~>lAxw)xa^{D8P|#(6&n*-#Ozn-Ej^l^Wx~9XyT@W zh!~Y!kw;(n62u(Ck1$Ft6qN;Ns%5kmgoeMz8xQ~F$%UU;+Xk0$XWQuHV|@@~-KA=hD7Xb??3VF}eZ&))mluS+Zlk&p8hVP{IrBqWAdAHz zA{hZW&4&MaKt3!XUI%L4uTUYJpTEC<0wucD(ZwilXiVr6Am zC|S>&I`&<7zU?g zJ+&^1M?R{JjI6}*`P;M|#&{hlv!}2pU7~UB5y*wIeHjYTtjtt}5Q{2=a0ekG)tk%# zMFs5TvKXW^_|ybH(7B3%XR-Ny|2CSWGILV;kL2UvA7h{0-`A!j4y9^fm>wHTzM3pI@ubjluPeUhMeb7%HFX;EB&L-r5hQZN%%it5-fAn4sZhY?L z;pJ$9Q_#IKkQV3~Ws#H*!LH%rg@7)yeQkO9dFOKUm+cP@Ga`0mP%?~k-hL+=PDK6qKUj;89{>OV literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/old_EQUIP_1.png b/assets/cn/equipment/old_EQUIP_1.png new file mode 100644 index 0000000000000000000000000000000000000000..53f70fd22cd65ee92a8cf2c437952c332f5db227 GIT binary patch literal 7545 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 literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/old_EQUIP_2.png b/assets/cn/equipment/old_EQUIP_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc6cf29b60832487b05c1c248b4e9afb5e25b86 GIT binary patch literal 7629 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 Ie&4_T4fia$kpKVy literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/old_FLEET_DETAIL_CHECK.png b/assets/cn/equipment/old_FLEET_DETAIL_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfc387c443aa7247dd28b8527713c61a1e38659 GIT binary patch literal 10170 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 BKKlRw literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png b/assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7c68e36df32494ab2a412757e705f8406c9353 GIT binary patch literal 6492 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 literal 0 HcmV?d00001 diff --git a/config/template.json b/config/template.json index 4a57f0a48..92cf25714 100644 --- a/config/template.json +++ b/config/template.json @@ -619,6 +619,8 @@ "CommonCV": "any", "ChangeVanguard": "ship", "CommonDD": "any", + "ALLowLowVanguardLevel": true, + "StopIFAutoNotEnsured": true, "CommissionLimit": true }, "Campaign": { @@ -650,6 +652,20 @@ "Fleet2Step": 2, "FleetOrder": "fleet1_all_fleet2_standby" }, + "VanguardFilter": { + "Sort": "default", + "Index": "default", + "Faction": "default", + "Rarity": "default", + "Extra": "default" + }, + "FlagshipFilter": { + "Sort": "default", + "Index": "default", + "Faction": "default", + "Rarity": "default", + "Extra": "default" + }, "Storage": { "Storage": {} } diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index e1d0098ea..e48972958 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -456,3 +456,547 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): continue else: break + + +import inflection +from module.campaign.my_assets import * +from module.exception import * +from module.equipment.old_fleet_equipment import DailyEquipment +from module.equipment.old_equipment_change import OldEquipmentChange +from module.equipment.old_assets import * + +class GemsFarming(GemsFarming): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.old_equip = DailyEquipment(config=self.config, device=self.device) + + def event_hard_mode_override(self): + HARDMODEMAPS = [ + 'c1', 'c2', 'c3', + 'd1', 'd2', 'd3', + 'ht1', 'ht2', 'ht3', 'ht4', 'ht5', 'ht6', + ] + if inflection.underscore(self.config.Campaign_Name) in HARDMODEMAPS: + logger.info('Is in hard mode, switch ship changing method.') + self._ship_detail_enter = self._ship_detail_enter_hard + self._fleet_detail_enter = self._fleet_detail_enter_hard + self.page_fleet_check_button = FLEET_PREPARATION + if self.config.Fleet_FleetOrder == 'fleet1_all_fleet2_standby': + self.FLEET_ENTER_FLAGSHIP = my_FLEET_ENTER_FLAGSHIP_HARD_1 + self.FLEET_ENTER = my_FLEET_ENTER_HARD_1 + self.FLEET_ENTER_FLAGSHIP_3_POSITION = my_FLEET_ENTER_FLAGSHIP_HARD_1_3 + self.FLEET_ENTER_3_POSITION = my_FLEET_ENTER_HARD_1_3 + elif self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': + self.FLEET_ENTER_FLAGSHIP = my_FLEET_ENTER_FLAGSHIP_HARD_2 + self.FLEET_ENTER = my_FLEET_ENTER_HARD_2 + self.FLEET_ENTER_FLAGSHIP_3_POSITION = my_FLEET_ENTER_FLAGSHIP_HARD_2_3 + self.FLEET_ENTER_3_POSITION = my_FLEET_ENTER_HARD_2_3 + else: + logger.critical('Fleet Order Error, please check your settings') + from module.exception import RequestHumanTakeover + raise RequestHumanTakeover + self.hard_mode = True + else: + self._ship_detail_enter = self._ship_detail_enter + self._fleet_detail_enter = self._fleet_detail_enter + self.page_fleet_check_button = page_fleet.check_button + self.FLEET_ENTER_FLAGSHIP = old_FLEET_ENTER_FLAGSHIP + self._FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP + self.FLEET_ENTER = FLEET_ENTER + self._FLEET_ENTER = FLEET_ENTER + self.hard_mode = False + + def load_campaign(self, name, folder='campaign_main'): + CampaignRun.load_campaign(self, name, folder) + + class GemsCampaign(GemsCampaignOverride, self.module.Campaign): + pass + + self.campaign = GemsCampaign(device=self.campaign.device, config=self.campaign.config) + self.campaign.config.override(Emotion_Mode='ignore') + self.campaign.config.override(EnemyPriority_EnemyScaleBalanceWeight='S1_enemy_first') + + @property + def change_flagship(self): + return 'ship' in self.config.GemsFarming_ChangeFlagship + + @property + def change_flagship_equip(self): + return 'equip' in self.config.GemsFarming_ChangeFlagship + + @property + def change_vanguard(self): + return 'ship' in self.config.GemsFarming_ChangeVanguard + + @property + def change_vanguard_equip(self): + return 'equip' in self.config.GemsFarming_ChangeVanguard + + def _fleet_detail_enter(self): + """ + Enter GEMS_FLEET page + """ + self.ui_ensure(page_fleet) + _fleet_to_change = self.config.Fleet_Fleet1 + if self.config.Fleet_FleetOrder == 'fleet1_all_fleet2_standby': + _fleet_to_change = self.config.Fleet_Fleet1 + elif self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': + _fleet_to_change = self.config.Fleet_Fleet2 + self.ui_ensure_index(_fleet_to_change, letter=OCR_FLEET_INDEX, + next_button=FLEET_NEXT, prev_button=FLEET_PREV, skip_first_screenshot=True) + + def _ship_detail_enter(self, button): + self._fleet_detail_enter() + self.old_equip.equip_enter(button) + + def _fleet_detail_enter_hard(self): + from module.retire.retirement import Retirement + _retire_class = Retirement(config=self.config, device=self.device) + self.campaign.ensure_campaign_ui(self.stage) + button_area = self.campaign.ENTRANCE.button + button = Button(name=str(self.stage), area=button_area, color=(0, 0, 0), button=button_area) + for __ in range(5): + self.campaign.ensure_campaign_ui(self.stage) + self.ui_click(click_button=button, appear_button=BACK_ARROW, check_button=MAP_PREPARATION) + for _ in range(30): + self.device.screenshot() + if self.appear_then_click(MAP_PREPARATION): + self.device.sleep(0.5) + if _retire_class.handle_retirement(): + continue + if self.appear(button=FLEET_PREPARATION, offset=(50, 50)): + return + from module.exception import GameStuckError + raise GameStuckError + + def _ship_detail_enter_hard(self, button): + self._fleet_detail_enter_hard() + self.old_equip.equip_enter(button) + + def flagship_change(self): + """ + Change flagship and flagship's equipment + If config.GemsFarming_CommonCV == 'any', only change auxiliary equipment + + Returns: + bool: True if flagship changed. + """ + + if self.config.GemsFarming_CommonCV == 'any': + index_list = range(3, 5) + else: + index_list = range(0, 5) + logger.hr('Change flagship', level=1) + logger.attr('ChangeFlagship', self.config.GemsFarming_ChangeFlagship) + if self.change_flagship_equip: + logger.hr('Record flagship equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER_FLAGSHIP) + self.old_equip.record_equipment(index_list=index_list) + self.old_equip._equip_take_off_one() + self.ui_back(self.page_fleet_check_button) + + logger.hr('Change flagship', level=2) + self._fleet_detail_enter() + success = self.flagship_change_execute() + + if self.change_flagship_equip: + logger.hr('Equip flagship equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER_FLAGSHIP) + self.old_equip._equip_take_off_one() + + OldEquipmentChange.equipment_take_on(self.old_equip, index_list=index_list) + self.ui_back(self.page_fleet_check_button) + + return success + + def vanguard_change(self): + """ + Change vanguard and vanguard's equipment + + Returns: + bool: True if vanguard changed + """ + + logger.hr('Change vanguard', level=1) + logger.attr('ChangeVanguard', self.config.GemsFarming_ChangeVanguard) + if self.change_vanguard_equip: + logger.hr('Record vanguard equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER) + self.old_equip.record_equipment() + self.old_equip._equip_take_off_one() + self.ui_back(self.page_fleet_check_button) + + logger.hr('Change vanguard', level=2) + self._fleet_detail_enter() + success = self.vanguard_change_execute() + + if self.change_vanguard_equip: + logger.hr('Equip vanguard equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER) + self.old_equip._equip_take_off_one() + + self.old_equip.equipment_take_on() + self.ui_back(self.page_fleet_check_button) + + return success + + def _ship_change_confirm(self, button): + + self.dock_select_one(button) + self.dock_filter_set() + self.dock_sort_method_dsc_set() + self.dock_select_confirm(check_button=self.page_fleet_check_button) + + def get_common_rarity_cv(self, lv=31, emotion=16): + """ + Get a common rarity cv by config.GemsFarming_CommonCV + If config.GemsFarming_CommonCV == 'any', return a common lv1 ~ lv33 cv + Returns: + Ship: + """ + + logger.hr('FINDING FLAGSHIP') + + scanner = ShipScanner( + level=(1, lv), emotion=(emotion, 150), fleet=self.config.Fleet_Fleet1, status='free') + scanner.disable('rarity') + + if self.config.GemsFarming_CommonCV == 'any': + + self.dock_sort_method_dsc_set(False) + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + return scanner.scan(self.device.image, output=False) + + else: + template = { + 'BOGUE': TEMPLATE_BOGUE, + 'HERMES': TEMPLATE_HERMES, + 'LANGLEY': TEMPLATE_LANGLEY, + 'RANGER': TEMPLATE_RANGER + }[f'{self.config.GemsFarming_CommonCV.upper()}'] + + self.dock_sort_method_dsc_set() + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + candidates = [ship for ship in scanner.scan(self.device.image, output=False) + if template.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + + if candidates: + return candidates + + logger.info('No specific CV was found, try reversed order.') + self.dock_sort_method_dsc_set(False) + + candidates = [ship for ship in scanner.scan(self.device.image) + if template.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + + return candidates + + def get_common_rarity_dd(self, emotion=16): + """ + Get a common rarity dd with level is 100 (70 for servers except CN) and emotion > 10 + Returns: + Ship: + """ + logger.hr('FINDING VANGUARD') + + if self.config.SERVER in ['cn']: + max_level = 100 + else: + max_level = 70 + if self.config.full_config.Hook_HookGeneral_Enable and self.config.GemsFarming_ALLowLowVanguardLevel: + min_level = 2 + else: + min_level = max_level + if self.hard_mode: + min_level = max(min_level, 49) + scanner = ShipScanner(level=(min_level, max_level), emotion=(emotion, 150), status='free') + scanner.disable('rarity') + + self.dock_sort_method_dsc_set() + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + + if self.config.GemsFarming_CommonDD == 'any': + return scanner.scan(self.device.image, output=False) + + candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) + + if candidates: + return candidates + + logger.info('No specific DD was found, try reversed order.') + self.dock_sort_method_dsc_set(False) + + candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) + + return candidates + + def find_candidates(self, template, scanner): + """ + Find candidates based on template matching using a scanner. + + """ + candidates = [] + for item in template: + candidates = [ship for ship in scanner.scan(self.device.image, output=False) + if item.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + if candidates: + break + return candidates + + @staticmethod + def get_templates(common_dd): + """ + Returns the corresponding template list based on CommonDD + """ + if common_dd == 'any': + return [ + TEMPLATE_CASSIN_1, TEMPLATE_CASSIN_2, + TEMPLATE_DOWNES_1, TEMPLATE_DOWNES_2, + TEMPLATE_AULICK, + TEMPLATE_FOOTE + ] + elif common_dd == 'aulick_or_foote': + return [ + TEMPLATE_AULICK, + TEMPLATE_FOOTE + ] + elif common_dd == 'cassin_or_downes': + return [ + TEMPLATE_CASSIN_1, TEMPLATE_CASSIN_2, + TEMPLATE_DOWNES_1, TEMPLATE_DOWNES_2 + ] + else: + logger.error(f'Invalid CommonDD setting: {common_dd}') + raise ScriptError(f'Invalid CommonDD setting: {common_dd}') + + def solve_hard_flagship_black(self): + if self.hard_mode: + self.ui_click(self.FLEET_ENTER_FLAGSHIP, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, + skip_first_screenshot=True) + if self.appear(my_DOCK_SHIP_DOWN): + self.ui_click(my_DOCK_SHIP_DOWN, + appear_button=DOCK_CHECK, check_button=self.page_fleet_check_button, + skip_first_screenshot=True) + else: + self.ui_back(check_button=FLEET_PREPARATION) + self._FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP + self.FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP_3_POSITION + + def flagship_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.solve_hard_flagship_black() + self.ui_click(self.FLEET_ENTER_FLAGSHIP, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + + # self.dock_filter_set( + # index='cv', rarity='common', extra='enhanceable', sort='total') + + self.dock_filter_set( + sort=self.config.FlagshipFilter_Sort if self.config.FlagshipFilter_Sort != 'default' else 'total', + index=self.config.FlagshipFilter_Index if self.config.FlagshipFilter_Index != 'default' else 'cv', + faction=self.config.FlagshipFilter_Faction if self.config.FlagshipFilter_Faction != 'default' else 'all', + rarity=self.config.FlagshipFilter_Rarity if self.config.FlagshipFilter_Rarity != 'default' else 'common', + extra=self.config.FlagshipFilter_Extra if self.config.FlagshipFilter_Extra != 'default' else 'enhanceable' + ) + self.dock_favourite_set(False) + + ship = self.get_common_rarity_cv() + if ship: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + if self.hard_mode: + self.FLEET_ENTER_FLAGSHIP = self._FLEET_ENTER_FLAGSHIP + + logger.info('Change flagship success') + return True + else: + logger.info('Change flagship failed, no CV in common rarity.') + + if self.config.SERVER in ['cn']: + max_level = 100 + else: + max_level = 70 + ship = self.get_common_rarity_cv(lv=max_level, emotion=0) + if ship and self.hard_mode: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + else: + if self.hard_mode: + raise RequestHumanTakeover + self.dock_filter_set() + self.ui_back(check_button=self.page_fleet_check_button) + if self.hard_mode: + self.FLEET_ENTER_FLAGSHIP = self._FLEET_ENTER_FLAGSHIP + return False + + def solve_hard_vanguard_black(self): + if self.hard_mode: + self.ui_click(self.FLEET_ENTER, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, + skip_first_screenshot=True) + if self.appear(my_DOCK_SHIP_DOWN): + self.ui_click(my_DOCK_SHIP_DOWN, + appear_button=DOCK_CHECK, check_button=self.page_fleet_check_button, + skip_first_screenshot=True) + else: + self.ui_back(check_button=FLEET_PREPARATION) + self._FLEET_ENTER = self.FLEET_ENTER + self.FLEET_ENTER = self.FLEET_ENTER_3_POSITION + + def vanguard_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.solve_hard_vanguard_black() + self.ui_click(self.FLEET_ENTER, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + # self.dock_filter_set( + # index='dd', rarity='common', faction='eagle', extra='can_limit_break') + + self.dock_filter_set( + sort=self.config.VanguardFilter_Sort if self.config.VanguardFilter_Sort != 'default' else 'level', + index=self.config.VanguardFilter_Index if self.config.VanguardFilter_Index != 'default' else 'dd', + faction=self.config.VanguardFilter_Faction if self.config.VanguardFilter_Faction != 'default' else 'eagle', + rarity=self.config.VanguardFilter_Rarity if self.config.VanguardFilter_Rarity != 'default' else 'common', + extra=self.config.VanguardFilter_Extra if self.config.VanguardFilter_Extra != 'default' else 'can_limit_break' + ) + self.dock_favourite_set(False) + + ship = self.get_common_rarity_dd() + if ship: + if self.hard_mode: + self.FLEET_ENTER = self._FLEET_ENTER + self._ship_change_confirm(max(ship, key=lambda s: s.emotion).button) + + logger.info('Change vanguard ship success') + return True + else: + logger.info('Change vanguard ship failed, no DD in common rarity.') + + ship = self.get_common_rarity_dd(emotion=0) + if ship and self.hard_mode: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + else: + if self.hard_mode: + raise RequestHumanTakeover + self.dock_filter_set() + self.ui_back(check_button=self.page_fleet_check_button) + if self.hard_mode: + self.FLEET_ENTER = self._FLEET_ENTER + return False + + _trigger_lv32 = False + _trigger_emotion = False + + def triggered_stop_condition(self, oil_check=True): + # Lv32 limit + if self.change_flagship and self.campaign.config.LV32_TRIGGERED: + self._trigger_lv32 = True + logger.hr('TRIGGERED LV32 LIMIT') + return True + + if self.campaign.map_is_auto_search and self.campaign.config.GEMS_EMOTION_TRIGGERED: + self._trigger_emotion = True + logger.hr('TRIGGERED EMOTION LIMIT') + return True + + return super().triggered_stop_condition(oil_check=oil_check) + + def run(self, name, folder='campaign_main', mode='normal', total=0): + """ + Args: + name (str): Name of .py file. + folder (str): Name of the file folder under campaign. + mode (str): `normal` or `hard` + total (int): + """ + self.config.STOP_IF_REACH_LV32 = self.change_flagship + self.campaign_floder = folder + self.event_hard_mode_override() + while 1: + self._trigger_lv32 = False + is_limit = self.config.StopCondition_RunCount + + try: + super().run(name=name, folder=folder, total=total) + except CampaignEnd as e: + if e.args[0] == 'Emotion withdraw': + self._trigger_emotion = True + else: + raise e + except RequestHumanTakeover as e: + try: + if (e.args[0] == 'Hard not satisfied') and self.hard_mode: + if self.change_flagship and self.change_vanguard: + self.flagship_change() + self.vanguard_change() + else: + raise RequestHumanTakeover + else: + raise RequestHumanTakeover + except RequestHumanTakeover as e: + raise RequestHumanTakeover + except Exception as e: + from module.exception import GameStuckError + raise GameStuckError + + # End + if self._trigger_lv32 or self._trigger_emotion: + success = True + if self.change_flagship: + success = self.flagship_change() + if self.change_vanguard: + success = success and self.vanguard_change() + + if is_limit and self.config.StopCondition_RunCount <= 0: + logger.hr('Triggered stop condition: Run count') + self.config.StopCondition_RunCount = 0 + self.config.Scheduler_Enable = False + break + + self._trigger_lv32 = False + self._trigger_emotion = False + self.campaign.config.LV32_TRIGGERED = False + self.campaign.config.GEMS_EMOTION_TRIGGERED = False + + # Scheduler + if self.config.task_switched(): + self.campaign.ensure_auto_search_exit() + self.config.task_stop() + elif not success: + self.campaign.ensure_auto_search_exit() + self.config.task_delay(minute=30) + self.config.task_stop() + + continue + else: + break diff --git a/module/campaign/my_assets.py b/module/campaign/my_assets.py new file mode 100644 index 000000000..a613e38d2 --- /dev/null +++ b/module/campaign/my_assets.py @@ -0,0 +1,15 @@ +from module.base.button import Button +from module.base.template import Template + +# This file was automatically generated by dev_tools/button_extract.py. +# Don't modify it manually. + +my_DOCK_SHIP_DOWN = Button(area={'cn': (93, 90, 225, 266), 'en': (93, 90, 225, 266), 'jp': (93, 90, 225, 266), 'tw': (93, 90, 225, 266)}, color={'cn': (68, 67, 69), 'en': (68, 67, 69), 'jp': (68, 67, 69), 'tw': (68, 67, 69)}, button={'cn': (93, 90, 225, 266), 'en': (93, 90, 225, 266), 'jp': (93, 90, 225, 266), 'tw': (93, 90, 225, 266)}, file={'cn': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'en': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'jp': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'tw': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_1 = Button(area={'cn': (389, 158, 472, 241), 'en': (389, 158, 472, 241), 'jp': (389, 158, 472, 241), 'tw': (389, 158, 472, 241)}, color={'cn': (144, 160, 164), 'en': (144, 160, 164), 'jp': (144, 160, 164), 'tw': (144, 160, 164)}, button={'cn': (389, 158, 472, 241), 'en': (389, 158, 472, 241), 'jp': (389, 158, 472, 241), 'tw': (389, 158, 472, 241)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_1_3 = Button(area={'cn': (598, 179, 677, 258), 'en': (598, 179, 677, 258), 'jp': (598, 179, 677, 258), 'tw': (598, 179, 677, 258)}, color={'cn': (48, 54, 66), 'en': (48, 54, 66), 'jp': (48, 54, 66), 'tw': (48, 54, 66)}, button={'cn': (598, 179, 677, 258), 'en': (598, 179, 677, 258), 'jp': (598, 179, 677, 258), 'tw': (598, 179, 677, 258)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_2 = Button(area={'cn': (389, 291, 472, 374), 'en': (389, 291, 472, 374), 'jp': (389, 291, 472, 374), 'tw': (389, 291, 472, 374)}, color={'cn': (177, 165, 150), 'en': (177, 165, 150), 'jp': (177, 165, 150), 'tw': (177, 165, 150)}, button={'cn': (389, 291, 472, 374), 'en': (389, 291, 472, 374), 'jp': (389, 291, 472, 374), 'tw': (389, 291, 472, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_2_3 = Button(area={'cn': (595, 290, 679, 374), 'en': (595, 290, 679, 374), 'jp': (595, 290, 679, 374), 'tw': (595, 290, 679, 374)}, color={'cn': (49, 57, 68), 'en': (49, 57, 68), 'jp': (49, 57, 68), 'tw': (49, 57, 68)}, button={'cn': (595, 290, 679, 374), 'en': (595, 290, 679, 374), 'jp': (595, 290, 679, 374), 'tw': (595, 290, 679, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png'}) +my_FLEET_ENTER_HARD_1 = Button(area={'cn': (705, 158, 788, 241), 'en': (705, 158, 788, 241), 'jp': (705, 158, 788, 241), 'tw': (705, 158, 788, 241)}, color={'cn': (147, 157, 154), 'en': (147, 157, 154), 'jp': (147, 157, 154), 'tw': (147, 157, 154)}, button={'cn': (705, 158, 788, 241), 'en': (705, 158, 788, 241), 'jp': (705, 158, 788, 241), 'tw': (705, 158, 788, 241)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png'}) +my_FLEET_ENTER_HARD_1_3 = Button(area={'cn': (910, 176, 994, 260), 'en': (910, 176, 994, 260), 'jp': (910, 176, 994, 260), 'tw': (910, 176, 994, 260)}, color={'cn': (47, 59, 73), 'en': (47, 59, 73), 'jp': (47, 59, 73), 'tw': (47, 59, 73)}, button={'cn': (910, 176, 994, 260), 'en': (910, 176, 994, 260), 'jp': (910, 176, 994, 260), 'tw': (910, 176, 994, 260)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png'}) +my_FLEET_ENTER_HARD_2 = Button(area={'cn': (705, 291, 788, 374), 'en': (705, 291, 788, 374), 'jp': (705, 291, 788, 374), 'tw': (705, 291, 788, 374)}, color={'cn': (169, 182, 200), 'en': (169, 182, 200), 'jp': (169, 182, 200), 'tw': (169, 182, 200)}, button={'cn': (705, 291, 788, 374), 'en': (705, 291, 788, 374), 'jp': (705, 291, 788, 374), 'tw': (705, 291, 788, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png'}) +my_FLEET_ENTER_HARD_2_3 = Button(area={'cn': (910, 288, 996, 374), 'en': (910, 288, 996, 374), 'jp': (910, 288, 996, 374), 'tw': (910, 288, 996, 374)}, color={'cn': (52, 56, 64), 'en': (52, 56, 64), 'jp': (52, 56, 64), 'tw': (52, 56, 64)}, button={'cn': (910, 288, 996, 374), 'en': (910, 288, 996, 374), 'jp': (910, 288, 996, 374), 'tw': (910, 288, 996, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index cf783acb7..c97016eba 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3051,6 +3051,14 @@ "z20_or_z21" ] }, + "ALLowLowVanguardLevel": { + "type": "checkbox", + "value": true + }, + "StopIFAutoNotEnsured": { + "type": "checkbox", + "value": true + }, "CommissionLimit": { "type": "checkbox", "value": true @@ -3582,6 +3590,174 @@ "display": "display" } }, + "VanguardFilter": { + "Sort": { + "type": "select", + "value": "default", + "option": [ + "default", + "rarity", + "level", + "total", + "join", + "intimacy", + "stat" + ] + }, + "Index": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "vanguard", + "main", + "dd", + "cl", + "ca", + "bb", + "cv", + "repair", + "ss", + "others", + "not_available" + ] + }, + "Faction": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "eagle", + "royal", + "sakura", + "iron", + "dragon", + "sardegna", + "northern", + "iris", + "vichya", + "other", + "not_available" + ] + }, + "Rarity": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "common", + "rare", + "elite", + "super_rare", + "ultra" + ] + }, + "Extra": { + "type": "select", + "value": "default", + "option": [ + "default", + "no_limit", + "has_skin", + "can_retrofit", + "enhanceable", + "can_limit_break", + "not_level_max", + "can_awaken", + "can_awaken_plus", + "special", + "oath_skin", + "not_available" + ] + } + }, + "FlagshipFilter": { + "Sort": { + "type": "select", + "value": "default", + "option": [ + "default", + "rarity", + "level", + "total", + "join", + "intimacy", + "stat" + ] + }, + "Index": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "vanguard", + "main", + "dd", + "cl", + "ca", + "bb", + "cv", + "repair", + "ss", + "others", + "not_available" + ] + }, + "Faction": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "eagle", + "royal", + "sakura", + "iron", + "dragon", + "sardegna", + "northern", + "iris", + "vichya", + "other", + "not_available" + ] + }, + "Rarity": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "common", + "rare", + "elite", + "super_rare", + "ultra" + ] + }, + "Extra": { + "type": "select", + "value": "default", + "option": [ + "default", + "no_limit", + "has_skin", + "can_retrofit", + "enhanceable", + "can_limit_break", + "not_level_max", + "can_awaken", + "can_awaken_plus", + "special", + "oath_skin", + "not_available" + ] + } + }, "Storage": { "Storage": { "type": "storage", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 24a549752..61116fb8d 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -277,6 +277,8 @@ GemsFarming: CommonDD: value: any option: [ any, favourite, aulick_or_foote , cassin_or_downes, z20_or_z21 ] + ALLowLowVanguardLevel: true + StopIFAutoNotEnsured: true CommissionLimit: true # ==================== Event ==================== @@ -774,6 +776,41 @@ AzurLaneUncensored: GameManager: AutoRestart: true +# ==================== GemsFarmingShipFilter ==================== + +FlagshipFilter: + Sort: + value: 'default' + option: ['default', 'rarity', 'level', 'total', 'join', 'intimacy', 'stat'] + Index: + value: 'default' + option: ['default', 'all', 'vanguard', 'main', 'dd', 'cl', 'ca', 'bb', 'cv', 'repair', 'ss', 'others', 'not_available'] + Faction: + value: 'default' + option: ['default', 'all', 'eagle', 'royal', 'sakura', 'iron', 'dragon', 'sardegna', 'northern', 'iris', 'vichya', 'other', 'not_available'] + Rarity: + value: 'default' + option: ['default', 'all', 'common', 'rare', 'elite', 'super_rare', 'ultra'] + Extra: + value: 'default' + option: ['default', 'no_limit', 'has_skin', 'can_retrofit', 'enhanceable', 'can_limit_break', 'not_level_max', 'can_awaken', 'can_awaken_plus', 'special', 'oath_skin', 'not_available'] +VanguardFilter: + Sort: + value: 'default' + option: ['default', 'rarity', 'level', 'total', 'join', 'intimacy', 'stat'] + Index: + value: 'default' + option: ['default', 'all', 'vanguard', 'main', 'dd', 'cl', 'ca', 'bb', 'cv', 'repair', 'ss', 'others', 'not_available'] + Faction: + value: 'default' + option: ['default', 'all', 'eagle', 'royal', 'sakura', 'iron', 'dragon', 'sardegna', 'northern', 'iris', 'vichya', 'other', 'not_available'] + Rarity: + value: 'default' + option: ['default', 'all', 'common', 'rare', 'elite', 'super_rare', 'ultra'] + Extra: + value: 'default' + option: ['default', 'no_limit', 'has_skin', 'can_retrofit', 'enhanceable', 'can_limit_break', 'not_level_max', 'can_awaken', 'can_awaken_plus', 'special', 'oath_skin', 'not_available'] + # ==================== Cheat ==================== HookGeneral: diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 2e6d9742b..d6aefb02d 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -106,6 +106,8 @@ Farm: - Campaign - StopCondition - Fleet + - VanguardFilter + - FlagshipFilter # ==================== Event ==================== diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 302393b36..9ac6b7bd0 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -152,6 +152,8 @@ class GeneratedConfig: GemsFarming_CommonCV = 'any' # any, langley, bogue, ranger, hermes GemsFarming_ChangeVanguard = 'ship' # disabled, ship, ship_equip GemsFarming_CommonDD = 'any' # any, favourite, aulick_or_foote, cassin_or_downes, z20_or_z21 + GemsFarming_ALLowLowVanguardLevel = True + GemsFarming_StopIFAutoNotEnsured = True GemsFarming_CommissionLimit = True # Group `EventGeneral` @@ -463,6 +465,20 @@ class GeneratedConfig: # Group `GameManager` GameManager_AutoRestart = True + # Group `FlagshipFilter` + FlagshipFilter_Sort = 'default' # default, rarity, level, total, join, intimacy, stat + FlagshipFilter_Index = 'default' # default, all, vanguard, main, dd, cl, ca, bb, cv, repair, ss, others, not_available + FlagshipFilter_Faction = 'default' # default, all, eagle, royal, sakura, iron, dragon, sardegna, northern, iris, vichya, other, not_available + FlagshipFilter_Rarity = 'default' # default, all, common, rare, elite, super_rare, ultra + FlagshipFilter_Extra = 'default' # default, no_limit, has_skin, can_retrofit, enhanceable, can_limit_break, not_level_max, can_awaken, can_awaken_plus, special, oath_skin, not_available + + # Group `VanguardFilter` + VanguardFilter_Sort = 'default' # default, rarity, level, total, join, intimacy, stat + VanguardFilter_Index = 'default' # default, all, vanguard, main, dd, cl, ca, bb, cv, repair, ss, others, not_available + VanguardFilter_Faction = 'default' # default, all, eagle, royal, sakura, iron, dragon, sardegna, northern, iris, vichya, other, not_available + VanguardFilter_Rarity = 'default' # default, all, common, rare, elite, super_rare, ultra + VanguardFilter_Extra = 'default' # default, no_limit, has_skin, can_retrofit, enhanceable, can_limit_break, not_level_max, can_awaken, can_awaken_plus, special, oath_skin, not_available + # Group `HookGeneral` HookGeneral_Enable = False HookGeneral_RestartEveryTime = True diff --git a/module/config/full_config_generated.py b/module/config/full_config_generated.py index 4814c6bb8..4cb8a5436 100644 --- a/module/config/full_config_generated.py +++ b/module/config/full_config_generated.py @@ -470,6 +470,8 @@ class FullGeneratedConfig: GemsFarming_GemsFarming_CommonCV = None GemsFarming_GemsFarming_ChangeVanguard = None GemsFarming_GemsFarming_CommonDD = None + GemsFarming_GemsFarming_ALLowLowVanguardLevel = None + GemsFarming_GemsFarming_StopIFAutoNotEnsured = None GemsFarming_GemsFarming_CommissionLimit = None GemsFarming_Campaign_Name = None GemsFarming_Campaign_Event = None @@ -494,6 +496,16 @@ class FullGeneratedConfig: GemsFarming_Fleet_Fleet2Mode = None GemsFarming_Fleet_Fleet2Step = None GemsFarming_Fleet_FleetOrder = None + GemsFarming_VanguardFilter_Sort = None + GemsFarming_VanguardFilter_Index = None + GemsFarming_VanguardFilter_Faction = None + GemsFarming_VanguardFilter_Rarity = None + GemsFarming_VanguardFilter_Extra = None + GemsFarming_FlagshipFilter_Sort = None + GemsFarming_FlagshipFilter_Index = None + GemsFarming_FlagshipFilter_Faction = None + GemsFarming_FlagshipFilter_Rarity = None + GemsFarming_FlagshipFilter_Extra = None GemsFarming_Storage_Storage = None # Task `EventGeneral` diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 248810313..ee73d37e8 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "Cassin or Downes", "z20_or_z21": "Z20 or Z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "Prevent Too Many Urgent Commissions", "help": "When running 7x24, prevent having a lot of urgent commissions and not being able to complete daily commissions. It is recommended to select only short-terms and high-yields in the commission filter" @@ -2681,6 +2689,162 @@ "help": "Log back into the game when the game has been ended." } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index efbb51da4..5e8223dee 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "GemsFarming.CommonDD.cassin_or_downes", "z20_or_z21": "GemsFarming.CommonDD.z20_or_z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "GemsFarming.CommissionLimit.name", "help": "GemsFarming.CommissionLimit.help" @@ -2681,6 +2689,162 @@ "help": "GameManager.AutoRestart.help" } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 410bdaf2a..4ad0cb100 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "卡辛或唐斯", "z20_or_z21": "Z20或Z21" }, + "ALLowLowVanguardLevel": { + "name": "可更换低等级前排", + "help": "倍率打开时,前排等级限制改为10以上即可。若为困难模式(如CD图)改为49级。" + }, + "StopIFAutoNotEnsured": { + "name": "无法设置职能时停止任务", + "help": "无法设置舰队职能时,以以下方式停止任务以免跨队队伍出击,石油被大量消耗:\n若设置了错误推送则推送任务停止的消息并停止该任务。\n若没有设置错误推送,则直接停止Alas。" + }, "CommissionLimit": { "name": "防止紧急委托数量过多", "help": "在7x24运行时防止紧急委托数量过多做不完每日委托,建议在委托过滤器仅选择短时长高收益委托" @@ -2681,6 +2689,162 @@ "help": "游戏被强制结束后自动登录游戏" } }, + "FlagshipFilter": { + "_info": { + "name": "后排主力过滤器", + "help": "" + }, + "Sort": { + "name": "排序", + "help": "", + "default": "默认", + "rarity": "稀有度", + "level": "等级", + "total": "综合性能", + "join": "入手时间", + "intimacy": "好感度", + "stat": "心情值" + }, + "Index": { + "name": "索引", + "help": "", + "default": "默认", + "all": "全部", + "vanguard": "前排先锋", + "main": "后排主力", + "dd": "驱逐", + "cl": "轻巡", + "ca": "重巡", + "bb": "战列", + "cv": "航母", + "repair": "维修", + "ss": "潜艇", + "others": "其他", + "not_available": "not_available" + }, + "Faction": { + "name": "阵营", + "help": "", + "default": "默认", + "all": "全部", + "eagle": "白鹰", + "royal": "皇家", + "sakura": "重樱", + "iron": "铁血", + "dragon": "东煌", + "sardegna": "撒丁帝国", + "northern": "北方联合", + "iris": "自由鸢尾", + "vichya": "维希教廷", + "other": "其他", + "not_available": "not_available" + }, + "Rarity": { + "name": "稀有度", + "help": "", + "default": "默认", + "all": "全部", + "common": "普通", + "rare": "稀有", + "elite": "精锐", + "super_rare": "超稀有", + "ultra": "海上传奇" + }, + "Extra": { + "name": "附加索引", + "help": "", + "default": "默认", + "no_limit": "无限制", + "has_skin": "可换装", + "can_retrofit": "可改造", + "enhanceable": "可强化", + "can_limit_break": "可突破", + "not_level_max": "未满级", + "can_awaken": "可认知觉醒", + "can_awaken_plus": "可认知觉醒II", + "special": "特殊", + "oath_skin": "誓约换装", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "前排先锋过滤器", + "help": "" + }, + "Sort": { + "name": "排序", + "help": "", + "default": "默认", + "rarity": "稀有度", + "level": "等级", + "total": "综合性能", + "join": "入手时间", + "intimacy": "好感度", + "stat": "心情值" + }, + "Index": { + "name": "索引", + "help": "", + "default": "默认", + "all": "全部", + "vanguard": "前排先锋", + "main": "后排主力", + "dd": "驱逐", + "cl": "轻巡", + "ca": "重巡", + "bb": "战列", + "cv": "航母", + "repair": "维修", + "ss": "潜艇", + "others": "其他", + "not_available": "not_available" + }, + "Faction": { + "name": "阵营", + "help": "", + "default": "默认", + "all": "全部", + "eagle": "白鹰", + "royal": "皇家", + "sakura": "重樱", + "iron": "铁血", + "dragon": "东煌", + "sardegna": "撒丁帝国", + "northern": "北方联合", + "iris": "自由鸢尾", + "vichya": "维希教廷", + "other": "其他", + "not_available": "not_available" + }, + "Rarity": { + "name": "稀有度", + "help": "", + "default": "默认", + "all": "全部", + "common": "普通", + "rare": "稀有", + "elite": "精锐", + "super_rare": "超稀有", + "ultra": "海上传奇" + }, + "Extra": { + "name": "附加索引", + "help": "", + "default": "默认", + "no_limit": "无限制", + "has_skin": "可换装", + "can_retrofit": "可改造", + "enhanceable": "可强化", + "can_limit_break": "可突破", + "not_level_max": "未满级", + "can_awaken": "可认知觉醒", + "can_awaken_plus": "可认知觉醒II", + "special": "特殊", + "oath_skin": "誓约换装", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "基本设置", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 9748f9226..ef168b8b9 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "卡辛或唐斯", "z20_or_z21": "Z20或Z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "防止緊急委託數量過多", "help": "在7x24運行時防止緊急委託數量過多做不完每日委託,建議在委託過濾器僅選擇短時長高收益委託" @@ -2681,6 +2689,162 @@ "help": "遊戲被強制結束後自動登錄遊戲" } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/equipment/old_assets.py b/module/equipment/old_assets.py new file mode 100644 index 000000000..17821a368 --- /dev/null +++ b/module/equipment/old_assets.py @@ -0,0 +1,11 @@ +from module.base.button import Button +from module.base.template import Template + +# This file was automatically generated by dev_tools/button_extract.py. +# Don't modify it manually. + +old_EQUIP_1 = Button(area={'cn': (1191, 266, 1247, 319), 'en': (1191, 266, 1247, 319), 'jp': (1191, 266, 1247, 319), 'tw': (1191, 266, 1247, 319)}, color={'cn': (98, 142, 207), 'en': (98, 142, 207), 'jp': (98, 142, 207), 'tw': (98, 142, 207)}, button={'cn': (1191, 266, 1247, 319), 'en': (1191, 266, 1247, 319), 'jp': (1191, 266, 1247, 319), 'tw': (1191, 266, 1247, 319)}, file={'cn': './assets/cn/equipment/old_EQUIP_1.png', 'en': './assets/cn/equipment/old_EQUIP_1.png', 'jp': './assets/cn/equipment/old_EQUIP_1.png', 'tw': './assets/cn/equipment/old_EQUIP_1.png'}) +old_EQUIP_2 = Button(area={'cn': (1191, 366, 1247, 419), 'en': (1191, 366, 1247, 419), 'jp': (1191, 366, 1247, 419), 'tw': (1191, 366, 1247, 419)}, color={'cn': (95, 139, 202), 'en': (95, 139, 202), 'jp': (95, 139, 202), 'tw': (95, 139, 202)}, button={'cn': (1191, 366, 1247, 419), 'en': (1191, 366, 1247, 419), 'jp': (1191, 366, 1247, 419), 'tw': (1191, 366, 1247, 419)}, file={'cn': './assets/cn/equipment/old_EQUIP_2.png', 'en': './assets/cn/equipment/old_EQUIP_2.png', 'jp': './assets/cn/equipment/old_EQUIP_2.png', 'tw': './assets/cn/equipment/old_EQUIP_2.png'}) +old_EQUIP_3 = Button(area={'cn': (1191, 466, 1247, 519), 'en': (1191, 466, 1247, 519), 'jp': (1191, 466, 1247, 519), 'tw': (1191, 466, 1247, 519)}, color={'cn': (94, 137, 201), 'en': (94, 137, 201), 'jp': (94, 137, 201), 'tw': (94, 137, 201)}, button={'cn': (1191, 466, 1247, 519), 'en': (1191, 466, 1247, 519), 'jp': (1191, 466, 1247, 519), 'tw': (1191, 466, 1247, 519)}, file={'cn': './assets/cn/equipment/old_EQUIP_3.png', 'en': './assets/cn/equipment/old_EQUIP_3.png', 'jp': './assets/cn/equipment/old_EQUIP_3.png', 'tw': './assets/cn/equipment/old_EQUIP_3.png'}) +old_FLEET_DETAIL_CHECK = Button(area={'cn': (915, 647, 980, 679), 'en': (915, 647, 980, 679), 'jp': (915, 647, 980, 679), 'tw': (915, 647, 980, 679)}, color={'cn': (234, 195, 154), 'en': (234, 195, 154), 'jp': (234, 195, 154), 'tw': (234, 195, 154)}, button={'cn': (915, 647, 980, 679), 'en': (915, 647, 980, 679), 'jp': (915, 647, 980, 679), 'tw': (915, 647, 980, 679)}, file={'cn': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'en': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'jp': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'tw': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png'}) +old_FLEET_ENTER_FLAGSHIP = Button(area={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, color={'cn': (95, 83, 74), 'en': (95, 83, 74), 'jp': (95, 83, 74), 'tw': (95, 83, 74)}, button={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, file={'cn': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'en': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'jp': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'tw': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png'}) diff --git a/module/equipment/old_equipment.py b/module/equipment/old_equipment.py new file mode 100644 index 000000000..352aa91c8 --- /dev/null +++ b/module/equipment/old_equipment.py @@ -0,0 +1,272 @@ +from module.base.button import ButtonGrid +from module.base.decorator import cached_property +from module.base.timer import Timer +from module.logger import logger +from module.storage.storage import StorageHandler +from module.equipment.old_assets import * +from module.equipment.assets import * +from module.ui.assets import BACK_ARROW +from module.ui.navbar import Navbar +from module.ui.switch import Switch +from module.retire.assets import DOCK_CHECK, EQUIP_CONFIRM as RETIRE_EQUIP_CONFIRM + +equipping_filter = Switch('Equiping_filter') +equipping_filter.add_state('on', check_button=EQUIPPING_ON) +equipping_filter.add_state('off', check_button=EQUIPPING_OFF) + +SWIPE_DISTANCE = 250 +SWIPE_RANDOM_RANGE = (-40, -20, 40, 20) + +class OldEquipment(StorageHandler): + equipment_has_take_on = False + + def equipping_set(self, enable=False): + if equipping_filter.set('on' if enable else 'off', main=self): + self.wait_until_stable(SWIPE_AREA) + + def _equip_view_swipe(self, distance, check_button=EQUIPMENT_OPEN): + swipe_count = 0 + swipe_timer = Timer(5, count=10) + self.handle_info_bar() + SWIPE_CHECK.load_color(self.device.image) + SWIPE_CHECK._match_init = True # Disable ensure_template() on match(), allows ship to be properly determined + # whether actually different or not + while 1: + if not swipe_timer.started() or swipe_timer.reached(): + swipe_timer.reset() + self.device.swipe_vector(vector=(distance, 0), box=SWIPE_AREA.area, random_range=SWIPE_RANDOM_RANGE, + padding=0, duration=(0.1, 0.12), name='EQUIP_SWIPE') + # self.wait_until_appear(check_button, offset=(30, 30)) + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + if self.appear(check_button, offset=(30, 30)): + break + if self.appear(RETIRE_EQUIP_CONFIRM, offset=(30, 30)): + logger.info('RETIRE_EQUIP_CONFIRM popup in _equip_view_swipe()') + return False + swipe_count += 1 + + self.device.screenshot() + + if self.appear(RETIRE_EQUIP_CONFIRM, offset=(30, 30)): + logger.info('RETIRE_EQUIP_CONFIRM popup in _equip_view_swipe()') + return False + if SWIPE_CHECK.match(self.device.image): + if swipe_count > 1: + logger.info('Same ship on multiple swipes') + return False + continue + + if self.appear(check_button, offset=(30, 30)) and not SWIPE_CHECK.match(self.device.image): + logger.info('New ship detected on swipe') + return True + + def equip_view_next(self, check_button=EQUIPMENT_OPEN): + return self._equip_view_swipe(distance=-SWIPE_DISTANCE, check_button=check_button) + + def equip_view_prev(self, check_button=EQUIPMENT_OPEN): + return self._equip_view_swipe(distance=SWIPE_DISTANCE, check_button=check_button) + + def equip_enter(self, click_button, check_button=EQUIPMENT_OPEN, long_click=True, skil_first_screenshot=True): + enter_timer = Timer(10) + + while 1: + if skil_first_screenshot: + skil_first_screenshot = False + else: + self.device.screenshot() + + # End + if self.appear(check_button): + break + + # Long click accidentally became normal click, exit from dock + if long_click: + if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): + logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') + self.device.click(BACK_ARROW) + continue + if enter_timer.reached(): + if long_click: + self.device.long_click(click_button, duration=(1.5, 1.7)) + else: + self.device.click(click_button) + enter_timer.reset() + + @cached_property + def _equip_side_navbar(self): + """ + pry_sidebar 3 options + research. + equipment. + detail. + + regular_sidebar 4 options + enhancement. + limit break. + equipment. + detail. + + retrofit_sidebar 5 options + retrofit. + enhancement. + limit break. + equipment. + detail. + """ + equip_side_navbar = ButtonGrid( + origin=(21, 118), delta=(0, 94.5), button_shape=(60, 75), grid_shape=(1, 5), name='DETAIL_SIDE_NAVBAR') + + return Navbar(grids=equip_side_navbar, + active_color=(247, 255, 173), active_threshold=221, + inactive_color=(140, 162, 181), inactive_threshold=221) + + def equip_side_navbar_ensure(self, upper=None, bottom=None): + """ + Ensure able to transition to page + Whether page has completely loaded is handled + separately and optionally + + Args: + upper (int): + pry|regular|retrofit + 1|N/A|N/A for research. + N/A|N/A|1 for retrofit. + N/A|1|2 for enhancement. + N/A|2|3 for limit break. + 2|3|4 for equipment. + 3|4|5 for detail. + bottom (int): + pry|regular|retrofit + 3|N/A|N/A for research. + N/A|N/A|5 for retrofit. + N/A|4|4 for enhancement. + N/A|3|3 for limit break. + 2 for equipment. + 1 for detail. + + Returns: + bool: if side_navbar set ensured + """ + if self._equip_side_navbar.get_total(main=self) == 3: + if upper == 1 or bottom == 3: + logger.warning('Transitions to "research" is not supported') + return False + + if self._equip_side_navbar.set(self, upper=upper, bottom=bottom): + return True + return False + + def _equip_take_off_one(self, skip_first_screenshot=True): + bar_timer = Timer(5) + off_timer = Timer(5) + confirm_timer = Timer(5) + + while 1: + if skip_first_screenshot: + self.device.screenshot() + else: + skip_first_screenshot = False + + # End + # if self.handle_info_bar(): + # break + if off_timer.started() and self.info_bar_count(): + break + + if self.handle_storage_full(): + continue + + if confirm_timer.reached() and self.handle_popup_confirm(): + confirm_timer.reset() + continue + + if off_timer.reached(): + if not self.info_bar_count() and self.appear_then_click(EQUIP_OFF, offset=(20, 20)): + off_timer.reset() + continue + + if bar_timer.reached(): + if self.appear(EQUIPMENT_OPEN, offset=(20, 20)) and not self.appear(EQUIP_OFF, offset=(20, 20)): + self.device.click(EQUIPMENT_OPEN) + bar_timer.reset() + continue + + def equipment_take_off(self, enter, out, fleet): + """ + Args: + enter (Button): Long click to edit equipment. + out (Button): Button to confirm exit success. + fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] + """ + logger.hr('Equipment take off') + self.equip_enter(enter) + + for index in '9'.join([str(x) for x in fleet if x > 0]): + index = int(index) + if index == 9: + self.equip_view_next() + else: + self._equip_take_off_one() + self.ui_click(click_button=EQUIPMENT_CLOSE, check_button=EQUIPMENT_OPEN, offset=None) + + self.ui_back(out) + self.equipment_has_take_on = False + + def _equip_take_on_one(self, index, skip_first_screenshot=True): + bar_timer = Timer(5) + on_timer = Timer(5) + + while 1: + if skip_first_screenshot: + self.device.screenshot() + else: + skip_first_screenshot = False + + # End + # if self.handle_info_bar(): + # break + if on_timer.started() and self.info_bar_count(): + break + + if bar_timer.reached() and not self.appear(old_EQUIP_1, offset=10): + self.device.click(EQUIPMENT_OPEN) + # self.device.sleep(0.3) + bar_timer.reset() + continue + + if on_timer.reached() and self.appear(old_EQUIP_1, offset=10) and not self.info_bar_count(): + if index == 1: + self.device.click(old_EQUIP_1) + elif index == 2: + self.device.click(old_EQUIP_2) + elif index == 3: + self.device.click(old_EQUIP_3) + + on_timer.reset() + continue + + def equipment_take_on(self, enter, out, fleet): + """ + Args: + enter (Button): Long click to edit equipment. + out (Button): Button to confirm exit success. + fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] + """ + logger.hr('Equipment take on') + self.equip_enter(enter) + + for index in '9'.join([str(x) for x in fleet if x > 0]): + index = int(index) + if index == 9: + self.equip_view_next() + else: + self._equip_take_on_one(index=index) + self.ui_click(click_button=EQUIPMENT_CLOSE, check_button=EQUIPMENT_OPEN, offset=None) + + self.ui_back(out) + self.equipment_has_take_on = True diff --git a/module/equipment/old_equipment_change.py b/module/equipment/old_equipment_change.py new file mode 100644 index 000000000..9b169f574 --- /dev/null +++ b/module/equipment/old_equipment_change.py @@ -0,0 +1,168 @@ +import cv2 +import numpy as np + +from module.base.button import ButtonGrid +from module.base.utils import random_rectangle_vector +from module.equipment.old_equipment import OldEquipment +from module.logger import logger +from module.equipment.assets import * +from module.ui.assets import BACK_ARROW +from module.ui.scroll import Scroll +from module.ui.switch import Switch +from module.base.decorator import Config + +# Button of 5 equipments +EQUIP_INFO_BAR = ButtonGrid( + origin=(695, 127), delta=(86.25, 0), button_shape=(73, 73), grid_shape=(5, 1), name="EQUIP_INFO_BAR") +# Bottom-left corner of EQUIP_INFO_BAR, to detect whether the grid has an equipment +EQUIPMENT_GRID = ButtonGrid( + origin=(696, 170), delta=(86.25, 0), button_shape=(32, 32), grid_shape=(5, 1), name='EQUIPMENT_GRID') +EQUIPMENT_SCROLL = Scroll(EQUIP_SCROLL, color=(247, 211, 66), name='EQUIP_SCROLL') +SIM_VALUE = 0.90 + +equipping_filter = Switch('Equipping_filter') +equipping_filter.add_state('on', check_button=EQUIPPING_ON) +equipping_filter.add_state('off', check_button=EQUIPPING_OFF) + + +class OldEquipmentChange(OldEquipment): + equip_list = {} + equipping_list = [] + + def get_equiping_list(self, skip_first_screenshot=True): + ''' + Pages: + in: ship's details + ''' + logger.info("Get equipping list") + if skip_first_screenshot: + pass + else: + self.device.screenshot() + index = 0 + self.equipping_list = [] + for button in EQUIPMENT_GRID.buttons: + crop_image = self.image_crop(button) + edge_value = np.mean(np.abs(cv2.Sobel(crop_image, 3, 1, 1))) + # Nothing is 0.15~1 + # +1 is 40 + # +10 is 46 + if edge_value > 10: + self.equipping_list.append(index) + index += 1 + logger.info(f"Equipping list: {self.equipping_list}") + + def record_equipment(self, index_list=range(0, 5)): + ''' + Record equipment through upgrade page + Notice: The equipment icons in the upgrade page are the same size as the icons in the equipment status + ''' + logger.info('RECORD EQUIPMENT') + self.equip_side_navbar_ensure(bottom=1) + self.get_equiping_list() + + for index in index_list: + if index in self.equipping_list: + logger.info(f'Record {index}') + logger.info('Enter equipment info') + self.ui_click(appear_button=EQUIPMENT_OPEN, click_button=EQUIP_INFO_BAR[( + index, 0)], check_button=UPGRADE_ENTER) + logger.info('Enter upgrade inform') + self.ui_click(click_button=UPGRADE_ENTER, + check_button=UPGRADE_ENTER_CHECK, skip_first_screenshot=True) + logger.info('Save equipment tamplate') + self.equip_list[index] = self.image_crop(EQUIP_SAVE) + logger.info('Quit upgrade inform') + self.ui_click( + click_button=UPGRADE_QUIT, check_button=EQUIPMENT_OPEN, appear_button=UPGRADE_ENTER_CHECK, + skip_first_screenshot=True) + + def equipment_take_on(self, index_list=range(0, 5), skip_first_screenshot=True): + ''' + Equip the equipment previously recorded + ''' + logger.info('Take on equipment') + self.equip_side_navbar_ensure(bottom=2) + + for index in index_list: + if index in self.equipping_list: + logger.info(f'Take on {index}') + enter_button = globals()[ + 'EQUIP_TAKE_ON_{index}'.format(index=index)] + + self.ui_click(enter_button, check_button=EQUIPPING_ON, + skip_first_screenshot=skip_first_screenshot, offset=(5, 5)) + self.handle_info_bar() + self._find_equip(index) + + @Config.when(DEVICE_CONTROL_METHOD='minitouch') + def _equipment_swipe(self, distance=190): + # Distance of two commission is 146px + p1, p2 = random_rectangle_vector( + (0, -distance), box=(620, 67, 1154, 692), random_range=(-20, -5, 20, 5)) + self.device.drag(p1, p2, segments=2, shake=(25, 0), + point_random=(0, 0, 0, 0), shake_random=(-5, 0, 5, 0)) + self.device.sleep(0.3) + self.device.screenshot() + + @Config.when(DEVICE_CONTROL_METHOD=None) + def _equipment_swipe(self, distance=300): + # Distance of two commission is 146px + p1, p2 = random_rectangle_vector( + (0, -distance), box=(620, 67, 1154, 692), random_range=(-20, -5, 20, 5)) + self.device.drag(p1, p2, segments=2, shake=(25, 0), + point_random=(0, 0, 0, 0), shake_random=(-5, 0, 5, 0)) + self.device.sleep(0.3) + self.device.screenshot() + + def _equip_equipment(self, point, offset=(100, 100)): + ''' + Equip Equipment then back to ship details + Confirm the popup + Pages: + in: EQUIPMENT STATUS + out: SHIP_SIDEBAR_EQUIPMENT + ''' + logger.info('Equip equipment') + button = Button(area=(), color=(), button=(point[0], point[1], point[0] + offset[0], point[1] + offset[1]), + name='EQUIPMENT') + self.ui_click(appear_button=EQUIPPING_OFF, click_button=button, check_button=EQUIP_CONFIRM) + logger.info('Equip confirm') + self.ui_click(click_button=EQUIP_CONFIRM, check_button=SHIP_INFO_EQUIPMENT_CHECK) + + def _find_equip(self, index): + ''' + Find the equipment previously recorded + Pages: + in: EQUIPMENT STATUS + ''' + + self.equipping_set(False) + + res = cv2.matchTemplate(self.device.screenshot(), np.array( + self.equip_list[index]), cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + if sim > SIM_VALUE: + self._equip_equipment(point) + return + + for _ in range(0, 15): + self._equipment_swipe() + + if self.appear(EQUIP_CONFIRM, offset=(20, 20), interval=2): + self.device.click(BACK_ARROW) + continue + res = cv2.matchTemplate(self.device.screenshot(), np.array( + self.equip_list[index]), cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + if sim > SIM_VALUE: + self._equip_equipment(point) + break + if self.appear(EQUIPMENT_SCROLL_BOTTOM): + logger.warning('No recorded equipment was found.') + self.ui_back(check_button=globals()[f'EQUIP_TAKE_ON_{index}'], appear_button=EQUIPPING_OFF) + break + + return diff --git a/module/equipment/old_fleet_equipment.py b/module/equipment/old_fleet_equipment.py new file mode 100644 index 000000000..be8addf7b --- /dev/null +++ b/module/equipment/old_fleet_equipment.py @@ -0,0 +1,48 @@ +from module.equipment.old_equipment import OldEquipment +from module.equipment.old_equipment_change import OldEquipmentChange +from module.logger import logger +from module.ocr.ocr import Digit +from module.ui.assets import FLEET_CHECK +from module.ui.page import page_fleet +from module.equipment.assets import OCR_FLEET_INDEX, FLEET_NEXT, FLEET_PREV, FLEET_ENTER + +OCR_FLEET_INDEX = Digit(OCR_FLEET_INDEX, letter=(90, 154, 255), threshold=128, alphabet='123456') + + +class DailyEquipment(OldEquipmentChange): + equipment_has_take_on = False + + @property + def _fleet_daily(self): + fleet = self.config.FLEET_DAILY + if isinstance(fleet, list): + logger.info(f'Multiple daily fleets are set, change equipment only for the first one. fleet: {fleet}') + return fleet[0] + else: + return fleet + + def equipment_take_on(self): + if self.config.FLEET_DAILY_EQUIPMENT is None: + return False + if self.equipment_has_take_on: + return False + + self.ui_ensure(page_fleet) + self.ui_ensure_index(self._fleet_daily, letter=OCR_FLEET_INDEX, next_button=FLEET_NEXT, prev_button=FLEET_PREV) + OldEquipment.equipment_take_on(self, enter=FLEET_ENTER, out=FLEET_CHECK, fleet=self.config.FLEET_DAILY_EQUIPMENT) + self.equipment_has_take_on = True + self.device.sleep(1) + return True + + def equipment_take_off(self): + if self.config.FLEET_DAILY_EQUIPMENT is None: + return False + if not self.equipment_has_take_on: + return False + + self.ui_ensure(page_fleet) + self.ui_ensure_index(self._fleet_daily, letter=OCR_FLEET_INDEX, next_button=FLEET_NEXT, prev_button=FLEET_PREV) + super().equipment_take_off(enter=FLEET_ENTER, out=FLEET_CHECK, fleet=self.config.FLEET_DAILY_EQUIPMENT) + self.equipment_has_take_on = False + self.device.sleep(1) + return True