From 1f38e92e020c9460061d33ae2427d6c80a6189bc Mon Sep 17 00:00:00 2001 From: SarContDeli <48789988+SaiCateDoan@users.noreply.github.com> Date: Fri, 11 Nov 2022 14:27:15 +0800 Subject: [PATCH] Add: hazard 1 leveling --- alas.py | 4 + .../cn/os_handler/ACTION_POINT_REMAIN_OS.png | Bin 0 -> 6454 bytes .../STRATEGY_SEARCH_MAP_OPTION_OFF.png | Bin 0 -> 9687 bytes .../STRATEGY_SEARCH_POPUP_CHECK.png | Bin 0 -> 11973 bytes ...STRATEGY_SEARCH_SAFE_OPTION_OFF.BUTTON.png | Bin 0 -> 9120 bytes .../STRATEGY_SEARCH_SAFE_OPTION_OFF.png | Bin 0 -> 8756 bytes .../STRATEGY_SEARCH_SAFE_OPTION_ON.png | Bin 0 -> 8678 bytes .../STRATEGY_SEARCH_SCROLL_AREA.png | Bin 0 -> 6149 bytes .../STRATEGY_SEARCH_WAIT_2_CHECK.png | Bin 0 -> 7794 bytes .../os_handler/STRATEGY_SEARCH_WAIT_OFF.png | Bin 0 -> 5916 bytes .../cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png | Bin 0 -> 5906 bytes .../STRATEGY_SEARCH_ZONE_MODE_OFF.png | Bin 0 -> 5896 bytes .../STRATEGY_SEARCH_ZONE_MODE_ON.png | Bin 0 -> 5906 bytes config/template.json | 22 +++- module/campaign/os_run.py | 20 ++++ module/config/argument/args.json | 77 ++++++++++++- module/config/argument/argument.yaml | 7 +- module/config/argument/menu.json | 3 +- module/config/argument/override.yaml | 9 +- module/config/argument/task.yaml | 4 + module/config/config_generated.py | 6 +- module/config/config_manual.py | 1 + module/config/i18n/en-US.json | 23 +++- module/config/i18n/ja-JP.json | 22 +++- module/config/i18n/zh-CN.json | 23 +++- module/config/i18n/zh-TW.json | 25 +++- module/os/map.py | 107 ++++++++++++++---- module/os/operation_siren.py | 91 +++++++++++++-- module/os_handler/action_point.py | 72 ++++++++++-- module/os_handler/assets.py | 11 ++ module/os_handler/map_event.py | 88 +++++++++++++- 31 files changed, 553 insertions(+), 62 deletions(-) create mode 100644 assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_MAP_OPTION_OFF.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_POPUP_CHECK.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.BUTTON.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_WAIT_2_CHECK.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_OFF.png create mode 100644 assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png diff --git a/alas.py b/alas.py index 13d70a294..d3427a2f1 100644 --- a/alas.py +++ b/alas.py @@ -308,6 +308,10 @@ class AzurLaneAutoScript: from module.campaign.os_run import OSCampaignRun OSCampaignRun(config=self.config, device=self.device).opsi_meowfficer_farming() + def opsi_hazard1_leveling(self): + from module.campaign.os_run import OSCampaignRun + OSCampaignRun(config=self.config, device=self.device).opsi_hazard1_leveling() + def main(self): from module.campaign.run import CampaignRun CampaignRun(config=self.config, device=self.device).run( diff --git a/assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png b/assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png new file mode 100644 index 0000000000000000000000000000000000000000..9df6717c53627cc57aaacbe62d429d39eb8b67d6 GIT binary patch literal 6454 zcmeI!_cs;p9{})2Wbce*WRq}h+1zW-?7g{{#HExKk!%sNT}1Y#ls&UuA!KKV@HH

*I}Ygg35(;$2Og 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 literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.BUTTON.png b/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.BUTTON.png new file mode 100644 index 0000000000000000000000000000000000000000..ea41502879372174539fa9ee1097ef7f7b625710 GIT binary patch literal 9120 zcmeHtc{G&o-~X)zMfjAWWUcH=_N)^svSyhW`x27I5ZMi~Rg`?lHik;bGLm5!j5Q=N zAtMHpY%wvJ!C0D^XZrsB_&w+OizOMV6`?}9{y{^~$^?tq2xgXuIHa&Lq z%uxUUj$JpqVg~?+*~0^$xeu_r%i`u7?Cwag86*?{cuxGeIDo<;VE{O46JTO;U0(o*oI=|BJJ_$BGN8|H8e2R}$gzOgo#d9VGfqzs%#xOu zJR)HJQ1a#EN!zY}u3kMP^5Mn9gHN9(WSq2BRG z+XF8S0iJ_C-t)i>CBRcAerXIyK<*U8Z~!hjk|#M{WC0Q>u`ZtDRx_?wTf0!|kJ zK|hQ4I>1*Y;No>hKQo}N3FsUa;Hd|=d4Y?z4^!lTLotBohjZs5f#d=}@EX-oe?y^G zU|F7xR6)Hy_Poy3L>F$Q5H3eYWii>|>p}{GT3!dd3NI^nM-`k_OVr^1M*9Q+FS1Uu zcS~bL4)fIx4{JTe@Odb$c5t$!yuIg{i}>o`%K$JJ1|MN6s-Vv#=y4`MnXfLaAG+<% z^Wr`|-LIbiawG6!Wy+Bj{0Ez>FP~v2Cl?nMzM8)`cJcb?7{~PQ_ULqE+}(xi|E6z! zYyW;eQOzyU^w7???oXSRWoPmK9!d6|UdlB6-NeKCEjlLk{<=5TNnUW?_ISwCD}@;} zwKAzk#{bIoUKnNF`c6{ZKWIqO1nTY>a>QgQy>at7xNRXL;1t&RoeluhR#?{;S?+@g zx0B}Z5iAObVfx|%kl=Uy-w*(Bzj9vL;UgN<&kX=qUL?xb8HsFm2`hGTp6xn3-Np0U zQ!Cl{{QGWW0pp{$63*W9l&g7QESox1Co1o$^5wFqMyKuV)a+nBp< zmuy?&kwZowxKDUVPCexCe(ZGaDYsBT%8q20*`ed<=OqRn3ff9pWNDhI+C6rV0Go+Y z4elM#Npro{lBM?nPQ!UIq^#bwvUc(uK z46T>TpQ~^4Ph}dK^k3}!ARumlTg=`wYI5s^P8fJ5zVF=3wiiEg$^5 zh(pH{uXY~MIuv0n;U#8d=49z){nhM^#M$#2|4bdxK5{VGwp&Ij`;A3|bjv@x?}fe9 zRMVWy6weWkXP!_IhzkBU4dVKWSXpr5x6~#(~hS`~O*#lFz z0_(YSaug*LKBO!l7kU=d7ep2$sV+y6-j_pO@7RBrwflI-{Pd#0qQ)YpZ@!ulxU|r2 z=FLloe>5|ljZrT#c5iLd-ki|5U#K&bbn3cA8S2&Zu`{=YZqoza{s?RNXXd$>b>3&k z(ZLndA9+6xZbtAPOFfy?|IlCdG(wn5*#C5d@Y{UL^3!AKr~4f)YO9j-mkam{U|=VC zjC}0LtdB>Zn?IL+E+VhuP+3)8HCx34rhx|?GArHf<7%&g)$Qjik9^6k23H|(knKh6 z{VVm}q*eL9fjNL)!y$}EoRA*N9vhR_wlCg!%(wMP@c5iYM=DAN9;;5hpQ!m>`rXiE zY`A=DK0~xM-Jq)SrH+ZZxw<3Tj+WyG;+oG7*(nOMKC&!Zkw=3+o)x6XeU}p{*RaH@ z`nm>I<>uu&Rhw1YR-2M>TD5Bx$a37(R>*!LpHaWLjH`^Pf9CLEk#|^F zzgIH^rZ1|}Pu#FIaqGEkQs(vCD{n423p=7;I)3fRHU5l%KG*s4^UywMU#T>ww4}6! z)vDEcp`8`BT&`TtQqQt~=+n@vAwq#B!a#LGZ5gqQm_U%4Je?z*6)|rx&A!*`7o5u> z>zKBn6lWbsnG@LA4SfxTL|q`XqFO8dslZxiTUQqo{Cny)Fawy%rqgwcUpa}j7$_#r z%imkbzp1yjXFVI29oG`~gkivSENzmnTGUw-9@=nEQ1_sspp>uJ*^pEOG3iXrNupL;%-e6w8~0r8YPzZgiWf!mnaB>FclpHuNs$#O(Z z)HRhwRMEXCLWbLh_e$ms=k>K`)n*|cpR_xhJ~R#5^uUTeQb;E8=UBH`(X0`mBH;pu z|G`IzMu{#5_IILVB|Dyibcw#(^^6pdKuCp(JmA`1uSaNng$%&KeHj zOSu96LHNw&wd9rF1Lu`VNlS4|1w9RZ=yYa8HBU2QWZEQ@bY<^K?v+`Dzp9PSTP1T% zdBZB@JNi@FEgCJLK4m}1r*S8w)AhR+XLXe2Yqf&zwv&FZ(bB#nzw^w;2<5AMa0`xl zIo!ROQgNzM`M9EP?q$n|)|YaA841Y0IhApNdLrV&)1y({qTT*dDkEAW55JnY%8OZ3 z&E&13|NWWOrWtj^av!Ao^L&VTjUEjB)u72WQy{d9HeYUq`==p+_Hea;u9K zhSolzKN6p57g0)BYsb5f&;5%jOSN!R5_MX_)!fmk*AIyz9-TjVSRwT$XN`XIV~jj> z+@^ZXF|QVmla96uOmy%1_@JwiBaqAkKDw9^N1mQobF*<$fsh)#_EM1|h9@6At`#H- z<(-WGDmxvyD3S*I*ikT@(@tG^x0J^hbZl~};TY*=!`jyN zRiaAXkSwt^31fmS?a*&-^Q{;d9?}Cjymr`h*mKZYADwCRn%D^%Sr>_E+t&CwPIPIb zGYkjXiC_+})wtid@Ba0DG#ym?sA^>=cOUA8vWAAN^&cEP$lyB1hnc{B85bQjaIniH zD3DG0`o-IsNJ@m#F|A|ZCq;eV&jnwJT3DeUA<@N-=}v`b#MI1jjfsbg`irXEF)pMQ zUPIUy?z?!qwAg$y93iaEM*lV?it`s~=tH8+X$}JcQ!5X~vi+&}4CHfU99(&K+LQPS z6SM3yOuEAlqqGQw&5d4Vr7!EX=?%M5o5QH}#KjYi&5ng{bv>Y~VXOMg>@l1E)}q$J zTC8gzc0C%`7~@A@5h>Olp4r4jZJc5e#*1|fW^lA<7`>OiMLIPDzbC^O9&DYAkXc8y z*|d3VUS2brG?_^o2e~k(zfz{-?{r4Ipp8tM(m7L-@XV~OOn#HYnFX1HsmD^u#g`0q zbiRY`F;;$8nBZ^WrHh4_ub6|iLZ?*VJLBYu;gS52mwD8@><(yb8Dq7ReEKc1ue(pI zeIQa@)qV5k{#sYWbc86Sl*Dhd5GxTc%euY$Zp;32#eVkb>}=MdgZZ@IKI%$Dw%?TS zF|)G*fanVVkdOobyDWCU0s!|f0>G*#0O;lefDr6okKStlAUt^eijhO))Xy1G`dP*qr_yc6(+mR-je}3{#aA?a4J^Abwo@`Qw)eg2Q)`IQE1kDnn zxa;T6;Ej1vTt+sR^HvTQ$R%DezhYA5#nsX|v@N-krk|l?K{cy>j$=y38N$@Z+}z@# zQ&(UUmG+YCrT%Sy5%`P1|BgT>|JRb!2Y{XRwKm#%`ZRQFCl3j$=a~UbX1g#Y(%SZ= z_S^PurtV=qZWK$0)0srlY0hs5vhbfNWnf*U#P1RLHiM3LKXgpez*Qs|tGvtzXg>*3 zJp}wZ7?lm<1}*~!6ZQ@R?Q-@nI44Kqvbqk-#o=|Nn^nK>+B?ywWcK0HEM^C+guU$(InCD(zW~ zL9^n?;HpgbTjx|$@1pWE7)c9aNR}4WEdMtjci9&G~^M$B{8{4uIw6+g#Kx1s}f_u6zWWhhZ zV&(<$Q4-vJA*wYWFBGszAT(C%K?t;a2Y;{RA2OEwOoC%# zq8y4<+O@!!z!9q(Lj&ro5%ksPMxgy)+A&dYn_{8_?aq*Nxovc&3Qy5Cn70VSrY=Mx z465A^Wk}?}a+2U$)3WhfB}`f+{SI+=fzZ$r8fnfOVeCro?I(r%Lf-C=33z89oxos~ z^dzHMmvkt(=?^)8w+USZu`z*qHFlxD7b-F1INch%;^oZ7MdwfZIDzgJj_D(dyWSCW z^N{d5`U>+_{J;FvK)uo#kM&exnf)<)o6lC&7ZF3m@G1SOG!MVGThS0L7;&2>Q{5aJ$Cw&N3fnvy6>eP=>1{+JyClR(!kIAZsqk6l(JkCY zW5-k!Jx?#GrYXXQ+He(R=X{e+-h(6gsUseD)9QY2na-~UF}@((%XafjVLm_mthHmY zf;XMY{0Of#;-wONer^+t#~Pr8X##dfheF8XTx`mBD)>B~n#Z)*gE9uz(s#EBOSf2_ zEJD|Wf_9BH9|mp)shHk7DMeXkEj9*$$74#K zmNdgu2D{}2ufB`$nU2M_+&3Q}^RvS-!O>W+M10yXHtbCBEdH7cA_;B?TKoAG<0dw3 zSVNh}lnx1j*U`4$C{7T=;SBAV@wL_SRvj6ieD5#UxqUK)L19p+(DLH}CNnZ#4KZZG zJ?X3s(le7Qx{J>1-I_>WYOc&Iq?6+40j)D<@qOCT9-F&&u&(98KF(zVcFw6exwuBB zpd5Y}2o&Vs5jcf0m@L5{my`4dqitN&&Hx;|K-=Bb(#bS&%8<~C*HG?Tq23g#XY>v5 zxZI)+B5r46mb%axAS0L*yGhs%zVwL;=SQ$CA8WAOos?otiTcQVp(7Oarp1EXTU+eg z+%sU->Zp-n7 z#C3#o3;*GvN{1pD%0EbbLLF(6ziN96aw&7Pp;bv zmNsF!U0m?dAHbKI?aT0a2odrcWoaxx6BH!F3TkXaz8uM>fx+#)NrTc2gfqd#}F}*`~)1^rCE?Z4Zw<6>Bej((P z5M1bTs5I-MRY^sIbGcyoSQ2E6moolx3~GZR9lgB9&z)D1~V|YX{~KyFtx|aDJ3U&#`*`!cg8v+FeJLdT%qGIa6lM{Jlv4JyR+1_ z86G!U%=RlfiZ(aKaUzp7hP1n~YR z*i6j5v;zImOXqoLU4+=I?I1Q&lhV?zaWQ7M33X872D57u-D8ibk8W=4Hwio4E&m#< zYjDGH?ol?(ha1-@JP{ogf1^l&s%Rm%7$v4F8E$O;((Sdo3K=;-g|kyguCI*ad3a$B zi5L~r>ZUlz(>riZ8Dulqpg1U%df@1 zR>Tb54PB~#PhbWYm?XnNPFKqlF8pqa5q26yjne^2b>+1eh-SF-gq(QEz zRx>%J3GI({M^*dE3(CM|a%EuIVWDwcbbY)hQ#}FT1l+F%sKWfLW+^xpC4!7Xty+U; zP-r-eK6<;|X`PX|F>pVwr0_H3EUwYuEPT9WrZFGo+oS!l>zoW{MQ?0uD0K@MCbals z-35~vBr&!O7|kYw-%uvl8VW63X4ELAuLilz=$zdoZsXIS2)^n&;rj8f;M&>*nmW$U zkhDLvLt&D+JPd-Im4%=gl1g^wl`U@Lrc0oMY)ca}&%G9IHX&EJ7_ErW!9oFlo% z*I{jkpAvhB;EWmf+!TRA%rQv~(;;^5LRyrrc|l0kt*U;3GY#f4GMlLa-W4uI;u#nW z%}7k|o#CDG4%BKX#90a5=pJIIk}mZ}d^Jt2FsGLLX-UM~jsxt|{-vfJ%qsfHWfu2Chu=`twp01!<8vHuw2RHoYAGayF#=cqK#NcoYc!|y{%GY+t%*VZG~|w z^>&@8?b3eX$5JYsyE59+=A8Vcjv5 zpHE@dRWbK>uWih>wnh=E*S}=17{xU`eb*WqP<_c|Axdn*+bLx`Qp+P{Egi8t*`^aT zAGmQI;q$W??ydeOu-%J~=XQDUk63@GpIy3!jSE3H5s=KD%@g)IBXY@D+|lf(t-vY<1-flaxV^CEgOfu3(*CM_jbG0;@spg& z8fqwn`N`K+tA1MPs!wO#+2>-O9>sW32^%Wpvf2p{X2j}|m&cL1WI91baD1&wae`(f zoxs6%v~34YPwNzz?BDSZmbn#(`+nEGNQ7HC?teXtkA~b7?EN)# zFSOa+wHbqbXV`u}I5==hIoCrY6vW1HLff^?{k?eZD)Oy#q zRXux5#pGwFXaix+>`eDaY<|0UDE1kJVq>@)HmW=&U>v8>%G{V8sB)Bfd-wi+9dwyi z4xNf}Zon};>C`uoaTk$dXDzE0^h&8)^=&uk^@`!K+y~eq^zCH8w_g{NO5D0v7Jn{S z%i@Jv9p5f2bK<@tD|~65T3AigI$@|Lh{*O5Zi)y%&5ek(AU(=pIE$5rQw~a-nMp<#!wA( z*@{@+>oal6{QucWyNRt$w3-WRK~UU-y3;oCjhDS?U}K;w9syEPRRo z-X{Olz#cyS{n{9HV8=CO6P2;59?xdfn)mK2e8}$mZDMb|TQlFqKk~_J=7hgWPUhqpsgP6&0aD1d3Td4MEDPszkCMRYIfmIHKCF|&cpJtDK`oI_%=JD z=07TY?Tphp^VxmemCmMa!Q1R2?$4B?A!--@MCgB>{zrwEKuNk^_ur~K_Dg@;Uj+Ul p@E3u<2>eCh{}O?3wyb!dD&*Cp&+(z`-)sQj`c>;IwZ@(g{tM5VEGqy2 literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png b/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b7c36490aa43841324a0acc704e3ab4fdb6c04 GIT binary patch literal 8756 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 JOzXk3{{bbpNcR8$ literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png b/assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png new file mode 100644 index 0000000000000000000000000000000000000000..c754753683d649f970a4c4284a3a4424f70597ab GIT binary patch literal 8678 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 literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png b/assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png new file mode 100644 index 0000000000000000000000000000000000000000..adf935a00183b944f06f34d1d28cdc9b8940497c GIT binary patch literal 6149 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 Y0rT_zA9rEJI{#(XRMmr4C|ke$AIIb^>Hq)$ literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png b/assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcdef5a8039168ffaf55b84d8d2b705d599f805 GIT binary patch literal 5916 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 literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png b/assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png new file mode 100644 index 0000000000000000000000000000000000000000..ae87d7e47da33cd262e552ed02dd5077d783d53c GIT binary patch literal 5906 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 IV9w9}2U0i^{Qv*} literal 0 HcmV?d00001 diff --git a/assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png b/assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png new file mode 100644 index 0000000000000000000000000000000000000000..c2516b843210e05b60721bc041ea9d3155a1cace GIT binary patch literal 5906 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 TOFO>rZ({~JrrH%Sr^o*V7$*_k literal 0 HcmV?d00001 diff --git a/config/template.json b/config/template.json index 92713fd40..bbf18fbe5 100644 --- a/config/template.json +++ b/config/template.json @@ -1550,7 +1550,7 @@ "Command": "OpsiAbyssal", "SuccessInterval": 60, "FailureInterval": 60, - "ServerUpdate": "00:00" + "ServerUpdate": "00:00, 12:00" }, "OpsiAbyssal": { "ForceRun": false @@ -1585,7 +1585,7 @@ "ServerUpdate": "00:00" }, "OpsiMeowfficerFarming": { - "ActionPointPreserve": 500, + "ActionPointPreserve": 1000, "HazardLevel": 5, "TargetZone": 0 }, @@ -1594,6 +1594,24 @@ "Submarine": false } }, + "OpsiHazard1Leveling": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "OpsiHazard1Leveling", + "SuccessInterval": 30, + "FailureInterval": 60, + "ServerUpdate": "00:00" + }, + "OpsiHazard1Leveling": { + "StrategySearch": true, + "TargetZone": 0 + }, + "OpsiFleet": { + "Fleet": 1, + "Submarine": false + } + }, "Daemon": { "Daemon": { "EnterMap": true diff --git a/module/campaign/os_run.py b/module/campaign/os_run.py index 6abd10264..25bf4ce8d 100644 --- a/module/campaign/os_run.py +++ b/module/campaign/os_run.py @@ -54,6 +54,26 @@ class OSCampaignRun(OSMapOperation): logger.info('Just less than 1 day to OpSi reset, delay 2.5 hours') self.config.task_delay(minute=150, server_update=True) + def opsi_hazard1_leveling(self): + self.config.override( + OpsiGeneral_AkashiShopFilter='ActionPoint' + ) + self.config.cross_set(keys='OpsiMeowfficerFarming.Scheduler.Enable', value=True) + if self.config.cross_get( + keys='OpsiMeowfficerFarming.OpsiMeowfficerFarming.ActionPointPreserve', + default=0 + ) < 1000: + self.config.cross_set( + keys='OpsiMeowfficerFarming.OpsiMeowfficerFarming.ActionPointPreserve', + value=1000 + ) + + self.load_campaign() + try: + self.campaign.os_hazard1_leveling() + except ActionPointLimit: + self.config.task_delay(server_update=True) + def opsi_obscure(self): self.load_campaign() try: diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 4dd0eabd8..e6cf72450 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3281,10 +3281,10 @@ "event_20200227_cn" ], "display": "disabled", - "cn": "event_20201229_cn", - "en": "event_20201229_cn", - "jp": "event_20201229_cn", - "tw": "event_20211111_cn" + "tw": "event_20211111_cn", + "cn": "event_20220915_cn", + "en": "event_20220915_cn", + "jp": "event_20220915_cn" }, "Mode": { "type": "select", @@ -7772,7 +7772,7 @@ }, "ServerUpdate": { "type": "input", - "value": "00:00", + "value": "00:00, 12:00", "display": "hide" } }, @@ -7869,7 +7869,7 @@ "OpsiMeowfficerFarming": { "ActionPointPreserve": { "type": "input", - "value": 500 + "value": 1000 }, "HazardLevel": { "type": "select", @@ -7904,6 +7904,71 @@ } } }, + "OpsiHazard1Leveling": { + "Scheduler": { + "Enable": { + "type": "checkbox", + "value": false + }, + "NextRun": { + "type": "datetime", + "value": "2020-01-01 00:00:00", + "validate": "datetime" + }, + "Command": { + "type": "input", + "value": "OpsiHazard1Leveling", + "display": "hide" + }, + "SuccessInterval": { + "type": "input", + "value": 30, + "display": "hide" + }, + "FailureInterval": { + "type": "input", + "value": 60, + "display": "hide" + }, + "ServerUpdate": { + "type": "input", + "value": "00:00", + "display": "hide" + } + }, + "OpsiHazard1Leveling": { + "StrategySearch": { + "type": "checkbox", + "value": true + }, + "TargetZone": { + "type": "select", + "value": 0, + "option": [ + 0, + 44, + 22 + ] + } + }, + "OpsiFleet": { + "Fleet": { + "type": "select", + "value": 1, + "option": [ + 1, + 2, + 3, + 4 + ] + }, + "Submarine": { + "type": "checkbox", + "value": false, + "display": "hide" + } + } + }, "Daemon": { "Daemon": { "EnterMap": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 50303f060..8a3fdf59e 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -569,12 +569,17 @@ OpsiAbyssal: OpsiStronghold: ForceRun: false OpsiMeowfficerFarming: - ActionPointPreserve: 500 + ActionPointPreserve: 1000 HazardLevel: value: 5 option: [3, 4, 5, 6, 10] TargetZone: value: 0 +OpsiHazard1Leveling: + StrategySearch: True + TargetZone: + value: 0 + option: [0, 44, 22] # ==================== Tools ==================== diff --git a/module/config/argument/menu.json b/module/config/argument/menu.json index 07c3a4201..8f0ed9a13 100644 --- a/module/config/argument/menu.json +++ b/module/config/argument/menu.json @@ -57,7 +57,8 @@ "OpsiObscure", "OpsiAbyssal", "OpsiStronghold", - "OpsiMeowfficerFarming" + "OpsiMeowfficerFarming", + "OpsiHazard1Leveling" ], "Tool": [ "Daemon", diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index b45557430..bc9934d06 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -350,7 +350,7 @@ OpsiAbyssal: Scheduler: SuccessInterval: 60 FailureInterval: 60 - ServerUpdate: 00:00 + ServerUpdate: 00:00, 12:00 OpsiStronghold: Scheduler: SuccessInterval: 60 @@ -361,3 +361,10 @@ OpsiMeowfficerFarming: SuccessInterval: 30 FailureInterval: 30 ServerUpdate: 00:00 +OpsiHazard1Leveling: + Scheduler: + SuccessInterval: 30 + FailureInterval: 60 + ServerUpdate: 00:00 + OpsiFleet: + Submarine: false diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 54ba6b22a..4befb40d6 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -263,6 +263,10 @@ OpsiMeowfficerFarming: - Scheduler - OpsiMeowfficerFarming - OpsiFleet +OpsiHazard1Leveling: + - Scheduler + - OpsiHazard1Leveling + - OpsiFleet # ==================== Tool ==================== diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 5620b1055..6ef91cfc6 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -379,10 +379,14 @@ class GeneratedConfig: OpsiStronghold_ForceRun = False # Group `OpsiMeowfficerFarming` - OpsiMeowfficerFarming_ActionPointPreserve = 500 + OpsiMeowfficerFarming_ActionPointPreserve = 1000 OpsiMeowfficerFarming_HazardLevel = 5 # 3, 4, 5, 6, 10 OpsiMeowfficerFarming_TargetZone = 0 + # Group `OpsiHazard1Leveling` + OpsiHazard1Leveling_StrategySearch = True + OpsiHazard1Leveling_TargetZone = 0 # 0, 44, 22 + # Group `Daemon` Daemon_EnterMap = True diff --git a/module/config/config_manual.py b/module/config/config_manual.py index d1db85ac6..161569574 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -24,6 +24,7 @@ class ManualConfig: > Event > Event2 > Raid > Main > Main2 > Main3 > OpsiMeowfficerFarming > GemsFarming + > OpsiHazard1Leveling """ """ diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index d2dbe0ee1..0bed69c7a 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -218,6 +218,10 @@ "name": "Meowfficer Farming", "help": "" }, + "OpsiHazard1Leveling": { + "name": "CL1 Leveling", + "help": "" + }, "Daemon": { "name": "Normal Semi-auto", "help": "" @@ -2098,7 +2102,7 @@ }, "ActionPointPreserve": { "name": "Keep X Amount of AP", - "help": "Stops task if total AP (including AP boxes in inventory) is below this number, 500 is recommended\nThis value will be auto reduced to 300 at 3 days before OpSi reset and to 0 at day before reset" + "help": "Stops task if total AP (including AP boxes in inventory) is below this number, 1000 is recommended\nThis value will be auto reduced to 300 at 3 days before OpSi reset, or 500 if CL1 leveling enabled, and to 0 at day before reset" }, "HazardLevel": { "name": "Target Zone Hazard Level", @@ -2114,6 +2118,23 @@ "help": "Supports either Zone ID or Name in CN/EN/JP/TW, i.e. \"51\", \"NA Ocean SE Sector E\"\nIf specified, Alas will loop on this same zone after each clear\nUse default value 0 or clear the field to remove the specification\nZone information can be acquired from <./module/os/map_data.py>" } }, + "OpsiHazard1Leveling": { + "_info": { + "name": "CL1 leveling", + "help": "OpsiHazard1Leveling._info.help" + }, + "StrategySearch": { + "name": "Strategic Search", + "help": "" + }, + "TargetZone": { + "name": "Target Zone ID", + "help": "Only attack target zone, which can be used to obtain world achievement stars or avoid the event that the map cannot be refreshed due to game bug", + "0": "No Specification", + "44": "44 | West Continental Shelf D", + "22": "22 | NA Ocean SW Sector B" + } + }, "Daemon": { "_info": { "name": "Semi-auto Clicking", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 2c918a499..a1b381097 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -218,6 +218,10 @@ "name": "Task.OpsiMeowfficerFarming.name", "help": "Task.OpsiMeowfficerFarming.help" }, + "OpsiHazard1Leveling": { + "name": "Task.OpsiHazard1Leveling.name", + "help": "Task.OpsiHazard1Leveling.help" + }, "Daemon": { "name": "Task.Daemon.name", "help": "Task.Daemon.help" @@ -585,7 +589,6 @@ "name": "Campaign.Event.name", "help": "Campaign.Event.help", "campaign_main": "campaign_main", - "event_20201229_cn": "虚畳なりし限象(復刻)", "event_20211111_cn": "燈火のシニエ", "raid_20221027": "戦え!ロイヤルメイド隊3rd", "event_20210121_cn": "悲歎せし焔海の詩(復刻)", @@ -2114,6 +2117,23 @@ "help": "OpsiMeowfficerFarming.TargetZone.help" } }, + "OpsiHazard1Leveling": { + "_info": { + "name": "OpsiHazard1Leveling._info.name", + "help": "OpsiHazard1Leveling._info.help" + }, + "StrategySearch": { + "name": "OpsiHazard1Leveling.StrategySearch.name", + "help": "OpsiHazard1Leveling.StrategySearch.help" + }, + "TargetZone": { + "name": "OpsiHazard1Leveling.TargetZone.name", + "help": "OpsiHazard1Leveling.TargetZone.help", + "0": "0", + "44": "44", + "22": "22" + } + }, "Daemon": { "_info": { "name": "Daemon._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index c9d63444a..eb98de334 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -218,6 +218,10 @@ "name": "短猫相接", "help": "" }, + "OpsiHazard1Leveling": { + "name": "侵蚀1练级", + "help": "" + }, "Daemon": { "name": "半自动点击", "help": "" @@ -2098,7 +2102,7 @@ }, "ActionPointPreserve": { "name": "保留 X 点行动力", - "help": "行动力低于 X 后停止,自动打开行动力箱子,X 包含箱子中的行动力,建议保留 500 点行动力\n这个值将在大世界重置前3天自动减少至300点,并在最后一天自动减少至0点" + "help": "行动力低于 X 后停止,自动打开行动力箱子,X 包含箱子中的行动力,建议保留1000行动力给侵蚀1练级\n这个值将在大世界重置前3天自动减少至200点,如果启用侵蚀1练级则改为500点,并在最后一天自动减少至0点" }, "HazardLevel": { "name": "侵蚀等级", @@ -2114,6 +2118,23 @@ "help": "仅出击指定的海域,可以用来获取大世界成就星星\n支持海域ID、国服/国际服/日服/台服海域名称,例如 \"51\", \"NA海域东南E\", \"NA Ocean SE Sector E\"\n填入默认值0,或者删除数值即可取消指定" } }, + "OpsiHazard1Leveling": { + "_info": { + "name": "侵蚀1练级", + "help": "警告:这个功能仅推荐用于练级\n根据海事局最新的结论,侵蚀1产出的行动力刚好跟消耗持平,可以用来无限获取经验\n尝试使用此功能获取额外行动力被视为自负盈亏的赌博行为\n\n这个功能会自动完成地图随机事件并跳过塞壬探测装置\n推荐携带2艘预装填的保姆船以获取最高的时均经验收益\n由于在商店购买行动力需要大量作战补给凭证,启用本功能后会自动启用短猫相接来补充" + }, + "StrategySearch": { + "name": "使用计划作战", + "help": "" + }, + "TargetZone": { + "name": "指定海域", + "help": "仅出击指定的海域,可以用来获取大世界成就星星或规避游戏BUG导致的无法刷新海域", + "0": "不指定", + "44": "44 | 西大陆架D", + "22": "22 | NA海域西南B" + } + }, "Daemon": { "_info": { "name": "半自动点击", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 9530cd201..d53071aa6 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -218,6 +218,10 @@ "name": "短貓相接", "help": "" }, + "OpsiHazard1Leveling": { + "name": "侵蝕1練級", + "help": "" + }, "Daemon": { "name": "半自動點擊", "help": "" @@ -2098,7 +2102,7 @@ }, "ActionPointPreserve": { "name": "保留 X 點行動力", - "help": "行動力低於 X 後停止,自動打開行動力箱子,X 包含箱子中的行動力,建議保留 500 點行動力\n這個值將在大世界重置前3天自動減少至300點,並在最後一天自動減少至0點" + "help": "行動力低於 X 後停止,自動打開行動力箱子,X 包含箱子中的行動力,建議保留 1000 點行動力给侵蝕1練級\n這個值將在大世界重置前3天自動減少至300點,如果啟用侵蝕1練級則改為500點,並在最後一天自動減少至0點" }, "HazardLevel": { "name": "侵蝕等級", @@ -2114,6 +2118,23 @@ "help": "僅出擊指定的海域,可以用來獲取大世界成就星星\n自動更新的數值,填0可重置進度,重置後自動跳過已開荒的海域\n支持海域ID、國服/國際服/日服/台服海域名稱,例如 \"51\", \"NA海域東南E\", \"NA Ocean SE Sector E\"\n填入默認值0,或者刪除數值即可取消指定" } }, + "OpsiHazard1Leveling": { + "_info": { + "name": "侵蝕1練級", + "help": "OpsiHazard1Leveling._info.help" + }, + "StrategySearch": { + "name": "使用計畫作戰", + "help": "" + }, + "TargetZone": { + "name": "指定海域", + "help": "僅出擊指定的海域,可以用來獲取大世界成就星星或規避遊戲BUG導致的無法重繪海域", + "0": "不指定", + "44": "44 | 西大陸棚D", + "22": "22 | NA海域西南B" + } + }, "Daemon": { "_info": { "name": "半自動點擊", @@ -2149,7 +2170,7 @@ }, "AdbncScreenshot": { "name": "測試 ADB 截圖", - "help": "Benchmark.AdbncScreenshot.help" + "help": "" }, "Uiautomator2Screenshot": { "name": "測試 uiautomator2 截圖", diff --git a/module/os/map.py b/module/os/map.py index 795982a19..b3533c25b 100644 --- a/module/os/map.py +++ b/module/os/map.py @@ -1,17 +1,23 @@ +from sys import maxsize import inflection from module.base.timer import Timer +from module.combat.assets import PAUSE from module.config.utils import get_os_reset_remain from module.exception import CampaignEnd, RequestHumanTakeover -from module.exception import GameTooManyClickError +from module.exception import GameTooManyClickError, GameStuckError from module.exception import MapWalkError, ScriptError +from module.exercise.assets import QUIT_CONFIRM, QUIT_RECONFIRM from module.logger import logger from module.map.map import Map from module.os.assets import FLEET_EMP_DEBUFF from module.os.fleet import OSFleet from module.os.globe_camera import GlobeCamera from module.os.globe_operation import RewardUncollectedError -from module.os_handler.assets import AUTO_SEARCH_OS_MAP_OPTION_OFF, AUTO_SEARCH_OS_MAP_OPTION_ON +from module.os_handler.assets import AUTO_SEARCH_OS_MAP_OPTION_OFF, \ + AUTO_SEARCH_OS_MAP_OPTION_ON, AUTO_SEARCH_REWARD +from module.ui.assets import GOTO_MAIN +from module.ui.page import page_main from module.ui.ui import page_os @@ -72,6 +78,8 @@ class OSMap(OSFleet, Map, GlobeCamera): if self.zone.zone_id == 154: logger.info('In zone 154, skip running first auto search') self.handle_ash_beacon_attack() + elif self.zone.zone_id in [22, 44]: + pass else: self.run_auto_search(rescan=False) self.handle_after_auto_search() @@ -114,8 +122,8 @@ class OSMap(OSFleet, Map, GlobeCamera): if self.zone == zone: if refresh: logger.info('Goto another zone to refresh current zone') - return self.globe_goto(self.zone_nearest_azur_port(self.zone), - types=('SAFE', 'DANGEROUS'), refresh=False) + self.globe_goto(self.zone_nearest_azur_port(self.zone), + types=('SAFE', 'DANGEROUS'), refresh=False) else: logger.info('Already at target zone') return False @@ -128,7 +136,7 @@ class OSMap(OSFleet, Map, GlobeCamera): # IN_GLOBE if not self.is_in_globe(): logger.warning('Trying to move in globe, but not in os globe map') - raise ScriptError('Trying to move in globe, but not in os globe map') + raise GameStuckError # self.ensure_no_zone_pinned() self.globe_update() self.globe_focus_to(zone) @@ -349,32 +357,33 @@ class OSMap(OSFleet, Map, GlobeCamera): logger.warning('Failed to solve EMP debuff after 5 trial, assume solved') return True - def action_point_limit_override(self): + def get_action_point_limit(self): """ Override user config at the end of every month. To consume all action points without manual configuration. Returns: - bool: If overrode + int: ActionPointPreserve """ remain = get_os_reset_remain() if remain <= 0: logger.info('Just less than 1 day to OpSi reset, ' - 'set OpsiMeowfficerFarming.ActionPointPreserve to 0 temporarily') - self.config.override(OpsiMeowfficerFarming_ActionPointPreserve=0) - return True + 'set ActionPointPreserve to 0 temporarily') + return 0 + elif self.config.cross_get( + keys='OpsiHazard1Leveling.Scheduler.Enable', + default=False + ) and remain <= 2: + logger.info('Just less than 3 days to OpSi reset, ' + 'set ActionPointPreserve to 500 temporarily for hazard 1 leveling') + return 500 elif remain <= 2: logger.info('Just less than 3 days to OpSi reset, ' - 'set OpsiMeowfficerFarming.ActionPointPreserve < 300 temporarily') - self.config.override( - OpsiMeowfficerFarming_ActionPointPreserve=min( - self.config.OpsiMeowfficerFarming_ActionPointPreserve, - 300) - ) - return True + 'set ActionPointPreserve to 300 temporarily') + return 300 else: logger.info('Not close to OpSi reset') - return False + return maxsize def handle_after_auto_search(self): logger.hr('After auto search', level=2) @@ -390,7 +399,7 @@ class OSMap(OSFleet, Map, GlobeCamera): _auto_search_battle_count = 0 - def os_auto_search_daemon(self, drop=None, skip_first_screenshot=True): + def os_auto_search_daemon(self, drop=None, strategy=False, skip_first_screenshot=True): """ Raises: CampaignEnd: If auto search ended @@ -404,6 +413,7 @@ class OSMap(OSFleet, Map, GlobeCamera): logger.hr('OS auto search', level=2) self._auto_search_battle_count = 0 unlock_checked = False + strategy_checked = False unlock_check_timer = Timer(5, count=10).start() self.ash_popup_canceled = False @@ -437,8 +447,14 @@ class OSMap(OSFleet, Map, GlobeCamera): unlock_checked = True elif self.appear(AUTO_SEARCH_OS_MAP_OPTION_ON, offset=(5, 120)): unlock_checked = True - if self.handle_os_auto_search_map_option(drop=drop, enable=success): + + if self.handle_os_auto_search_map_option( + drop=drop, + enable=success, + strategy=strategy and not strategy_checked + ): unlock_checked = True + strategy_checked = True continue if self.handle_retirement(): # Retire will interrupt auto search, need a retry @@ -447,6 +463,8 @@ class OSMap(OSFleet, Map, GlobeCamera): if self.combat_appear(): self._auto_search_battle_count += 1 logger.attr('battle_count', self._auto_search_battle_count) + if strategy and self.config.task_switched(): + self.interrupt_auto_search() result = self.auto_search_combat(drop=drop) if not result: success = False @@ -456,11 +474,37 @@ class OSMap(OSFleet, Map, GlobeCamera): # Auto search can not handle siren searching device. continue - def os_auto_search_run(self, drop=None): + def interrupt_auto_search(self): + logger.info('Interrupting auto search') + while 1: + self.device.screenshot() + + if self.appear(AUTO_SEARCH_REWARD, offset=(50, 50), interval=3): + self.os_auto_search_quit() + continue + if self.appear_then_click(PAUSE, interval=0.5): + continue + if self.appear_then_click(QUIT_CONFIRM, offset=(20, 20), interval=5): + continue + if self.appear_then_click(QUIT_RECONFIRM, offset=True, interval=5): + continue + + if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 120), interval=3) \ + and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image): + self.device.click(GOTO_MAIN) + continue + if self.ui_additional(): + continue + # End + if self.ui_page_appear(page_main): + logger.info('Auto search interrupted') + self.config.task_stop() + + def os_auto_search_run(self, drop=None, strategy=False): for _ in range(5): backup = self.config.temporary(Campaign_UseAutoSearch=True) try: - self.os_auto_search_daemon(drop=drop) + self.os_auto_search_daemon(drop=drop, strategy=strategy) except CampaignEnd: logger.info('OS auto search finished') finally: @@ -470,6 +514,7 @@ class OSMap(OSFleet, Map, GlobeCamera): # Break if zone cleared if self.config.OpsiAshBeacon_AshAttack: if self.handle_ash_beacon_attack() or self.ash_popup_canceled: + strategy = False continue else: break @@ -481,7 +526,7 @@ class OSMap(OSFleet, Map, GlobeCamera): else: break - def clear_question(self, drop): + def clear_question(self, drop=None): """ Clear nearly (and 3 grids from above) question marks on radar. Try 3 times at max to avoid loop tries on 2 adjacent fleet mechanism. @@ -582,6 +627,19 @@ class OSMap(OSFleet, Map, GlobeCamera): _solved_map_event = set() _solved_fleet_mechanism = 0 + def run_strategy_search(self): + self.handle_ash_beacon_attack() + + logger.info('Run strategy search') + self.os_auto_search_run(strategy=True) + + self.hp_reset() + self.hp_get() + self._solved_map_event = set() + self._solved_fleet_mechanism = False + self.clear_question() + self.map_rescan() + def map_rescan_current(self, drop=None): """ @@ -626,7 +684,8 @@ class OSMap(OSFleet, Map, GlobeCamera): grid = grids[0] logger.info(f'Found scanning device on {grid}') self.device.click(grid) - result = self.wait_until_walk_stable(drop=drop, walk_out_of_step=False, confirm_timer=Timer(1.5, count=4)) + result = self.wait_until_walk_stable(drop=drop, walk_out_of_step=False, + confirm_timer=Timer(1.5, count=4)) self.os_auto_search_run(drop=drop) if 'event' in result: self._solved_map_event.add('is_scanning_device') diff --git a/module/os/operation_siren.py b/module/os/operation_siren.py index e1fa1c1df..dd8761dbe 100644 --- a/module/os/operation_siren.py +++ b/module/os/operation_siren.py @@ -1,5 +1,6 @@ import numpy as np +from module.base.timer import Timer from module.config.utils import (get_os_next_reset, get_os_reset_remain, DEFAULT_TIME) @@ -9,6 +10,7 @@ from module.map.map_grids import SelectedGrids from module.os.fleet import BossFleet from module.os.globe_operation import OSExploreError from module.os.map import OSMap +from module.os_handler.shop import OCR_SHOP_YELLOW_COINS class OperationSiren(OSMap): @@ -130,9 +132,12 @@ class OperationSiren(OSMap): Recommend 3 or 5 for higher meowfficer searching point per action points ratio. """ logger.hr(f'OS meowfficer farming, hazard_level={self.config.OpsiMeowfficerFarming_HazardLevel}', level=1) - self.action_point_limit_override() + preserve = min(self.get_action_point_limit(), self.config.OpsiMeowfficerFarming_ActionPointPreserve) + if preserve == 0: + self.config.override(OpsiFleet_Submarine=False) + while 1: - self.config.OS_ACTION_POINT_PRESERVE = self.config.OpsiMeowfficerFarming_ActionPointPreserve + self.config.OS_ACTION_POINT_PRESERVE = preserve if self.config.OpsiAshBeacon_AshAttack \ and not self._ash_fully_collected \ and self.config.OpsiAshBeacon_EnsureFullyCollected: @@ -149,6 +154,7 @@ class OperationSiren(OSMap): raise RequestHumanTakeover('wrong input, task stopped') else: logger.hr(f'OS meowfficer farming, zone_id={zone.zone_id}', level=1) + self.set_action_point(zone, 'SAFE') self.globe_goto(zone) self.fleet_set(self.config.OpsiFleet_Fleet) self.os_order_execute( @@ -165,6 +171,7 @@ class OperationSiren(OSMap): .sort_by_clock_degree(center=(1252, 1012), start=self.zone.location) logger.hr(f'OS meowfficer farming, zone_id={zones[0].zone_id}', level=1) + self.set_action_point(zones[0], 'SAFE') self.globe_goto(zones[0]) self.fleet_set(self.config.OpsiFleet_Fleet) self.os_order_execute( @@ -174,6 +181,68 @@ class OperationSiren(OSMap): self.handle_after_auto_search() self.config.check_task_switch() + def os_hazard1_leveling(self): + logger.hr('OS hazard 1 leveling', level=1) + while 1: + # Limited action point preserve of hazard 1 to 200 + self.config.OS_ACTION_POINT_PRESERVE = 200 + if self.config.OpsiAshBeacon_AshAttack \ + and not self._ash_fully_collected \ + and self.config.OpsiAshBeacon_EnsureFullyCollected: + logger.info('Ash beacon not fully collected, ignore action point limit temporarily') + self.config.OS_ACTION_POINT_PRESERVE = 0 + logger.attr('OS_ACTION_POINT_PRESERVE', self.config.OS_ACTION_POINT_PRESERVE) + + timeout = Timer(2).start() + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + yellow_coins = OCR_SHOP_YELLOW_COINS.ocr(self.device.image) + if yellow_coins < 100 and not timeout.reached(): + logger.info('Yellow coins less than 100, assuming it is an ocr error') + continue + elif yellow_coins < 100000: + logger.info('Reach the limit of yellow coins, preserve=100000') + self.config.task_delay(server_update=True) + self.config.task_stop() + else: + break + + self.get_current_zone() + if self.config.OpsiHazard1Leveling_StrategySearch: + # Preset action point to 100 + self.set_action_point(cost=100) + if self.config.OpsiHazard1Leveling_TargetZone != 0: + zone = self.config.OpsiHazard1Leveling_TargetZone + else: + zone = 44 + + logger.hr(f'OS hazard 1 leveling, zone_id={zone}', level=1) + if self.zone.zone_id != zone or not self.is_zone_name_hidden: + self.globe_goto(self.name_to_zone(zone), types='SAFE', refresh=True) + self.fleet_set(self.config.OpsiFleet_Fleet) + self.run_strategy_search() + else: + if self.config.OpsiHazard1Leveling_TargetZone != 0: + zone = self.config.OpsiHazard1Leveling_TargetZone + logger.hr(f'OS hazard 1 leveling, zone_id={zone}', level=1) + self.globe_goto(self.name_to_zone(zone), types='SAFE', refresh=True) + else: + zones = self.zone_select(hazard_level=1) \ + .delete(SelectedGrids([self.zone])) \ + .delete(SelectedGrids(self.zones.select(is_port=True))) + logger.hr(f'OS hazard 1 leveling, zone_id={zones[0].zone_id}', level=1) + self.globe_goto(zones[0]) + + self.fleet_set(self.config.OpsiFleet_Fleet) + self.run_auto_search() + self.handle_after_auto_search() + self.config.check_task_switch() + def _os_explore_task_delay(self): """ Delay other OpSi tasks during os_explore @@ -311,6 +380,15 @@ class OperationSiren(OSMap): else: break + def delay_abyssal(self): + # No obscure coordinates, delay next run to tomorrow. + if get_os_reset_remain() > 0: + self.config.task_delay(server_update=True) + else: + logger.info('Just less than 1 day to OpSi reset, delay 2.5 hours') + self.config.task_delay(minute=150, server_update=True) + self.config.task_stop() + def clear_abyssal(self): """ Get one abyssal logger in storage, @@ -325,13 +403,7 @@ class OperationSiren(OSMap): logger.hr('OS clear abyssal', level=1) result = self.storage_get_next_item('ABYSSAL', use_logger=self.config.OpsiGeneral_UseLogger) if not result: - # No obscure coordinates, delay next run to tomorrow. - if get_os_reset_remain() > 0: - self.config.task_delay(server_update=True) - else: - logger.info('Just less than 1 day to OpSi reset, delay 2.5 hours') - self.config.task_delay(minute=150, server_update=True) - self.config.task_stop() + self.delay_abyssal() self.config.override( OpsiGeneral_DoRandomMapEvent=False, @@ -344,6 +416,7 @@ class OperationSiren(OSMap): raise RequestHumanTakeover self.fleet_repair(revert=False) + self.delay_abyssal() def os_abyssal(self): while 1: diff --git a/module/os_handler/action_point.py b/module/os_handler/action_point.py index 13c5533f9..0d87e98c4 100644 --- a/module/os_handler/action_point.py +++ b/module/os_handler/action_point.py @@ -1,5 +1,6 @@ import module.config.server as server from module.base.button import ButtonGrid +from module.base.timer import Timer from module.base.utils import * from module.logger import logger from module.ocr.ocr import Digit, DigitCounter @@ -9,6 +10,8 @@ from module.ui.assets import OS_CHECK from module.ui.ui import UI OCR_ACTION_POINT_REMAIN = Digit(ACTION_POINT_REMAIN, letter=(255, 219, 66), name='OCR_ACTION_POINT_REMAIN') +OCR_ACTION_POINT_REMAIN_OS = Digit(ACTION_POINT_REMAIN_OS, letter=(239, 239, 239), + threshold=160, name='OCR_SHOP_YELLOW_COINS_OS') if server.server != 'jp': # Letters in ACTION_POINT_BUY_REMAIN are not the numeric fonts usually used in azur lane. OCR_ACTION_POINT_BUY_REMAIN = DigitCounter( @@ -51,6 +54,12 @@ ACTION_POINTS_BUY = { 4: 1000, 5: 1000, } +ACTION_POINT_BOX = { + 0: 0, + 1: 20, + 2: 50, + 3: 100, +} class ActionPointLimit(Exception): @@ -95,7 +104,7 @@ class ActionPointHandler(UI): current = OCR_ACTION_POINT_REMAIN.ocr(self.device.image) total = current if self.config.OS_ACTION_POINT_BOX_USE: - total += np.sum(np.array(box) * (0, 20, 50, 100)) + total += np.sum(np.array(box) * tuple(ACTION_POINT_BOX.values())) oil = box[0] logger.info(f'Action points: {current}({total}), oil: {oil}') @@ -103,6 +112,23 @@ class ActionPointHandler(UI): self._action_point_box = box self._action_point_total = total + def action_point_safe_get(self, skip_first_screenshot=True): + timeout = Timer(1, count=2).start() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if timeout.reached(): + logger.warning('Get action points timeout') + break + + self.action_point_update() + + if sum(self._action_point_box[1:]) > 0 and self._action_point_box[0] > 0: + break + @staticmethod def action_point_get_cost(zone, pinned): """ @@ -208,11 +234,12 @@ class ActionPointHandler(UI): """ self.ui_click(ACTION_POINT_CANCEL, check_button=OS_CHECK, skip_first_screenshot=skip_first_screenshot) - def handle_action_point(self, zone, pinned): + def handle_action_point(self, zone, pinned, cost=None): """ Args: zone (Zone): Zone to enter. pinned (str): Zone type. Available types: DANGEROUS, SAFE, OBSCURE, ABYSSAL, STRONGHOLD. + cost (int): Custom action point cost value. Returns: bool: If handled. @@ -227,11 +254,15 @@ class ActionPointHandler(UI): return False # AP boxes have an animation to show - self.device.sleep(0.3) - self.device.screenshot() - self.action_point_update() - cost = self.action_point_get_cost(zone, pinned) + self.action_point_safe_get() + if cost is None: + cost = self.action_point_get_cost(zone, pinned) buy_checked = False + if self._action_point_total <= self.config.OS_ACTION_POINT_PRESERVE: + logger.info(f'Reach the limit of action points, preserve={self.config.OS_ACTION_POINT_PRESERVE}') + self.action_point_quit() + raise ActionPointLimit + for _ in range(12): # Having enough action points if self._action_point_current >= cost: @@ -246,8 +277,16 @@ class ActionPointHandler(UI): else: buy_checked = True + # Sort action point boxes + box = [] + for index in [1, 2, 3]: + if self._action_point_box[index] > 0: + if self._action_point_current + ACTION_POINT_BOX[index] >= 200: + box.append(index) + else: + box.insert(0, index) + # Use action point boxes - box = [index for index in [3, 2, 1] if self._action_point_box[index] > 0] if len(box): if self._action_point_total > self.config.OS_ACTION_POINT_PRESERVE: self.action_point_set_button(box[0]) @@ -264,3 +303,22 @@ class ActionPointHandler(UI): logger.warning('Failed to get action points after 12 trial') return False + + def set_action_point(self, zone=None, pinned=None, cost=None): + """ + Args: + zone (Zone): Zone to enter. + pinned (str): Zone type. Available types: DANGEROUS, SAFE, OBSCURE, ABYSSAL, STRONGHOLD. + cost (int): Custom action point cost value. + + Returns: + bool: If handled. + """ + self.ui_click(ACTION_POINT_REMAIN_OS, ACTION_POINT_USE, OS_CHECK) + if not self.handle_action_point(zone, pinned, cost): + return False + + while 1: + if self.appear(IN_MAP, offset=(200, 5)): + return True + self.device.screenshot() diff --git a/module/os_handler/assets.py b/module/os_handler/assets.py index 9aa8691a2..0edaf0c8e 100644 --- a/module/os_handler/assets.py +++ b/module/os_handler/assets.py @@ -7,6 +7,7 @@ from module.base.template import Template ACTION_POINT_BUY_REMAIN = Button(area={'cn': (803, 458, 833, 482), 'en': (907, 458, 941, 483), 'jp': (891, 464, 927, 484), 'tw': (803, 458, 833, 482)}, color={'cn': (108, 138, 125), 'en': (106, 145, 116), 'jp': (135, 142, 153), 'tw': (108, 138, 125)}, button={'cn': (803, 458, 833, 482), 'en': (907, 458, 941, 483), 'jp': (891, 464, 927, 484), 'tw': (803, 458, 833, 482)}, file={'cn': './assets/cn/os_handler/ACTION_POINT_BUY_REMAIN.png', 'en': './assets/en/os_handler/ACTION_POINT_BUY_REMAIN.png', 'jp': './assets/jp/os_handler/ACTION_POINT_BUY_REMAIN.png', 'tw': './assets/tw/os_handler/ACTION_POINT_BUY_REMAIN.png'}) ACTION_POINT_CANCEL = Button(area={'cn': (370, 528, 542, 585), 'en': (375, 531, 537, 584), 'jp': (369, 527, 544, 587), 'tw': (371, 528, 541, 586)}, color={'cn': (167, 168, 171), 'en': (170, 172, 175), 'jp': (161, 163, 165), 'tw': (168, 169, 172)}, button={'cn': (370, 528, 542, 585), 'en': (375, 531, 537, 584), 'jp': (369, 527, 544, 587), 'tw': (371, 528, 541, 586)}, file={'cn': './assets/cn/os_handler/ACTION_POINT_CANCEL.png', 'en': './assets/en/os_handler/ACTION_POINT_CANCEL.png', 'jp': './assets/jp/os_handler/ACTION_POINT_CANCEL.png', 'tw': './assets/tw/os_handler/ACTION_POINT_CANCEL.png'}) ACTION_POINT_REMAIN = Button(area={'cn': (892, 220, 952, 241), 'en': (892, 220, 952, 241), 'jp': (908, 220, 979, 240), 'tw': (892, 220, 952, 241)}, color={'cn': (124, 127, 113), 'en': (124, 127, 113), 'jp': (119, 121, 113), 'tw': (124, 127, 113)}, button={'cn': (892, 220, 952, 241), 'en': (892, 220, 952, 241), 'jp': (908, 220, 979, 240), 'tw': (892, 220, 952, 241)}, file={'cn': './assets/cn/os_handler/ACTION_POINT_REMAIN.png', 'en': './assets/en/os_handler/ACTION_POINT_REMAIN.png', 'jp': './assets/jp/os_handler/ACTION_POINT_REMAIN.png', 'tw': './assets/tw/os_handler/ACTION_POINT_REMAIN.png'}) +ACTION_POINT_REMAIN_OS = Button(area={'cn': (878, 28, 928, 46), 'en': (878, 28, 928, 46), 'jp': (878, 28, 928, 46), 'tw': (878, 28, 928, 46)}, color={'cn': (78, 89, 100), 'en': (78, 89, 100), 'jp': (78, 89, 100), 'tw': (78, 89, 100)}, button={'cn': (878, 28, 928, 46), 'en': (878, 28, 928, 46), 'jp': (878, 28, 928, 46), 'tw': (878, 28, 928, 46)}, file={'cn': './assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png', 'en': './assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png', 'jp': './assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png', 'tw': './assets/cn/os_handler/ACTION_POINT_REMAIN_OS.png'}) ACTION_POINT_USE = Button(area={'cn': (738, 528, 910, 585), 'en': (742, 531, 909, 584), 'jp': (737, 528, 911, 586), 'tw': (739, 528, 909, 585)}, color={'cn': (93, 142, 203), 'en': (107, 152, 208), 'jp': (92, 141, 203), 'tw': (95, 144, 205)}, button={'cn': (738, 528, 910, 585), 'en': (742, 531, 909, 584), 'jp': (737, 528, 911, 586), 'tw': (739, 528, 909, 585)}, file={'cn': './assets/cn/os_handler/ACTION_POINT_USE.png', 'en': './assets/en/os_handler/ACTION_POINT_USE.png', 'jp': './assets/jp/os_handler/ACTION_POINT_USE.png', 'tw': './assets/tw/os_handler/ACTION_POINT_USE.png'}) ASH_POPUP_CHECK = Button(area={'cn': (665, 318, 759, 340), 'en': (372, 324, 601, 342), 'jp': (438, 311, 534, 346), 'tw': (665, 298, 759, 320)}, color={'cn': (154, 163, 172), 'en': (174, 179, 184), 'jp': (146, 154, 161), 'tw': (157, 166, 176)}, button={'cn': (665, 318, 759, 340), 'en': (372, 324, 601, 342), 'jp': (438, 311, 534, 346), 'tw': (665, 298, 759, 320)}, file={'cn': './assets/cn/os_handler/ASH_POPUP_CHECK.png', 'en': './assets/en/os_handler/ASH_POPUP_CHECK.png', 'jp': './assets/jp/os_handler/ASH_POPUP_CHECK.png', 'tw': './assets/tw/os_handler/ASH_POPUP_CHECK.png'}) AUTO_SEARCH_OS_MAP_OPTION_OFF = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1201, 524, 1274, 534), 'jp': (1204, 572, 1276, 593), 'tw': (1206, 573, 1275, 591)}, color={'cn': (196, 169, 169), 'en': (167, 140, 142), 'jp': (180, 154, 157), 'tw': (167, 143, 147)}, button={'cn': (1205, 549, 1275, 566), 'en': (1201, 524, 1274, 534), 'jp': (1204, 572, 1276, 593), 'tw': (1206, 573, 1275, 591)}, file={'cn': './assets/cn/os_handler/AUTO_SEARCH_OS_MAP_OPTION_OFF.png', 'en': './assets/en/os_handler/AUTO_SEARCH_OS_MAP_OPTION_OFF.png', 'jp': './assets/jp/os_handler/AUTO_SEARCH_OS_MAP_OPTION_OFF.png', 'tw': './assets/tw/os_handler/AUTO_SEARCH_OS_MAP_OPTION_OFF.png'}) @@ -57,6 +58,16 @@ STORAGE_COORDINATE_CHECKOUT = Button(area={'cn': (554, 493, 726, 550), 'en': (56 STORAGE_ENTER = Button(area={'cn': (770, 636, 880, 699), 'en': (761, 640, 876, 695), 'jp': (757, 636, 880, 699), 'tw': (618, 638, 725, 698)}, color={'cn': (240, 199, 121), 'en': (238, 191, 115), 'jp': (237, 187, 100), 'tw': (240, 197, 125)}, button={'cn': (770, 636, 880, 699), 'en': (761, 640, 876, 695), 'jp': (757, 636, 880, 699), 'tw': (618, 638, 725, 698)}, file={'cn': './assets/cn/os_handler/STORAGE_ENTER.png', 'en': './assets/en/os_handler/STORAGE_ENTER.png', 'jp': './assets/jp/os_handler/STORAGE_ENTER.png', 'tw': './assets/tw/os_handler/STORAGE_ENTER.png'}) STORAGE_USE = Button(area={'cn': (709, 506, 769, 536), 'en': (729, 509, 786, 533), 'jp': (764, 506, 856, 536), 'tw': (709, 506, 769, 536)}, color={'cn': (161, 186, 220), 'en': (164, 189, 222), 'jp': (142, 178, 224), 'tw': (161, 186, 220)}, button={'cn': (687, 493, 860, 550), 'en': (693, 495, 858, 549), 'jp': (686, 492, 861, 552), 'tw': (687, 493, 860, 550)}, file={'cn': './assets/cn/os_handler/STORAGE_USE.png', 'en': './assets/en/os_handler/STORAGE_USE.png', 'jp': './assets/jp/os_handler/STORAGE_USE.png', 'tw': './assets/tw/os_handler/STORAGE_USE.png'}) STORATE_SCROLL = Button(area={'cn': (1256, 102, 1264, 589), 'en': (1256, 102, 1264, 589), 'jp': (1256, 102, 1264, 589), 'tw': (1256, 102, 1264, 589)}, color={'cn': (119, 109, 60), 'en': (119, 109, 60), 'jp': (119, 109, 60), 'tw': (119, 109, 60)}, button={'cn': (1256, 102, 1264, 589), 'en': (1256, 102, 1264, 589), 'jp': (1256, 102, 1264, 589), 'tw': (1256, 102, 1264, 589)}, file={'cn': './assets/cn/os_handler/STORATE_SCROLL.png', 'en': './assets/en/os_handler/STORATE_SCROLL.png', 'jp': './assets/jp/os_handler/STORATE_SCROLL.png', 'tw': './assets/tw/os_handler/STORATE_SCROLL.png'}) +STRATEGY_SEARCH_MAP_OPTION_OFF = Button(area={'cn': (1178, 576, 1278, 617), 'en': (1178, 576, 1278, 617), 'jp': (1178, 576, 1278, 617), 'tw': (1178, 576, 1278, 617)}, color={'cn': (96, 102, 122), 'en': (96, 102, 122), 'jp': (96, 102, 122), 'tw': (96, 102, 122)}, button={'cn': (1178, 576, 1278, 617), 'en': (1178, 576, 1278, 617), 'jp': (1178, 576, 1278, 617), 'tw': (1178, 576, 1278, 617)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_MAP_OPTION_OFF.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_MAP_OPTION_OFF.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_MAP_OPTION_OFF.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_MAP_OPTION_OFF.png'}) +STRATEGY_SEARCH_POPUP_CHECK = Button(area={'cn': (370, 166, 566, 198), 'en': (370, 166, 566, 198), 'jp': (370, 166, 566, 198), 'tw': (370, 166, 566, 198)}, color={'cn': (150, 170, 209), 'en': (150, 170, 209), 'jp': (150, 170, 209), 'tw': (150, 170, 209)}, button={'cn': (370, 166, 566, 198), 'en': (370, 166, 566, 198), 'jp': (370, 166, 566, 198), 'tw': (370, 166, 566, 198)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_POPUP_CHECK.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_POPUP_CHECK.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_POPUP_CHECK.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_POPUP_CHECK.png'}) +STRATEGY_SEARCH_SAFE_OPTION_OFF = Button(area={'cn': (457, 229, 550, 257), 'en': (457, 229, 550, 257), 'jp': (457, 229, 550, 257), 'tw': (457, 229, 550, 257)}, color={'cn': (111, 141, 195), 'en': (111, 141, 195), 'jp': (111, 141, 195), 'tw': (111, 141, 195)}, button={'cn': (640, 217, 913, 270), 'en': (640, 217, 913, 270), 'jp': (640, 217, 913, 270), 'tw': (640, 217, 913, 270)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_OFF.png'}) +STRATEGY_SEARCH_SAFE_OPTION_ON = Button(area={'cn': (731, 229, 823, 258), 'en': (731, 229, 823, 258), 'jp': (731, 229, 823, 258), 'tw': (731, 229, 823, 258)}, color={'cn': (105, 136, 192), 'en': (105, 136, 192), 'jp': (105, 136, 192), 'tw': (105, 136, 192)}, button={'cn': (731, 229, 823, 258), 'en': (731, 229, 823, 258), 'jp': (731, 229, 823, 258), 'tw': (731, 229, 823, 258)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_SAFE_OPTION_ON.png'}) +STRATEGY_SEARCH_SCROLL_AREA = Button(area={'cn': (902, 277, 910, 470), 'en': (902, 277, 910, 470), 'jp': (902, 277, 910, 470), 'tw': (902, 277, 910, 470)}, color={'cn': (151, 145, 102), 'en': (151, 145, 102), 'jp': (151, 145, 102), 'tw': (151, 145, 102)}, button={'cn': (902, 277, 910, 470), 'en': (902, 277, 910, 470), 'jp': (902, 277, 910, 470), 'tw': (902, 277, 910, 470)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_SCROLL_AREA.png'}) +STRATEGY_SEARCH_WAIT_2_CHECK = Button(area={'cn': (474, 404, 556, 422), 'en': (474, 404, 556, 422), 'jp': (474, 404, 556, 422), 'tw': (474, 404, 556, 422)}, color={'cn': (149, 156, 168), 'en': (149, 156, 168), 'jp': (149, 156, 168), 'tw': (149, 156, 168)}, button={'cn': (474, 404, 556, 422), 'en': (474, 404, 556, 422), 'jp': (474, 404, 556, 422), 'tw': (474, 404, 556, 422)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_2_CHECK.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_2_CHECK.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_2_CHECK.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_2_CHECK.png'}) +STRATEGY_SEARCH_WAIT_OFF = Button(area={'cn': (519, 443, 535, 458), 'en': (519, 443, 535, 458), 'jp': (519, 443, 535, 458), 'tw': (519, 443, 535, 458)}, color={'cn': (89, 128, 66), 'en': (89, 128, 66), 'jp': (89, 128, 66), 'tw': (89, 128, 66)}, button={'cn': (519, 443, 535, 458), 'en': (519, 443, 535, 458), 'jp': (519, 443, 535, 458), 'tw': (519, 443, 535, 458)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_OFF.png'}) +STRATEGY_SEARCH_WAIT_ON = Button(area={'cn': (446, 443, 462, 458), 'en': (446, 443, 462, 458), 'jp': (446, 443, 462, 458), 'tw': (446, 443, 462, 458)}, color={'cn': (89, 128, 67), 'en': (89, 128, 67), 'jp': (89, 128, 67), 'tw': (89, 128, 67)}, button={'cn': (446, 443, 462, 458), 'en': (446, 443, 462, 458), 'jp': (446, 443, 462, 458), 'tw': (446, 443, 462, 458)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_WAIT_ON.png'}) +STRATEGY_SEARCH_ZONE_MODE_OFF = Button(area={'cn': (750, 335, 766, 350), 'en': (750, 335, 766, 350), 'jp': (750, 335, 766, 350), 'tw': (750, 335, 766, 350)}, color={'cn': (89, 128, 67), 'en': (89, 128, 67), 'jp': (89, 128, 67), 'tw': (89, 128, 67)}, button={'cn': (750, 335, 766, 350), 'en': (750, 335, 766, 350), 'jp': (750, 335, 766, 350), 'tw': (750, 335, 766, 350)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_OFF.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_OFF.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_OFF.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_OFF.png'}) +STRATEGY_SEARCH_ZONE_MODE_ON = Button(area={'cn': (551, 335, 567, 350), 'en': (551, 335, 567, 350), 'jp': (551, 335, 567, 350), 'tw': (551, 335, 567, 350)}, color={'cn': (89, 128, 67), 'en': (89, 128, 67), 'jp': (89, 128, 67), 'tw': (89, 128, 67)}, button={'cn': (551, 335, 567, 350), 'en': (551, 335, 567, 350), 'jp': (551, 335, 567, 350), 'tw': (551, 335, 567, 350)}, file={'cn': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png', 'en': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png', 'jp': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png', 'tw': './assets/cn/os_handler/STRATEGY_SEARCH_ZONE_MODE_ON.png'}) TEMPLATE_STORAGE_ABYSSAL = Template(file={'cn': './assets/cn/os_handler/TEMPLATE_STORAGE_ABYSSAL.png', 'en': './assets/en/os_handler/TEMPLATE_STORAGE_ABYSSAL.png', 'jp': './assets/jp/os_handler/TEMPLATE_STORAGE_ABYSSAL.png', 'tw': './assets/tw/os_handler/TEMPLATE_STORAGE_ABYSSAL.png'}) TEMPLATE_STORAGE_COMBAT = Template(file={'cn': './assets/cn/os_handler/TEMPLATE_STORAGE_COMBAT.png', 'en': './assets/en/os_handler/TEMPLATE_STORAGE_COMBAT.png', 'jp': './assets/jp/os_handler/TEMPLATE_STORAGE_COMBAT.png', 'tw': './assets/tw/os_handler/TEMPLATE_STORAGE_COMBAT.png'}) TEMPLATE_STORAGE_LOGGER = Template(file={'cn': './assets/cn/os_handler/TEMPLATE_STORAGE_LOGGER.gif', 'en': './assets/en/os_handler/TEMPLATE_STORAGE_LOGGER.gif', 'jp': './assets/jp/os_handler/TEMPLATE_STORAGE_LOGGER.gif', 'tw': './assets/tw/os_handler/TEMPLATE_STORAGE_LOGGER.gif'}) diff --git a/module/os_handler/map_event.py b/module/os_handler/map_event.py index f15b572d2..5ac8688f6 100644 --- a/module/os_handler/map_event.py +++ b/module/os_handler/map_event.py @@ -1,4 +1,5 @@ from module.base.timer import Timer +from module.base.utils import get_color from module.combat.assets import * from module.exception import CampaignEnd from module.handler.assets import * @@ -7,8 +8,10 @@ from module.os.assets import GLOBE_GOTO_MAP from module.os_handler.assets import * from module.os_handler.enemy_searching import EnemySearchingHandler from module.statistics.azurstats import DropImage +from module.ui.scroll import Scroll from module.ui.switch import Switch +STRATEGY_SEARCH_SCROLL = Scroll(STRATEGY_SEARCH_SCROLL_AREA, color=(247, 211, 66), name='STRATEGY_SEARCH_SCROLL') fleet_lock = Switch('Fleet_Lock', offset=(10, 120)) fleet_lock.add_status('on', check_button=OS_FLEET_LOCKED) fleet_lock.add_status('off', check_button=OS_FLEET_UNLOCKED) @@ -208,7 +211,8 @@ class MapEventHandler(EnemySearchingHandler): confirm_timer.reset() continue if self.appear_then_click(GLOBE_GOTO_MAP, offset=(20, 20), interval=2): - # Sometimes entered globe map after clicking AUTO_SEARCH_REWARD, but don't know why + # Sometimes entered globe map after clicking AUTO_SEARCH_REWARD + # because of duplicated clicks and clicks to places outside the map confirm_timer.reset() continue @@ -221,11 +225,13 @@ class MapEventHandler(EnemySearchingHandler): return cleared - def handle_os_auto_search_map_option(self, drop=None, enable=True): + def handle_os_auto_search_map_option(self, drop=None, enable=True, strategy=False, quit=True): """ Args: - drop (DropImage) + drop (DropImage): enable (bool): + strategy (bool): + quit (bool): Returns: bool: If clicked. @@ -238,13 +244,15 @@ class MapEventHandler(EnemySearchingHandler): raise CampaignEnd if self.appear(AUTO_SEARCH_REWARD, offset=(50, 50)): self.device.screenshot_interval_set() - if self.os_auto_search_quit(drop=drop): + if quit and self.os_auto_search_quit(drop=drop): # No more items on current map raise CampaignEnd else: # Auto search stopped but map hasn't been cleared return True - if enable: + if strategy and enable: + return self.handle_strategy_search_map_option() + elif enable: if self.appear(AUTO_SEARCH_OS_MAP_OPTION_OFF, offset=(5, 120), interval=3) \ and AUTO_SEARCH_OS_MAP_OPTION_OFF.match_appear_on(self.device.image): self.device.click(AUTO_SEARCH_OS_MAP_OPTION_OFF) @@ -257,6 +265,76 @@ class MapEventHandler(EnemySearchingHandler): return False + def handle_strategy_search_map_option(self): + if STRATEGY_SEARCH_MAP_OPTION_OFF.match_appear_on(self.device.image) \ + and self.appear_then_click(STRATEGY_SEARCH_MAP_OPTION_OFF, interval=2): + return False + if not self.appear(STRATEGY_SEARCH_POPUP_CHECK): + return False + self.handle_strategy_search_setting_option() + + def handle_strategy_search_setting_option(self): + while 1: + self.device.screenshot() + if not self.appear(STRATEGY_SEARCH_POPUP_CHECK): + return False + + if self.appear(STRATEGY_SEARCH_SAFE_OPTION_OFF) \ + and get_color(self.device.image, STRATEGY_SEARCH_SAFE_OPTION_OFF.area)[2] > 185: + self.device.click(STRATEGY_SEARCH_SAFE_OPTION_OFF) + continue + if self.appear(STRATEGY_SEARCH_SAFE_OPTION_ON) \ + and get_color(self.device.image, STRATEGY_SEARCH_SAFE_OPTION_ON.area)[2] > 185: + break + + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + if not self.appear(STRATEGY_SEARCH_POPUP_CHECK): + return False + + if self.appear(STRATEGY_SEARCH_ZONE_MODE_ON) \ + and self.appear(STRATEGY_SEARCH_WAIT_ON): + break + if self.appear(STRATEGY_SEARCH_ZONE_MODE_OFF): + self.device.click(STRATEGY_SEARCH_ZONE_MODE_ON) + if self.appear(STRATEGY_SEARCH_WAIT_OFF): + self.device.click(STRATEGY_SEARCH_WAIT_ON) + + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + if not self.appear(STRATEGY_SEARCH_POPUP_CHECK): + return False + + check = self.appear(STRATEGY_SEARCH_WAIT_2_CHECK, offset=(20, 40), threshold=0.7) + if check and self.appear(STRATEGY_SEARCH_WAIT_ON, offset=(30, 60)): + break + if check and self.appear(STRATEGY_SEARCH_WAIT_OFF, offset=(30, 60)): + self.device.click(STRATEGY_SEARCH_WAIT_ON) + else: + STRATEGY_SEARCH_SCROLL.set_top(main=self) + STRATEGY_SEARCH_SCROLL.set(0.33, main=self) + + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + if not self.appear(STRATEGY_SEARCH_POPUP_CHECK): + return False + + self.appear_then_click(POPUP_CONFIRM, offset=(30, 30), interval=2) + if self.is_in_map(): + return True + def handle_os_map_fleet_lock(self, enable=None): """ Args: