From 97bde6f6017298047b947573e1bd18b8d79989b6 Mon Sep 17 00:00:00 2001 From: sui-feng-cb Date: Sun, 22 Dec 2024 00:21:56 +0800 Subject: [PATCH] Add: GemsFarming hard mode --- .../FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png | Bin 0 -> 8295 bytes .../FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png | Bin 0 -> 7441 bytes .../equipment/FLEET_DETAIL_ENTER_HARD_1.png | Bin 0 -> 8516 bytes .../equipment/FLEET_DETAIL_ENTER_HARD_2.png | Bin 0 -> 7176 bytes .../equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png | Bin 0 -> 7688 bytes .../equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png | Bin 0 -> 7230 bytes assets/cn/equipment/FLEET_ENTER_HARD_1.png | Bin 0 -> 7382 bytes assets/cn/equipment/FLEET_ENTER_HARD_2.png | Bin 0 -> 7489 bytes assets/cn/retire/DOCK_SHIP_DOWN.BUTTON.png | Bin 0 -> 19418 bytes assets/cn/retire/DOCK_SHIP_DOWN.png | Bin 0 -> 5736 bytes config/gg_handler/gg_data_alas.tmp | 4 + module/campaign/gems_farming.py | 324 +----------- module/campaign/gems_shipchange.py | 482 ++++++++++++++++++ module/equipment/assets.py | 8 + module/retire/assets.py | 1 + 15 files changed, 510 insertions(+), 309 deletions(-) create mode 100644 assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png create mode 100644 assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png create mode 100644 assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_1.png create mode 100644 assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_2.png create mode 100644 assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png create mode 100644 assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png create mode 100644 assets/cn/equipment/FLEET_ENTER_HARD_1.png create mode 100644 assets/cn/equipment/FLEET_ENTER_HARD_2.png create mode 100644 assets/cn/retire/DOCK_SHIP_DOWN.BUTTON.png create mode 100644 assets/cn/retire/DOCK_SHIP_DOWN.png create mode 100644 config/gg_handler/gg_data_alas.tmp create mode 100644 module/campaign/gems_shipchange.py diff --git a/assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png b/assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png new file mode 100644 index 0000000000000000000000000000000000000000..00b42889675c335bacfb8e569dff5df36bd503d6 GIT binary patch literal 8295 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 literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png b/assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b792e4811b07490cfb7ac67555a9d4f0c90caef0 GIT binary patch literal 7688 zcmeHKXIN9|w%&k)1uV#n6dNW33IYiUHA2uK1O%dh%m5+~Bs&m+1W6zPq$o2ADq_Kc zVB&xjl`;ZBnh*yRL^=+UW>i2ydM_bxcCef?_nC9&-t*`DaX(Lzoo}sgm3O^seS62) z9h=TqEJm>BPHc96$;4&=BP(N68z0T zZ;E9|0C*_mfP-g)$ejvj`h2`fwmEpnC zqSE1?E#N@9X8^^YL7`Dq#1=h{(gGPKFeucIIr#a1F-xU?!U;kQ!Se7&=x8IwIV~%a zJiqAq2L|{qJ12P}Kwr=gq%!D`uFe--e{ULtM)#)u8`EFJe{uj}OCWsl@t3jq`F(Lg zXP5^;X?z0YFSY3o!Tun^9;DL(13W?VASg`u=WG}h@;~AH({8ckPjP`P%D+(+OTMW3 zW6T0T4+bs3fkyNFTz}ioK&YT}wGC8uIZ~)38k4Rr4&&1X5a+=FO<)igbhUI)S~^A! zI{IQR=pc7Pq(CA+suE}<3OV>MRShvZ`hQY|m`L(qc>Jw0$rD4S1^9VDFjD+Hyg-CM z)eENbr8pQfnlCK?atuX>UXFr5!0e~e86H$ma6irj2Bn})p^z}-qlPH75elgVqR<{% zN71^_mkx;3LZdv<24qm5OwvJp-jAbs28#Lec|Ym@x&L4Q1!`Ci-~Zf>xV{+33>1Wi zxG79vIxv;xMJF*;d;>o&8laHSh0qayf08@@jr^bDAE^`wR48dNLq6ho2pTvLkotOh zXuVJCwiFiV>x82~c+fuvf-;1BE$>;DIsc0cibveh%T0o@q|hOv1%H|mhrr{X?tCdK z%YA|I@cfvCrESGh1Z}Y_`vd&o?X_Qn|m~WV#E5o4uOG>G|EOgLp8+b(AVoL0{=|}SdNPy=m!DdRrSc? z98*E*As&x=RQ>YIE&>jRT}pO-Ol4Y~3x?#jZaePoB5`YxnvwJFY{_^?}hfX%F^c!v6)J8sp?I*)~OaY?TN{o z>MN+BOWn0zif!Ob1uY_4Z9aHwA%2Nc&`Vnxxo=~ngyNmFe7;>-jDEYl)y&;<_k)hq zynX7F^1QZedqiHRnG0MP9bMp;;_N#!gf-XIp>{m^F^rL5_ncK)crPNlHahw^rTdtU z{fs)ihE=q_D6YCTdRMBSqs1^B_LM*H9*4_(H*un8aR&-ra^pgA$q3b2-no0Yq~jT) zEuy^{rVL11Ldh7mM@OgO4khDpG1%hvrBQ?J)NX2br5avuX~BJ|CF}!7wrMKS;+STG z^LMd%p_>d#YIioMe;9vOoiMSbG->aPzTt_n?uC29`%^K+gM7SpQzZ%YEU8O0O?BH+ zR#YV79uT@oO9K*$k#7pmM(-l1r;^B~>yrpL`H1=cgXyw`#pmj~C;JOrOQtq;4K5UJ zW2d)hL!eWu_$eDxMcFpt3DrDcl+Ov31V+=WDDZ}@-y|}p-D?PpmSMhoT7vV<=#2(~ zt^!9@7>eDRFF`b1K?J1lxa!%I{roPH|DiT7WKjW>cjXfz5=dl?*fOe_hQ2fLw8HuN0C2G58N*X@|w|gfLEHNEbroA z_=Vw`Cn-I13OlyzgXcIBipCI-68%2pu(^GO*Xwv*ZedfulZ10h%?Q9raxE{?7-x)Y zje0wzV80Sey4m)AP}5WzaL0T{1Wu>Wa*}mbkKyYw#%4o8y=D=8Qf46(M0t)9P__z+ z(X1I4Y{T~P`IQ5{wl;q{RVunCTdFFe-lA`|I}6AHa*$3%!6vvMZC$4(edNAILq|)_ zfkxmrjtLKteRi$3Xu2mQBw=%kv;#1TT_s*KBauV9sN1?Sr3`YMkSCnZWNp>XwJpjy zGcA&g%welG0U}?E&>I}My(NJ=EhAuzs^u6F1xBMKK!{s z@0o~M(TPUR;!OIm=fiGhcW3JBX8lyh70dMUpuD|(p;~V|V^0s8Rn!Tb*i-yytDs&W zII(9a%|~LkpO%I1!0>OCbGhq(>cFX|mMcU`>;WzDHvF?*N`iu2T#iWlpj$(osMSI=d_r*};J-~{Io>KptKSyPZ}W%I$Jn{v zMzEQO-ruEs>;&dr|Y5sqUrjbfWs~hQJ|#*DnHYg0V)&#sKHFDs%JI5`OQI@>8&gSUeNfPJF{|z24GvaYdQqELhAnDSD zj3N>hOa#>`N_P4!(OjpioHb8*>!MqC@bye4q^j=I;-Dz2Q7ux@0&x_XQ2^@12y zG%GrKqn(w~)wD^y?q6%;l4w{LF-kJah*Of2`dhE-r99P;n(3(T5758R)EDw?V5=z( z7jK^&L)CW)D#BzqGFnp(TOt041{L}i7w^acuLoe_VbsAldgkFb>hlbkw9cV{ySpgt24`iNNe#Kd@;Oj#XxevgB8UjTsF4O)%=Kg<%P=71liI) z$)Pq&K$Z;!cYD&AZp&>gBXblQ7JyOn4dRUj6oIuxM)7p9rt579;yx%K%j{R?);)_a zWe)6i=HDAT@28?clfc8HRKGvUMa|0SF*LO+sw~j~}dDOy1kye3C{N% znuvC}mNTci65o4k`dS2iV0I${@I~LzR{><*+*3+Mo~De&@JD3wi+WvgFE+}x;j(j1 zlzH#%+EVHscv3p@u{h&+?7;rbN8=99Ef@=0`{-Ib_)$y=&h(wPYl{|JauAkMyz9_F zA=bE^_WO@Y(hk9XB4Z|f;;lBMpyG#~DV@D*r1n=2&fT#kcWyq`VWH}i0Nqyj6 zFGkPEK}VBWx{NL`$VKRqOF2J2+4HW=g7jV3M~>LeD<@Qa-&#C9vilEfe6K4yQ?5ze zd>h2ajZ_Pb^jI_yYjCJHdqc3pq5c!o zTB}(zt!rse03X_Zk6N~Fi@)Q%>(bq{Fw{ywQ4Jb7JBkhmox~zV_{#V9ZVn&37it!O zH`Wdk-`QGh|ixqVbAIizCztmPv zB?7Zn%ZE=#es4&=s6@s%y06j4r>yKvYxggDuz8b1Jl7iPYQ2rtBItq$6{#L4@XM%F{aXnGvB1b!5@>?6&7#dU217g8O>;@QyGE zq5%YxM?zOav5>l0rZseC{q_RA^ z|M2_Vnx?QdPk{|%RO&b|s&-7kkB;tVD9d#ZjJ*|<+*mL+Ixd<>y=L=%!a|b9$5Gg~ z+TsgumJj585aR*WJE|GKS%6!*8>igDNgop(mM)8ZMj9{LS$KCFBW2sw@i!F$bKKyn z;#3Mq1XhW|q$KO6#+fT89Z2srNPR?wA2n8fKVu{c4(W^>xg9e(h+UfHM4Wxer5E~H zKMR#m1jK!(={Y{pGd!HF<%jDG58W)+mG4q+Le<8-T3|T+GW}hRT=&Qgo1%87tzG3& zmFob`IS4abt(4cK+)F3l>#(SKzQuDC=4E5|=Xa+Ifh{i2OS2kf06H|xAY@_}@>Mwp z)UIGTX;s+ym#nP0%P_FqNqI=_F*Ht~=bEVI5sfnk!r7f+5emJL{=%SsCOoj=I%>q` zfl#AawBRCyI@wT6)w^LLy2|`$H9Q!v2j_2FF<8Hz7rFdOq*t81Ij%}IWxxRKFK-9;!QwlW z<>HE%UbkJ_FDG)`n|+O(l5u%Tr4Mfv1TDU6_#?glVZ6Q7v)U=sm4NgCXl590J9Ly! z=t#qnI^xF(C9@deU<&jQg(KnP&pVTG>Y!58`>7Xc@dH(M=sexj_$qi_anK$7i#oU+ zj2=vKHqD-Z(bWl+3#GNrv39s4h%?yUElln^RAVfo4fZpd+*==?cZ4| zKOMF*UbSN53IM<=QxiiQ0G7f>smIHu;McybW+?de1OrzGJh&JP{?f;IayTp!4#(s1uskg+)AtxogGeOe@R~SHO?Bv@&JJL3$o}dK zw(`dv3~6kNFP+7qGZ|=PN3uJU%hAWcR2ORSVSU<`!Cu4(B8KxPvv3+%JW|uVBbD;W zkHz)%o)1o?;Aq}79~y(hhQ1n~d|94M4wLQ4{5M;FGXE(6#MaXCQ;fgN#mDDU2sX#a z50|oDGf5A`(ytPe*^-psf{I|Rqg2vDwD@nL(*7WKrpx{6tckAeA=`6lK zO!udGI~dX-9_)ogG<9LD`8D%4$A7WGe2|Hr9}R1vfU+gTo{H()J&NAph+s;9&ANM41-q!2RzM z=WYL@Vjtb1G$N0mL>d10Bz_2xvENJCDNv>h_j1Yk zeG1uEmwEqD;i)0}<;v^0s;$dwx3^73wR)_*+*;>**)Fi};VREY1**xZ6}eYeTd3z> zpql4XP5oNq1S!j2=3wKqt9fkyv1D=b^7%vM^X)SNpAqGI<4j;XL1W%<_L)H)W`ZEEK)7`YD3g}LgA$Xyq16RRN+E(mOyA^*v=@9;)nNBu714 z*5s?z3U+pRgF>U`T8yuYvx+EJJ92twUem-|6Fc=(5|371l$Q%Q zdP_Qhu8`r(Z+$oT`tBtYt|Py{zjsTb{Y>f#u=NL@3qbKg!`xKStX&9~yWW|PWiXlP z{D!&l$@ktpO|fll0|O^lGc`E|L?Un5_8q)UDue4z6L7c7j0ED=x>qbc+vxPRT!Xy4 zBhfik#j7_vTVyro`}E4=n1!wkTDr0QcS_Ug< zPHevP6VEvCLz(vn_MulPxP*y5Kg}yWM@7diLN^tpdeo&6r_O*1$-vf5gg&ddG3=E1 zsK?K1?C*C7r&x~V<6Z=p(nLZXhoqhn^+(LBK;P07&MNTRH?W)A)Qr#S$A|+o?zKgg z(OSm84;u_IDXIDDyE7tNiMvp{Ij=eYvgn3#Z&gp`!0OE7Kv4>%7*1A;Y&tNar|2qC zskPrBR??Y!YEdqXolYzdeJc}g?y(9FPUQ>zJS!c4VRcsZ&Q{*xRh1^1J!9;>je!l` z4g;$OltwcR^>Q{(-E$p%nLV_r@BBFt(a3sYDS!d?SE-GpUt8NXLXi|3syUT+uIOa z=mOc%uSMG)&3cuG;95i4C9>d0Q|P{LM2$Y|5TUR8!<44%Ej8bbrIG`n!e~u6O7TK> zO<03P`PO5{2Z%dUQC)i=z!fhFyvkLAzXJX|gxXE9HmiSsE|&NHDcWXsAdOR_Vz)%b z?adN5Aak8_91l{1qh?G;_y>=uVS0r@N4MCK8WjL$imCktP}r4~RM{fl>ogdqS2LFN zwsUT{vUj?Cb^zDhH`*FcI#Q)pQvue@)9I|qjKxx+*4$(jGq%4t)Zf)EMDGFpA|$fg z!wbtR)(m)bUHS^7u1RWM8($p|@@@TOl@==8{%fT0O;^}n>O=2!Ul_OQ`h3vq%LMyU zEl$9~&D1i~8Xu-SyOi4hQdrX-6qeUb7%){Zs+9?kIE<2UW7RX3abHhL4tU)i>I!;{ zk_BuN=}(RE#W;`x)H=7D2E5$0QLr(i%hJnpV})SKDsVixW#)o%nomvR z&e3nOc1cU`y8%18OU=(bKU!e3#U(+|YM%XJW}?HatzN-WKX;Hx%4T1`+>lr>@+R_C zf49K~@MAU1{=&}>d>l)|@>khy3My8KernX#+R>3Z`ynf9C{EeTP^X^jY~TI1vU5(+ zxi(C#AT`UCF?Xyx;QVD=!ln8>6YIb}h#d&hYi$dNJt4SEsB7#$XJb)rRG^w_;A&hg z4p=Lf;U(%kA9BZ-{)95*1t#txwVM>HM(+LYx0HLQtiNxIus;7bv^ib!JidX#NWn`pl)OI-ah$x|n)f?!nWbTmG zaM7=wRV~mrtSsoBt&^D=*Dgwk=fBqb$JmTiI9Z&G2b;%FI##Ez%iw3y54O>I?x>41 zt74q4tpmb1SbbjF0A_VzAT}epoa*HYx*Qi~$kqAkq2^pyLDQp#%Bk6hG`R_bV3^6F^eKZWFN5R3SsHDDbRa;GMo~$m}4iGS;ZV#w?Pp= zW&80PqtHj+KmRSgmmzaL%bg`q#Vr@&F3Tn#Z2WbT0xJB(d~ZV^mEKY$p7q=+YEsF$ zFH*JH2}X?&z4bM`uBF^Nc(_PXuq;zmvi4Lb>pmU?KhwT11vTlXk+gt6rlT+^D_ZE? zV@hUOaGDJf)|;qE_@scOqaIz{$9jJ6r)$dgGj|~KV+jQS&JWR`#2|3w%F`g_-m!kE z>wlCDLK#Cak4x5`aH+Z-)cnA^KD}E7RRItcs@lP3SXdA4k!BvNt5KD5t)_sAJz8oj z!ta~6J$!CVp$OJ{MH6B|lTJw9T^hA$h{&%l2e;Ftpi1>%tA(n8KU<6aHuXmTinDea zpQ{6ST|}r&eu}VhKWcRL&FV)FN(C~`2W4D@68|j|m7Sfnvw2rK>e32U$%CJfdeFq) z5{q)V_?DbWJ(b^wMu)en6kJ_6!B|hL@bGM?8J+%d!^H5eetWIzN#!4d!JAa5U={5W zf!T4bD?Mkv$AjVIwMd1NCG;|#oUoo?Hd~y@?IN_#DuCyR_@gs+(i-bM3hGwsO^$85 z(_fK3)^C#>+rouyUk|}kjBARGxLoHUXC0D_!9fuBh~Ja;QWhlzq0p-}LuKH_8$`JFs8A z*1mWGg+@+7m8e0ll7iM|mzlKEM%g5v#cQ$h>?r_kZp%=GryXl--j1MdC_|9xouY2^pJY1P?w?id(O(s4OlH7!eHJWuO|{BF*C@2 p;GeJ02z*B1GXnpw5nx@MTXy&h)RVnQkpu(?QzI+G+;81Z{tr?zJCpzb literal 0 HcmV?d00001 diff --git a/assets/cn/equipment/FLEET_ENTER_HARD_1.png b/assets/cn/equipment/FLEET_ENTER_HARD_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a7bf815a4314f37076a9b11de20282e8d9cee7d4 GIT binary patch literal 7382 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/DOCK_SHIP_DOWN.BUTTON.png b/assets/cn/retire/DOCK_SHIP_DOWN.BUTTON.png new file mode 100644 index 0000000000000000000000000000000000000000..62c377fbe1fc92f44b978a0568f1756ddeb7d0e4 GIT binary patch literal 19418 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 JpKt#2e*o@4ikkoc literal 0 HcmV?d00001 diff --git a/assets/cn/retire/DOCK_SHIP_DOWN.png b/assets/cn/retire/DOCK_SHIP_DOWN.png new file mode 100644 index 0000000000000000000000000000000000000000..fb96aa6098b0de9be4f327a4c9d4dad17b7727e4 GIT binary patch literal 5736 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 10 - - _dock_reset() needs to be called later. - - Returns: - Ship: - """ - if self.config.GemsFarming_CommonDD == 'any': - faction = ['eagle', 'iron'] - elif self.config.GemsFarming_CommonDD == 'favourite': - faction = 'all' - elif self.config.GemsFarming_CommonDD == 'z20_or_z21': - faction = 'iron' - elif self.config.GemsFarming_CommonDD in ['aulick_or_foote', 'cassin_or_downes']: - faction = 'eagle' - else: - logger.error(f'Invalid CommonDD setting: {self.config.GemsFarming_CommonDD}') - raise ScriptError('Invalid GemsFarming_CommonDD') - - favourite = self.config.GemsFarming_CommonDD == 'favourite' - self.dock_favourite_set(favourite, wait_loading=False) - self.dock_sort_method_dsc_set(True, wait_loading=False) - self.dock_filter_set( - index='dd', rarity='common', faction=faction, extra='can_limit_break') - - logger.hr('FINDING VANGUARD') - - if self.config.SERVER in ['cn']: - max_level = 100 - else: - max_level = 70 - - scanner = ShipScanner(level=(max_level, max_level), emotion=(10, 150), - fleet=self.fleet_to_attack, status='free') - scanner.disable('rarity') - - 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 in ['any', 'favourite', 'z20_or_z21']: - # Change to any ship - return scanner.scan(self.device.image, output=False) - - candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) - if candidates: - # Change to specific ship - return candidates - - logger.info('No specific DD was found, try reversed order.') - self.dock_sort_method_dsc_set(False) - - # Change specific ship - 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 == '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 flagship_change_execute(self): - """ - Returns: - bool: If success. - - Pages: - in: page_fleet - out: page_fleet - """ - self.ui_click(FLEET_ENTER_FLAGSHIP, - appear_button=page_fleet.check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) - - ship = self.get_common_rarity_cv() - if ship: - self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) - - logger.info('Change flagship success') - return True - else: - logger.info('Change flagship failed, no CV in common rarity.') - self._dock_reset() - self.ui_back(check_button=page_fleet.check_button) - return False - - def vanguard_change_execute(self): - """ - Returns: - bool: If success. - - Pages: - in: page_fleet - out: page_fleet - """ - self.ui_click(FLEET_ENTER, - appear_button=page_fleet.check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) - - ship = self.get_common_rarity_dd() - if ship: - 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.') - self._dock_reset() - self.ui_back(check_button=page_fleet.check_button) - return False + def ship_change_method(self): + return self.campaign.config.Campaign_Mode _trigger_lv32 = False _trigger_emotion = False @@ -420,10 +121,15 @@ def run(self, name, folder='campaign_main', mode='normal', total=0): # End if self._trigger_lv32 or self._trigger_emotion: success = True + self.ship_change: Dict[str, ShipChange] = { + 'normal': NormalShipChange(config=self.config, device=self.device), + 'hard': HardShipChange(config=self.config, device=self.device, + campaign=self.campaign, stage=self.stage) + } if self.change_flagship: - success = self.flagship_change() + success = self.ship_change[self.ship_change_method].flagship_change() if self.change_vanguard: - success = success and self.vanguard_change() + success = success and self.ship_change[self.ship_change_method].vanguard_change() if is_limit and self.config.StopCondition_RunCount <= 0: logger.hr('Triggered stop condition: Run count') @@ -447,4 +153,4 @@ def run(self, name, folder='campaign_main', mode='normal', total=0): continue else: - break + break \ No newline at end of file diff --git a/module/campaign/gems_shipchange.py b/module/campaign/gems_shipchange.py new file mode 100644 index 0000000000..ec5f35baf1 --- /dev/null +++ b/module/campaign/gems_shipchange.py @@ -0,0 +1,482 @@ +from abc import ABCMeta, abstractmethod +from module.campaign.campaign_base import CampaignBase +from module.campaign.run import CampaignRun +from module.config.config import AzurLaneConfig +from module.equipment.assets import * +from module.equipment.equipment_change import EquipmentChange +from module.equipment.fleet_equipment import FleetEquipment +from module.exception import ScriptError, RequestHumanTakeover +from module.logger import logger +from module.map.assets import FLEET_PREPARATION, MAP_PREPARATION +from module.map.map_operation import MapOperation +from module.retire.assets import ( + DOCK_CHECK, DOCK_SHIP_DOWN, + TEMPLATE_BOGUE, TEMPLATE_HERMES, TEMPLATE_LANGLEY, TEMPLATE_RANGER, + TEMPLATE_CASSIN_1, TEMPLATE_CASSIN_2, TEMPLATE_DOWNES_1, TEMPLATE_DOWNES_2, + TEMPLATE_AULICK, TEMPLATE_FOOTE +) +from module.retire.dock import Dock +from module.retire.scanner import ShipScanner +from module.ui.assets import BACK_ARROW +from module.ui.page import page_fleet + +SIM_VALUE = 0.92 + + +class ShipChange(CampaignRun, Dock, EquipmentChange, metaclass=ABCMeta): + config: AzurLaneConfig + # Will be overridden in NormalShipChange and HardShipChange + fleet_to_attack: int + page_fleet_check_button: Button + flagship_detail_enter: Button + vanguard_detail_enter: Button + flagship_enter: Button + vanguard_enter: Button + + @abstractmethod + def fleet_enter(self): + pass + + @abstractmethod + def fleet_enter_ship(self, button): + pass + + @abstractmethod + def fleet_back(self): + pass + + @abstractmethod + def dock_ship_down(self, button): + pass + + @abstractmethod + def after_flagship_change_failed(self): + pass + + @abstractmethod + def after_vanguard_change_failed(self): + pass + + @property + def change_flagship_equip(self): + return 'equip' in self.config.GemsFarming_ChangeFlagship + + @property + def change_vanguard_equip(self): + return 'equip' in self.config.GemsFarming_ChangeVanguard + + 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) + self.fleet_enter() + if self.change_flagship_equip: + logger.hr('Record flagship equipment', level=2) + self.fleet_enter_ship(self.flagship_detail_enter) + self.ship_equipment_record_image(index_list=index_list) + self.ship_equipment_take_off() + self.fleet_back() + + logger.hr('Change flagship', level=2) + success = self.flagship_change_execute() + + if self.change_flagship_equip: + logger.hr('Equip flagship equipment', level=2) + self.fleet_enter_ship(self.flagship_detail_enter) + self.ship_equipment_take_off() + self.ship_equipment_take_on_image(index_list=index_list) + self.fleet_back() + + 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) + self.fleet_enter() + if self.change_vanguard_equip: + logger.hr('Record vanguard equipment', level=2) + self.fleet_enter_ship(self.vanguard_detail_enter) + self.ship_equipment_record_image() + self.ship_equipment_take_off() + self.fleet_back() + + logger.hr('Change vanguard', level=2) + success = self.vanguard_change_execute() + + if self.change_vanguard_equip: + logger.hr('Equip vanguard equipment', level=2) + self.fleet_enter_ship(self.vanguard_detail_enter) + self.ship_equipment_take_off() + self.ship_equipment_take_on_image() + self.fleet_back() + + return success + + def _dock_reset(self): + self.dock_favourite_set(False, wait_loading=False) + self.dock_sort_method_dsc_set(wait_loading=False) + self.dock_filter_set() + + def _ship_change_confirm(self, button): + self.dock_select_one(button) + self._dock_reset() + self.dock_select_confirm(check_button=self.page_fleet_check_button) + + def get_common_rarity_cv(self, level=31, emotion=10): + """ + Get a common rarity cv by config.GemsFarming_CommonCV + If config.GemsFarming_CommonCV == 'any', return a common lv1 ~ lv33 cv + + _dock_reset() needs to be called later. + + Returns: + Ship: + """ + self.dock_favourite_set(False, wait_loading=False) + self.dock_sort_method_dsc_set(False, wait_loading=False) + self.dock_filter_set( + index='cv', rarity='common', extra='enhanceable', sort='total') + + logger.hr('FINDING FLAGSHIP') + + scanner = ShipScanner(level=(1, level), emotion=(emotion, 150), + fleet=self.fleet_to_attack, status='free') + scanner.disable('rarity') + + if self.config.GemsFarming_CommonCV == 'any': + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + # Change to any ship + 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()}'] + + 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: + # Change to specific ship + return candidates + + logger.info('No specific CV was found, try reversed order.') + self.dock_sort_method_dsc_set(True) + + 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=10): + """ + Get a common rarity dd with level is 100 (70 for servers except CN) and emotion > 10 + + _dock_reset() needs to be called later. + + Returns: + Ship: + """ + if self.config.GemsFarming_CommonDD == 'any': + faction = ['eagle', 'iron'] + elif self.config.GemsFarming_CommonDD == 'favourite': + faction = 'all' + elif self.config.GemsFarming_CommonDD == 'z20_or_z21': + faction = 'iron' + elif self.config.GemsFarming_CommonDD in ['aulick_or_foote', 'cassin_or_downes']: + faction = 'eagle' + else: + logger.error(f'Invalid CommonDD setting: {self.config.GemsFarming_CommonDD}') + raise ScriptError('Invalid GemsFarming_CommonDD') + favourite = self.config.GemsFarming_CommonDD == 'favourite' + self.dock_favourite_set(favourite, wait_loading=False) + self.dock_sort_method_dsc_set(True, wait_loading=False) + self.dock_filter_set( + index='dd', rarity='common', faction=faction, extra='can_limit_break') + + logger.hr('FINDING VANGUARD') + + if self.config.SERVER in ['cn']: + max_level = 100 + else: + max_level = 70 + + scanner = ShipScanner(level=(max_level, max_level), emotion=(emotion, 150), + fleet=self.fleet_to_attack, status='free') + scanner.disable('rarity') + + 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 in ['any', 'favourite', 'z20_or_z21']: + # Change to any ship + return scanner.scan(self.device.image, output=False) + + candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) + + if candidates: + # Change to specific ship + return candidates + + logger.info('No specific DD was found, try reversed order.') + self.dock_sort_method_dsc_set(False) + + # Change specific ship + 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 == '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 flagship_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.dock_ship_down(self.flagship_detail_enter) + self.ui_click(self.flagship_enter, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + + ship = self.get_common_rarity_cv() + if ship: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + + logger.info('Change flagship success') + return True + else: + logger.info('Change flagship failed, no CV in common rarity.') + self.after_flagship_change_failed() + return False + + def vanguard_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.dock_ship_down(self.vanguard_detail_enter) + self.ui_click(self.vanguard_enter, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + + ship = self.get_common_rarity_dd() + if ship: + 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.') + self.after_vanguard_change_failed() + return False + + +class NormalShipChange(FleetEquipment, ShipChange): + @property + def fleet_to_attack(self): + if self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': + return self.config.Fleet_Fleet2 + else: + return self.config.Fleet_Fleet1 + + @property + def page_fleet_check_button(self): + return page_fleet.check_button + + @property + def flagship_detail_enter(self): + return FLEET_DETAIL_ENTER_FLAGSHIP + + @property + def vanguard_detail_enter(self): + return FLEET_DETAIL_ENTER + + @property + def flagship_enter(self): + return FLEET_ENTER_FLAGSHIP + + @property + def vanguard_enter(self): + return FLEET_ENTER + + def fleet_enter(self): + super().fleet_enter(self.fleet_to_attack) + + def fleet_enter_ship(self, button): + super().fleet_enter_ship(button) + + def fleet_back(self): + super().fleet_back() + + def dock_ship_down(self, button): + """ + Don't need to down ship in normal mode + """ + pass + + def after_flagship_change_failed(self): + self._dock_reset() + self.ui_back(check_button=page_fleet.check_button) + + def after_vanguard_change_failed(self): + self.after_flagship_change_failed() + + +class HardShipChange(MapOperation, ShipChange): + def __init__(self, campaign=None, stage=None, *args, **kwargs): + super().__init__(*args, **kwargs) + self.campaign: CampaignBase = campaign + self.config = self.campaign.config + self.stage: str = stage + + @property + def fleet_to_attack(self): + return 2 if self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all' else 1 + + @property + def page_fleet_check_button(self): + return FLEET_PREPARATION + + @property + def flagship_detail_enter(self): + return globals()[f'FLEET_DETAIL_ENTER_FLAGSHIP_HARD_{self.fleet_to_attack}'] + + @property + def vanguard_detail_enter(self): + return globals()[f'FLEET_DETAIL_ENTER_HARD_{self.fleet_to_attack}'] + + @property + def flagship_enter(self): + return globals()[f'FLEET_ENTER_FLAGSHIP_HARD_{self.fleet_to_attack}'] + + @property + def vanguard_enter(self): + return globals()[f'FLEET_ENTER_HARD_{self.fleet_to_attack}'] + + def fleet_enter(self): + if self.appear(FLEET_PREPARATION, offset=(20, 50)): + return + self.campaign.ensure_campaign_ui(self.stage) + self.ui_click(click_button=self.campaign.ENTRANCE, + appear_button=BACK_ARROW, check_button=MAP_PREPARATION) + while 1: + self.device.screenshot() + + if self.handle_map_mode_switch('hard') and self.appear_then_click(MAP_PREPARATION, interval=1): + continue + + if self.handle_retirement(): + continue + + if self.appear(FLEET_PREPARATION, offset=(20, 50)): + break + + def fleet_enter_ship(self, button): + self.ship_info_enter(button) + + def fleet_back(self): + self.ui_back(FLEET_PREPARATION) + + def dock_ship_down(self, button): + """ + In hard mode, let the ship leave the fleet first + """ + self.ui_click(button, + appear_button=FLEET_PREPARATION, check_button=DOCK_CHECK, skip_first_screenshot=True) + if self.appear(DOCK_SHIP_DOWN): + self.ui_click(DOCK_SHIP_DOWN, + appear_button=DOCK_CHECK, check_button=FLEET_PREPARATION, skip_first_screenshot=True) + else: + self.ui_back(check_button=FLEET_PREPARATION) + + def after_flagship_change_failed(self): + """ + In hard mode, should still put a ship in the fleet if there is no available ship + """ + max_level = 100 if self.config.SERVER in ['cn'] else 70 + ship = self.get_common_rarity_cv(level=max_level, emotion=0) + if ship: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + else: + raise RequestHumanTakeover + + def after_vanguard_change_failed(self): + """ + In hard mode, should still put a ship in the fleet if there is no available ship + """ + ship = self.get_common_rarity_dd(emotion=0) + if ship: + self._ship_change_confirm(max(ship, key=lambda s: s.emotion).button) + else: + raise RequestHumanTakeover diff --git a/module/equipment/assets.py b/module/equipment/assets.py index afce8c446c..60a08cfe38 100644 --- a/module/equipment/assets.py +++ b/module/equipment/assets.py @@ -25,8 +25,16 @@ FLEET_DETAIL_CHECK = Button(area={'cn': (915, 647, 980, 679), 'en': (915, 649, 980, 677), 'jp': (915, 647, 979, 679), 'tw': (915, 647, 980, 680)}, color={'cn': (234, 195, 154), 'en': (236, 200, 160), 'jp': (234, 195, 154), 'tw': (237, 196, 154)}, button={'cn': (915, 647, 980, 679), 'en': (915, 649, 980, 677), 'jp': (915, 647, 979, 679), 'tw': (915, 647, 980, 680)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_CHECK.png', 'en': './assets/en/equipment/FLEET_DETAIL_CHECK.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_CHECK.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_CHECK.png'}) FLEET_DETAIL_ENTER = Button(area={'cn': (729, 314, 802, 438), 'en': (729, 314, 802, 438), 'jp': (729, 314, 802, 438), 'tw': (729, 314, 802, 438)}, color={'cn': (154, 149, 147), 'en': (154, 149, 147), 'jp': (154, 149, 147), 'tw': (154, 149, 147)}, button={'cn': (729, 314, 802, 438), 'en': (729, 314, 802, 438), 'jp': (729, 314, 802, 438), 'tw': (729, 314, 802, 438)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER.png', 'en': './assets/en/equipment/FLEET_DETAIL_ENTER.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_ENTER.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_ENTER.png'}) FLEET_DETAIL_ENTER_FLAGSHIP = Button(area={'cn': (103, 327, 176, 437), 'en': (103, 327, 176, 437), 'jp': (103, 327, 176, 437), 'tw': (103, 327, 176, 437)}, color={'cn': (141, 135, 138), 'en': (141, 135, 138), 'jp': (141, 135, 138), 'tw': (141, 135, 138)}, button={'cn': (103, 327, 176, 437), 'en': (103, 327, 176, 437), 'jp': (103, 327, 176, 437), 'tw': (103, 327, 176, 437)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'en': './assets/en/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png'}) +FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1 = Button(area={'cn': (390, 173, 476, 259), 'en': (390, 173, 476, 259), 'jp': (390, 173, 476, 259), 'tw': (390, 173, 476, 259)}, color={'cn': (91, 71, 68), 'en': (91, 71, 68), 'jp': (91, 71, 68), 'tw': (91, 71, 68)}, button={'cn': (390, 173, 476, 259), 'en': (390, 173, 476, 259), 'jp': (390, 173, 476, 259), 'tw': (390, 173, 476, 259)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png', 'en': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png', 'jp': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png', 'tw': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_1.png'}) +FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2 = Button(area={'cn': (390, 287, 476, 373), 'en': (390, 287, 476, 373), 'jp': (390, 287, 476, 373), 'tw': (390, 287, 476, 373)}, color={'cn': (69, 59, 55), 'en': (69, 59, 55), 'jp': (69, 59, 55), 'tw': (69, 59, 55)}, button={'cn': (390, 287, 476, 373), 'en': (390, 287, 476, 373), 'jp': (390, 287, 476, 373), 'tw': (390, 287, 476, 373)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png', 'en': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png', 'jp': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png', 'tw': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP_HARD_2.png'}) +FLEET_DETAIL_ENTER_HARD_1 = Button(area={'cn': (705, 173, 791, 259), 'en': (705, 173, 791, 259), 'jp': (705, 173, 791, 259), 'tw': (705, 173, 791, 259)}, color={'cn': (63, 64, 62), 'en': (63, 64, 62), 'jp': (63, 64, 62), 'tw': (63, 64, 62)}, button={'cn': (705, 173, 791, 259), 'en': (705, 173, 791, 259), 'jp': (705, 173, 791, 259), 'tw': (705, 173, 791, 259)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_1.png', 'en': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_1.png', 'jp': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_1.png', 'tw': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_1.png'}) +FLEET_DETAIL_ENTER_HARD_2 = Button(area={'cn': (705, 287, 791, 373), 'en': (705, 287, 791, 373), 'jp': (705, 287, 791, 373), 'tw': (705, 287, 791, 373)}, color={'cn': (39, 44, 50), 'en': (39, 44, 50), 'jp': (39, 44, 50), 'tw': (39, 44, 50)}, button={'cn': (705, 287, 791, 373), 'en': (705, 287, 791, 373), 'jp': (705, 287, 791, 373), 'tw': (705, 287, 791, 373)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_2.png', 'en': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_2.png', 'jp': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_2.png', 'tw': './assets/cn/equipment/FLEET_DETAIL_ENTER_HARD_2.png'}) FLEET_ENTER = Button(area={'cn': (502, 474, 517, 489), 'en': (502, 474, 517, 489), 'jp': (502, 474, 517, 489), 'tw': (502, 474, 517, 489)}, color={'cn': (58, 62, 77), 'en': (58, 62, 77), 'jp': (58, 62, 77), 'tw': (58, 62, 77)}, button={'cn': (502, 474, 517, 489), 'en': (502, 474, 517, 489), 'jp': (502, 474, 517, 489), 'tw': (502, 474, 517, 489)}, file={'cn': './assets/cn/equipment/FLEET_ENTER.png', 'en': './assets/en/equipment/FLEET_ENTER.png', 'jp': './assets/jp/equipment/FLEET_ENTER.png', 'tw': './assets/tw/equipment/FLEET_ENTER.png'}) FLEET_ENTER_FLAGSHIP = Button(area={'cn': (577, 277, 605, 291), 'en': (577, 277, 605, 291), 'jp': (577, 277, 605, 291), 'tw': (577, 277, 605, 291)}, color={'cn': (132, 124, 128), 'en': (132, 124, 128), 'jp': (132, 124, 128), 'tw': (132, 124, 128)}, button={'cn': (577, 277, 605, 291), 'en': (577, 277, 605, 291), 'jp': (577, 277, 605, 291), 'tw': (577, 277, 605, 291)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP.png', 'en': './assets/en/equipment/FLEET_ENTER_FLAGSHIP.png', 'jp': './assets/jp/equipment/FLEET_ENTER_FLAGSHIP.png', 'tw': './assets/tw/equipment/FLEET_ENTER_FLAGSHIP.png'}) +FLEET_ENTER_FLAGSHIP_HARD_1 = Button(area={'cn': (593, 173, 681, 261), 'en': (593, 173, 681, 261), 'jp': (593, 173, 681, 261), 'tw': (593, 173, 681, 261)}, color={'cn': (55, 59, 60), 'en': (55, 59, 60), 'jp': (55, 59, 60), 'tw': (55, 59, 60)}, button={'cn': (593, 173, 681, 261), 'en': (593, 173, 681, 261), 'jp': (593, 173, 681, 261), 'tw': (593, 173, 681, 261)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png', 'en': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png', 'jp': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png', 'tw': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_1.png'}) +FLEET_ENTER_FLAGSHIP_HARD_2 = Button(area={'cn': (594, 287, 681, 374), 'en': (594, 287, 681, 374), 'jp': (594, 287, 681, 374), 'tw': (594, 287, 681, 374)}, color={'cn': (39, 45, 47), 'en': (39, 45, 47), 'jp': (39, 45, 47), 'tw': (39, 45, 47)}, button={'cn': (594, 287, 681, 374), 'en': (594, 287, 681, 374), 'jp': (594, 287, 681, 374), 'tw': (594, 287, 681, 374)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png', 'en': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png', 'jp': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png', 'tw': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP_HARD_2.png'}) +FLEET_ENTER_HARD_1 = Button(area={'cn': (909, 173, 996, 260), 'en': (909, 173, 996, 260), 'jp': (909, 173, 996, 260), 'tw': (909, 173, 996, 260)}, color={'cn': (43, 47, 52), 'en': (43, 47, 52), 'jp': (43, 47, 52), 'tw': (43, 47, 52)}, button={'cn': (909, 173, 996, 260), 'en': (909, 173, 996, 260), 'jp': (909, 173, 996, 260), 'tw': (909, 173, 996, 260)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_HARD_1.png', 'en': './assets/cn/equipment/FLEET_ENTER_HARD_1.png', 'jp': './assets/cn/equipment/FLEET_ENTER_HARD_1.png', 'tw': './assets/cn/equipment/FLEET_ENTER_HARD_1.png'}) +FLEET_ENTER_HARD_2 = Button(area={'cn': (909, 287, 996, 374), 'en': (909, 287, 996, 374), 'jp': (909, 287, 996, 374), 'tw': (909, 287, 996, 374)}, color={'cn': (38, 44, 49), 'en': (38, 44, 49), 'jp': (38, 44, 49), 'tw': (38, 44, 49)}, button={'cn': (909, 287, 996, 374), 'en': (909, 287, 996, 374), 'jp': (909, 287, 996, 374), 'tw': (909, 287, 996, 374)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_HARD_2.png', 'en': './assets/cn/equipment/FLEET_ENTER_HARD_2.png', 'jp': './assets/cn/equipment/FLEET_ENTER_HARD_2.png', 'tw': './assets/cn/equipment/FLEET_ENTER_HARD_2.png'}) FLEET_NEXT = Button(area={'cn': (1234, 327, 1254, 356), 'en': (1234, 327, 1254, 356), 'jp': (1234, 327, 1254, 356), 'tw': (1234, 327, 1254, 356)}, color={'cn': (72, 93, 125), 'en': (72, 93, 125), 'jp': (72, 93, 125), 'tw': (72, 93, 125)}, button={'cn': (1234, 327, 1254, 356), 'en': (1234, 327, 1254, 356), 'jp': (1234, 327, 1254, 356), 'tw': (1234, 327, 1254, 356)}, file={'cn': './assets/cn/equipment/FLEET_NEXT.png', 'en': './assets/en/equipment/FLEET_NEXT.png', 'jp': './assets/jp/equipment/FLEET_NEXT.png', 'tw': './assets/tw/equipment/FLEET_NEXT.png'}) FLEET_PREV = Button(area={'cn': (26, 327, 46, 356), 'en': (26, 327, 46, 356), 'jp': (26, 327, 46, 356), 'tw': (26, 327, 46, 356)}, color={'cn': (72, 93, 125), 'en': (72, 93, 125), 'jp': (72, 93, 125), 'tw': (72, 93, 125)}, button={'cn': (26, 327, 46, 356), 'en': (26, 327, 46, 356), 'jp': (26, 327, 46, 356), 'tw': (26, 327, 46, 356)}, file={'cn': './assets/cn/equipment/FLEET_PREV.png', 'en': './assets/en/equipment/FLEET_PREV.png', 'jp': './assets/jp/equipment/FLEET_PREV.png', 'tw': './assets/tw/equipment/FLEET_PREV.png'}) OCR_FLEET_INDEX = Button(area={'cn': (957, 113, 987, 163), 'en': (957, 113, 987, 163), 'jp': (957, 113, 987, 163), 'tw': (957, 113, 987, 163)}, color={'cn': (36, 54, 86), 'en': (36, 54, 86), 'jp': (36, 54, 86), 'tw': (36, 54, 86)}, button={'cn': (957, 113, 987, 163), 'en': (957, 113, 987, 163), 'jp': (957, 113, 987, 163), 'tw': (957, 113, 987, 163)}, file={'cn': './assets/cn/equipment/OCR_FLEET_INDEX.png', 'en': './assets/en/equipment/OCR_FLEET_INDEX.png', 'jp': './assets/jp/equipment/OCR_FLEET_INDEX.png', 'tw': './assets/tw/equipment/OCR_FLEET_INDEX.png'}) diff --git a/module/retire/assets.py b/module/retire/assets.py index cbdb30b3c9..a6dbc48f25 100644 --- a/module/retire/assets.py +++ b/module/retire/assets.py @@ -13,6 +13,7 @@ DOCK_FILTER_CONFIRM = Button(area={'cn': (714, 613, 886, 671), 'en': (718, 618, 883, 666), 'jp': (717, 618, 885, 668), 'tw': (715, 630, 884, 680)}, color={'cn': (86, 133, 192), 'en': (108, 148, 201), 'jp': (83, 128, 188), 'tw': (83, 130, 190)}, button={'cn': (714, 613, 886, 671), 'en': (718, 618, 883, 666), 'jp': (717, 618, 885, 668), 'tw': (715, 630, 884, 680)}, file={'cn': './assets/cn/retire/DOCK_FILTER_CONFIRM.png', 'en': './assets/en/retire/DOCK_FILTER_CONFIRM.png', 'jp': './assets/jp/retire/DOCK_FILTER_CONFIRM.png', 'tw': './assets/tw/retire/DOCK_FILTER_CONFIRM.png'}) DOCK_SCROLL = Button(area={'cn': (1239, 76, 1248, 641), 'en': (1239, 76, 1248, 641), 'jp': (1237, 78, 1250, 628), 'tw': (1239, 76, 1248, 641)}, color={'cn': (47, 46, 37), 'en': (47, 46, 37), 'jp': (180, 156, 66), 'tw': (47, 46, 37)}, button={'cn': (1239, 76, 1248, 641), 'en': (1239, 76, 1248, 641), 'jp': (1237, 78, 1250, 628), 'tw': (1239, 76, 1248, 641)}, file={'cn': './assets/cn/retire/DOCK_SCROLL.png', 'en': './assets/en/retire/DOCK_SCROLL.png', 'jp': './assets/jp/retire/DOCK_SCROLL.png', 'tw': './assets/tw/retire/DOCK_SCROLL.png'}) DOCK_SELECTED = Button(area={'cn': (582, 662, 647, 685), 'en': (702, 660, 751, 686), 'jp': (603, 662, 655, 685), 'tw': (582, 662, 647, 685)}, color={'cn': (75, 75, 83), 'en': (84, 85, 93), 'jp': (84, 83, 92), 'tw': (75, 75, 83)}, button={'cn': (582, 662, 647, 685), 'en': (702, 660, 751, 686), 'jp': (603, 662, 655, 685), 'tw': (582, 662, 647, 685)}, file={'cn': './assets/cn/retire/DOCK_SELECTED.png', 'en': './assets/en/retire/DOCK_SELECTED.png', 'jp': './assets/jp/retire/DOCK_SELECTED.png', 'tw': './assets/tw/retire/DOCK_SELECTED.png'}) +DOCK_SHIP_DOWN = Button(area={'cn': (164, 152, 195, 204), 'en': (164, 152, 195, 204), 'jp': (164, 152, 195, 204), 'tw': (164, 152, 195, 204)}, color={'cn': (106, 107, 108), 'en': (106, 107, 108), 'jp': (106, 107, 108), 'tw': (106, 107, 108)}, button={'cn': (90, 74, 223, 269), 'en': (90, 74, 223, 269), 'jp': (90, 74, 223, 269), 'tw': (90, 74, 223, 269)}, file={'cn': './assets/cn/retire/DOCK_SHIP_DOWN.png', 'en': './assets/cn/retire/DOCK_SHIP_DOWN.png', 'jp': './assets/cn/retire/DOCK_SHIP_DOWN.png', 'tw': './assets/cn/retire/DOCK_SHIP_DOWN.png'}) EMPTY_ENHANCE_SLOT_PLUS = Button(area={'cn': (737, 402, 773, 437), 'en': (737, 402, 773, 437), 'jp': (737, 402, 773, 437), 'tw': (737, 402, 773, 437)}, color={'cn': (46, 46, 46), 'en': (46, 46, 46), 'jp': (46, 46, 46), 'tw': (46, 46, 46)}, button={'cn': (737, 402, 773, 437), 'en': (737, 402, 773, 437), 'jp': (737, 402, 773, 437), 'tw': (737, 402, 773, 437)}, file={'cn': './assets/cn/retire/EMPTY_ENHANCE_SLOT_PLUS.png', 'en': './assets/en/retire/EMPTY_ENHANCE_SLOT_PLUS.png', 'jp': './assets/jp/retire/EMPTY_ENHANCE_SLOT_PLUS.png', 'tw': './assets/tw/retire/EMPTY_ENHANCE_SLOT_PLUS.png'}) ENHANCE_CONFIRM = Button(area={'cn': (1126, 602, 1256, 645), 'en': (1130, 603, 1255, 643), 'jp': (1126, 601, 1257, 646), 'tw': (1126, 602, 1257, 644)}, color={'cn': (203, 149, 81), 'en': (204, 148, 82), 'jp': (189, 139, 78), 'tw': (198, 145, 82)}, button={'cn': (1126, 602, 1256, 645), 'en': (1130, 603, 1255, 643), 'jp': (1126, 601, 1257, 646), 'tw': (1126, 602, 1257, 644)}, file={'cn': './assets/cn/retire/ENHANCE_CONFIRM.png', 'en': './assets/en/retire/ENHANCE_CONFIRM.png', 'jp': './assets/jp/retire/ENHANCE_CONFIRM.png', 'tw': './assets/tw/retire/ENHANCE_CONFIRM.png'}) ENHANCE_FILLED = Button(area={'cn': (728, 440, 781, 454), 'en': (728, 440, 781, 454), 'jp': (722, 387, 789, 400), 'tw': (728, 440, 781, 454)}, color={'cn': (156, 138, 127), 'en': (156, 138, 127), 'jp': (146, 153, 211), 'tw': (156, 138, 127)}, button={'cn': (728, 440, 781, 454), 'en': (728, 440, 781, 454), 'jp': (722, 387, 789, 400), 'tw': (728, 440, 781, 454)}, file={'cn': './assets/cn/retire/ENHANCE_FILLED.png', 'en': './assets/en/retire/ENHANCE_FILLED.png', 'jp': './assets/jp/retire/ENHANCE_FILLED.png', 'tw': './assets/tw/retire/ENHANCE_FILLED.png'})