From 2857fcdf22e6d6e0510b52c960642cee9e3eacb7 Mon Sep 17 00:00:00 2001 From: MistEO Date: Tue, 4 Jan 2022 00:59:17 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E6=96=B0=E5=A2=9E=E5=85=AC=E6=8B=9B?= =?UTF-8?q?=E5=8A=A0=E6=80=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/AsstCaller.h | 4 +- resource/tasks.json | 30 ++++ resource/template/RecruitNowConfirm.png | Bin 0 -> 35309 bytes src/MeoAssistant/AbstractTask.h | 2 +- src/MeoAssistant/Assistant.cpp | 3 +- src/MeoAssistant/Assistant.h | 12 +- src/MeoAssistant/AsstCaller.cpp | 4 +- src/MeoAssistant/AutoRecruitTask.cpp | 132 ++++++++++++------ src/MeoAssistant/AutoRecruitTask.h | 6 + src/MeoAssistant/OcrImageAnalyzer.cpp | 15 ++ src/MeoAssistant/OcrImageAnalyzer.h | 2 + src/MeoAssistant/Version.h | 2 +- src/MeoAsstGui/Helper/AsstProxy.cs | 6 +- .../AutoRecruitSettingsUserControl.xaml | 1 + .../ViewModels/SettingsViewModel.cs | 10 +- .../ViewModels/TaskQueueViewModel.cs | 4 +- src/Python/interface.py | 9 +- tools/TestCaller/main.cpp | 11 +- 18 files changed, 183 insertions(+), 70 deletions(-) create mode 100644 resource/template/RecruitNowConfirm.png diff --git a/include/AsstCaller.h b/include/AsstCaller.h index d643e569bd..f644354d57 100644 --- a/include/AsstCaller.h +++ b/include/AsstCaller.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "AsstPort.h" @@ -28,7 +28,7 @@ extern "C" { bool ASSTAPI AsstAppendMall(asst::Assistant* p_asst, bool with_shopping); // bool ASSTAPI AsstAppendProcessTask(asst::Assistant* p_asst, const char* task_name); bool ASSTAPI AsstAppendInfrast(asst::Assistant* p_asst, int work_mode, const char** order, int order_size, const char* uses_of_drones, double dorm_threshold); - bool ASSTAPI AsstAppendRecruit(asst::Assistant* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh); + bool ASSTAPI AsstAppendRecruit(asst::Assistant* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh, bool use_expedited); bool ASSTAPI AsstAppendDebug(asst::Assistant* p_asst); bool ASSTAPI AsstStartRecruitCalc(asst::Assistant* p_asst, const int select_level[], int required_len, bool set_time); diff --git a/resource/tasks.json b/resource/tasks.json index 562d6c9d1e..a4acd451e1 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -904,6 +904,36 @@ ], "action": "Stop" }, + "RecruitNow": { + "algorithm": "OcrDetect", + "action": "clickSelf", + "rearDelay": 500, + "cache": false, + "text": [ + "立即招" + ], + "roi": [ + 0, + 300, + 1280, + 420 + ], + "next": [ + "RecruitNowConfirm" + ] + }, + "RecruitNowConfirm": { + "action": "clickSelf", + "roi": [ + 640, + 450, + 640, + 150 + ], + "next": [ + "RecruitFinish" + ] + }, "AwardBegin": { "algorithm": "justreturn", "action": "doNothing", diff --git a/resource/template/RecruitNowConfirm.png b/resource/template/RecruitNowConfirm.png new file mode 100644 index 0000000000000000000000000000000000000000..dffffa1eff8b4dd27f969985952b581ed4066763 GIT binary patch literal 35309 zcmXtfRa9GT*DX-o-7PIHFYa!|y%cvZUZhBZOL2<3ySux)wz#JdAjREJzB9&ulaYP1 zcSiQJ)|zWdq=uS27CJdP92^{$qJpdz92|TO?7KWFGVF5`E7KGXjuuW)R_cp)_GXWM zJiVgV&LaTh&$1q-NKuMCJ#E1#M! z0cT$q7vAkN54)Bxtz2bR&({O;sV!iWHTCrL(9rc~8!H{pB+3s6IzH!orqf%qR}$~; zaSsx6@x~1FOUKD;jD{imHy|IR^H3(*#?7}bk#E8%jKA0joawQY%_7weC-LFt`Y@| z(2&yFetkk>dZejqcg%~|GIhnJc2ZvP z6olYP!~T^qMn>K)DuI<1Q~>O{lvy!xzL~ufI^KwBS<{CNQ79=McaJJG>oK`Mhm%Z& z2r}DeB10&Zm}9uwFRDwDr)_wOasMqlgyOzshSBD!Jo&(V+>9nbKtTmCO(k|h=M9oj z_X0@HtPNNERR=`}K}wJWrC(NLw-*nRnbvT;sv+okW9D!Gdi{r3dqX3^)-O>O!X;4Q z^$XGBWK@8LQbEh8fpTW40<--_tAu|dU9r6qRjn@Sf@zW#x&u45LL(-W(s(7volcsz zgl^6~v-Eg{PrT_tZJ5t(_I51RfurOf=<4#XYF%y6PgTFTI^NBV5SA*J4()(8E6a%^!I~b70|t)92E+ zh4;HX`9EH&hPoab$o7&#L9+P-5i0aL+6yPd8498JbWGbmFW5eri@*7dH?+?0i|r?^ zxG%F1`tY(!JBTP}HB;&1X(VjgHWpggyJo^mE5{pS9>2*gdFu7Udp^YCB2*AYClO4- zPU;M@6K1W`uYRkBi{S3shS7OXDo^7OTw1!Q^{7g*8U1agdNicgN4?b_gT^yE;_|U41PFU_R`u01DQnHq|ooe*8F)(j%{X`UmZf- z$3@4`_EMy9!-cD*HkqvT6A6(#muO?)9W!el> zMoNnMsZ0RZy|*B`G6_|5Ki4zE7NvP^QB5K@QN*NDgO^+Mo)BF<?i+PYC7PTS9-d zv}oL=&s$^cbFG7So|{udfQ!~Tjt=r=+x^UAv`O1@uIUS~Tl|tr`~8U3^rakwIMoX~ zgTDKD;F*+7XRF@O#Xc+U3xkO-{2)5N+{TsG`r*)L%?OH%fA*qkwQu)* z%RZgKS{AwzWmMI+X(E%Cmxr}Mqm@TK1#Rk_yd-OVm(#C0o~-jZ&>Dm6qG(7nu_gP` zpD4DedSev9X6FRh!{Hzavzk_9gF>C9K^L4!qL8B_)Foa)%cIQjTKn!RYE(-wr4#PI zHz{yCTUE^OPHzO&j-bMDE>J^Aj-i^yOp)S!gKk#Avy2n1(3&jN9DQ@8^d9UUsYbDHwa zNPwAMUmsyW#toa`kk~p>NjrP_^)-rfjw7l4)*0C(Q!A>F$#-DeK9*;6Zp4LTG; zQh0xpZR!acv%RO$PIINU-y(}+U0yzlZY@e8y2$y$mMhPURM#*KZirA~K*xjs5jqW! z;x%fM83T@cC*e{DyqE4s`~?oV9qD(Ub#C9iSc1)uRNv%c1ZoZn?pbF=JYodpU!{Km zzu1t;Y3??LdL+7gbng2$m9FtK6(p!>5YyX|*nZKG)BW*VN7Z;G-3%lg$UA~I;MF&V z3@Aw6hfRP+rqxrgoyX>j?lAAEO$uB|gp z%emMn%ObbY3M*+BAQ}7T5wix76vPypeV_JQYOP zDvi20ftXRsYYYKw*UAXX=a$lG?ITQEeHi{!*sl}S&6J?E=xH2a1VEI_z3+p5+$2mk zA|d?#H5Ijlb1&oP12*g^U&xMdhL?rAnt$Q1(6Ukt<|%#u)bBLZA)`*`p9=Bm>W}K>dA}<-uUltM_IBxfJGAMCaBV9r0P`8w9RIPe)q5UTxSjN$M7z)QXpdI=NUg~psxpQ;9`N6|KWh^b zlrH(;IOsv_nm?CRL?pxv2#$$+e<2p7q^D0R%pZ5J+|`uZ&;r|Kexc;O15O-2ButCbPT?GZ(_G#glE%P^pQ z+|&(Svry3#jv%Bi)K-)xIF$8fVb#iZMV04Rjdaa+r<2SrrRL^ErV?G_odQ-fdrMz- zkEXx9Cht2N4GTqJZ>Ou^t7vfhqE>vzkfR6O@e@k=ZhDp_-D!n7_coQY_F8pW)WjAK9Y;*eL@si{{DUrWsd1KAQ7i9LK! zalKT|VFoBZR_Pj_vv+m1h;i}r6eEZUogo?tdJC&u*Dk7Ap~+*y2pk(zlUn_{dj;m6 zHqH#mOs!OU{nUmE2M$sAWQ$&-#a4DzW9@UVW}QDtg8NfMdlErA-HQhJ%)hLU!7c_( zCUt&N`N>zQ@(3S^1P@#Vvpq?j(%Fa!eP$0wFtS^I8?V%LVMv!QkwYoT&nt$Z%w^he zt$3kOr&gf9+7O1>1meH(2NnA{BT{! zP3bRA`T7fajFNSqt6*>bsqd7ucIE+i`Rtt=fzPtvets_#vhP$!bSB;6!ees(jN)gB zGF#QlpBGSUsM=Fkez)O2#FTOI(1Rl=(P!odiv3X8io`4=E+$t}5l`h|95};k<~B=9 zU;S0Nb5=%iH!N$Cdvo&e=md-wDj6_V+)BYlikDYb7_4+1lD3m0s@Ht5Wc{;v(3y zPok+THFTI1iG(QOmnNZ+kdUYx62RI+=Ykkv21F>TUTUz^VS~7c&we$%spwPb67!6I zJeFJRcw*xR^AA4&EX?$<*KNUDoPVD zWbS|)>J2PwWb3+)qrP%393*GSAbsv~F(F)*(PNucU1}!bmN|+VxWz^S&kx3(>%2Js z6B~Yv2zA2W4gpkiznlW5Ku23QO6I#DETTg|yPIHmpAa4ASkx6R&|`}e(VIAoi*EAO20enn6ol(W!si zViyI2^B~(OQZ^%^N~*Gnk;!5UyRNRTzd7oFsdL4`>l6*!MIqDpV)E7j{Z{GzcWobK zJtbMx-ZCg5x4NpDqqMf4R{!^o(AEQ3YZx-zVCPPxUT-z^v&7^^&M%?EP`a?`Ijh-Y zn}V%{2j3^0+lne#YU}EH0&%GGlNV8@q7g`v%g_cTe93(K$}qN72@r0iQDbluO7%+Y zh7MOoX-lroLy~*;a48E!I93bNz9^~B?VNj=VV?TqAexImoa&7SlX%H#n%()uEbyiX z*l8_xT?g;Rb5}aB^E+u`w8s2gG!u^Xyf>QHX z_Nz&Z16@&v)5SVi44Y_j-Y?SRBmw9;zD_+FJ?endy-$RdBKzY1uK*431f?R!xsNSq zBy0Q>F@)D$^dZ=@ee9fI7VNh3N=+_veg**V-qN&(M^N9ZnhZYp4F7-tR&XJGv1PZV zx5B)mpXX&#yn~U=5v2pQ$l_;r_70*+ngs+LYin1xtM#WLR*@fnkOSztZk5-+VJJ1$ zebXw@OO^-jVVqw~jM2DzdXD(-d@RXl!{F%NAl_&ZeSL`Fbqd2n#;eXcSipnpIwf|( zEUkn=3u2~TRUH_Qa6s}s|23)qqjH#;pF0?-1-IBoEu-|y2D&9%Ruz_-WEIw|{vs~i zY|7QX5-QFIG^tE$LiTXNEgfyZ&dfrE2`i;7-lJOZ$qBkGrj1!pu|2x<{2#tiq0HCbxroMPi>z?3zB12QR!QdP zmvlw_kJTmEpM%`R#d&gOR*~?-&@^ml=tf!75H%!4E{qcCq{4tn|J85F1`Zc46lQ-S z`q*EM%}l4Ia5aHQxy{o|+_Q6U71a*-i0Els#3c7M)vjj2DH_Y9- z2mQ@v_h7_bc5$3F%UM#Ij3uzZHEt)iC-&$SGvrP4*T@b{@LITZep_?OmD_xf0MUwr zT_g^X`pb`-zu{vPqxB~8m_MO};IEbqLU-+FU1>7XXP)<*FCZ(m-q|GYrFM0N9f*Bw z0M8dSFqC2_G=gwEEBR!DCFeQrI-vtEn95`Y~ncnpH1kWpVp?qQpNdc_95 zxwI^8B3t2*7&r+pUH`?9_`O$_=?{ukm`3%Ap)ghAS~B>-TT#>M%QMxi_o_UG3>WjS zuim8c4waQx6uhWhC4^-pBvw9ZEn9cgI=K*)(k1G{_4E7R8|!fJV=zOGs)zIhK{r1O+3c&(i}-4mhgSx$5fw1&$7Z+<+0tiic+E|;SNuVVp`uf` zT+W(0zn{g36O^?6MuEZfO(TiWtd@wj=20{$lT>k>k@fA)c=R?#ayDXduzWZs`KKg0=W=1T3|i1McVpqv zo)FLajZA@1c&kMW&tm`Bm!mx!>cLM+%#)2kq$m+OBb;BTA7cbUi}tTY5nluExf7-0 zRxZ3Xxv+_j0P!aYu4EWcP>}V@8F~8W)a@!e9s6;TH`^#bJM_t zm)(sWo4$=p$j)19#QN1{5_+{+-}W<#75ymEio`Eb-j_p*kb00MUW~!zm!zX3RFb;GmE<6e^J?GJMX>fwauw?s`@$E^>r+j zuen}*wp5`$n9V~@{krH27zK2S-3c`gCzbohOJyMcI5;hU2An}t9g9~Nl~1aV!sXG= z@BH8-M)mfNj=k?a3>b<(Eb7nh`fc)57zpJCraDWp8%phRFyKF4FL!(qCnEtIA+Yi0 z&B5l-kI;IpNuCyjg@Sd*vudAEUxp?!=uBxm$ei68wRc4|TOb=T? zg5+#t2H;0?81THqZh&oHS6`e*RH{7_qE*RsFk;3fh+PlS`^UITt90UGjys#hDv+p^h zMo;2X6q+#X`}h z_V^~$-KWFwsWc8eX$|rOhTX0fo3<^VDt(8^M!Gp}7?z422|f>ae_pM$&~_1hW>ZYi zGRuzF{^!+|iz?}QYuiM|$jJCVF1p!x?Dn=L{)b8#YOpTBPm~{QbGVEe))QWB*E+Z- z$Q7VSB1=piYtltvI&14ED5Y0g9N*e@%3XK>E;n zc)1uZQW;~N-=142DNSsaJtiSsqR$VO@0>B_eLH@3bxaD;!4trQks2X+aeqM5r8*~3^KKL&*& z%oXf93m4-Jx-Q^h(V*e>-sa19gt;tb$IT-0!vEYT1!iaDj2|( zEMqbYaJdF-?}74qW?+mn=V!7AG==e=i}g9hN6nUvN0pP^s8Yqj%WrZSrT7)^X!pW7h>(!T5SkPP;&Z|+iFpC{9E$!+ zeoY-cf7Xoa08cda+(m97er$EioA{x7B3su?4cQkS+y_0Cyd;9%E6#q zGE1Nw!k)WQRN;}sV~49~0in+Yp(-cl6TalbLo$Bw$0w6?a@43a0IcSJKibaKbGW(hlfi17ulkGtm>H}cjg1Scg;{Vr#r7vP&t^`oPReaNMfr7+EqXOf z(ZM!-@+e_Np&T*H*)rhzK}|lQoHGR@>5l{q(PY;}NT<#a<;l?DuNl^KKHFpA&C9<5 zKWS+GS~Qq7=)t(Cb4kplvN_|gfzk& z!4Y*a&G$hZnP{2LcR)$WaVg)D2vJfw5{o)W3E%V=ZFNv$q6c>Y(^PJvV=(u3#b692 z#?kRkTmrm@;7a|(1mdtd56O$03u*qy^9hC3QCnh5dOYG2eJd&E;rj{>d4g>rl6}4P zCvG|J;kPSZdaQ=&a*vt%Zd`x~{F$b-?jm!9MJi@?R z!A_5w;$|7?SRV!Jgv=!VV6RX@me-EP`Vx;TG;MPjJlhjVznW$D??y`-I2@gdtsJYrAW{&jslXQ|!%Lbhn z`1qnU0D5lk=7zfr)NMPioWxRQ;oou4op{{oIKJhlD}j(S@j3Uz3!iC7kYSK*4wSvF zfHOr&bJ`}bOr4^}zD6!wOI*0WSM7N}_m?9=ThyoC4>ACXHEZmnU`_lw36{8VBMO#L zw&ADn+*Q2<%$}4zQU(X=^&7XE(cq5M;7$$@)py{VxzdX9fENoV<>~W*uGK2U+YoSkxTy9Jyf)WxC*eY&%?XOP64|Q#l zk2imSlgn&GO(Cn4r2BcHc(Z>)`)uk^U&Ej%NlBl~BPTEai}2Mwa)cTbNu!?58N^;1 zLd!&g;aaPn_{SKc+&68*3&6WgQWuwEIjEBSE2KXzm!VQ7?nUt3r8qfRPAb>>i-3S$ zjlSt3wT8(5c>zrB8U%;gc?qD<+c`GH@y6*kGE~HPg+6MOZv#V~Vt)aMBUT8KR0;rN z4GX+UH>t=eyjwnB0Z-#+_f{vIKiKSVq(zB)Ab~x<47yd^CAR_X8AgIqTia^MWejD5;=CnX@~xj&=OR2;T-H&wA$(IR81(6u`~a}9^mIwC?zR#|?$%$4bvp$di@FBeasWKfRWn^le-mSLmC~)Ll z3z3++5dZ{5#7nVtkT}CzD}ij54Q6dy7CB%r%?lj-mkstvt-l43$*%L>DVwIfjh)y3 zoK^s_=3IG6rS>#3K9~DQ4AKC}L>odmCC$I6=5Vp~*vzz9YKlprr(VibZ_*4naQO0> z$gEg-9%QWFa>adzo!cy%wi-81SCI>j1E2xKDUn005=hDRlNK%eS0|GzDHsP|_lNM| z43c ztV0M>W;48>xa&>p284u3nEIs>2m!=@kfcKzdhvr8W$f?|`aO4rlfS3KEz#SbT)RkD z&xBp8kYF@(c?|F@>*{h6W;1+AC2o5JAk@W7Hp-4!tc6YxL`8tQ%Qo;xt-ik#-X zVDQ{?@Mb9{V$dd!$b=&9*=%;N>A70z#1ncs-$EVdEjDq@$WhKuG^+piBO?cf|30gP zVpHA2Uch_amklb8WrwJV(8mchn6$sbYt-j01vbJVQY>MDxF1F%J-3duvcm?q;sjlC zay$j}xXISU8^#5V-jBd4jgp-h#2Q$8Ju?`mTP1#faB||4@5nD`+q0+{Wx;(sH9BnZ zOR;>fb}%1(dn|w6WcWspP?y^bJtdHA}&eRNzDr1XP8*6t0ri|ZfCH14ssXT^0b3Q zH$=fv;U_9niPr)KTV^1=QAmJ}X7oRd*|#8@YAsMA%Pavr%&x#|P0e)VWc>UMNk&e* zzW6z9b&GqvI2m+aXdV`5PHBniK)<&(A;~-cEXMCmPzLk)sDoaiz=yUsVuEm6%+Z^ydYsZSF(qtGyo<)WYR&nDQ zgT@eXg-eU#yM*Vef6-WA^)_w^_I`Po#h#-8C(Aro9mQ_Shm%UP-|N3w%JF9V{p@@# zbwmC9!UkSKKc;Cz!5@PWICD^8i7G8^i4Qc7Y4Dw`L!RLuC-R%pza||DX)%||%V!%K zc{7#QisiI9F;6BovPIIrc^Vg0p_h4@!g+}2xdVZlW704#z3VmiJOA~AU|T~X6KRcm zvfKc8EZ#3@%>@-$tAy`tgfi7iA!+HO>FVo$)-)Jm?T{@~$}C@%GUtmk$c)Y+kGiRx zw`93ayu}M@G>4&eTeAQDw*QkBYuP)@Rx1<7vBFI!Q5@VqD(9FbrPz=QIt^~gL6R#R z`oXlb^}WHUFxH$xw4pqKv7lL*5Y=-W8o4b;EZlj5d%f@hz9v~(&s1Xi+o|8aUFxCd+5#SnqUc1wfg|oWdj&H>smsh?o*YZf zx_ZW6rnL&CtLg4KBgMQ5AG9Bwn|9HV!Rd4L9@Fii(YOd)Klx_V)E^f)UhxAUD*-uu zuN?36rY~IqX(J;@isK7D;|Yq=;(1NJ@1X6+jJ#u_uT5K8#-=-(so?%s&chFFCIjgQ zoJ~;YtkD=e;{1YVfu2>_+yv z#xz9UP0S^VXG>so`#o#c?Sd4@A6ECay|5rZb&z3#IM zGiF@1o;H)l&v8_zwn6vCwRN?e&tfo)E#fG=LSh$_YCIj_>aG6w-#!8WF)NEAZ?Be* zrM@PH>j-zeHiY}Q;Y^YjcQlQx0>N2g!o89AH0A4-=eB#)g-mARUm;rv#8DnC5hm6g z_^4~Q7+6Xp6c4vqq;sTM!Q4`VKB@W z?0z!&6))b-!X+&GN`<9RHdYY6v-f|h^`%p*bBqaunHT>GxuYCg6^xF=C>@@y^ex$u zeWe54Yh9KS4m%={t4>-$!MLEXP(5>Lhn-NTcKGPRc7mG--REV}?t}NEA)H5w_kVep z(S4T`zyn?Xu!+md5P?O|rwQ)V^PaI0-M-1=2pWs7IB2}YXB4e5JvZ5hZ3>2@H|8i%1Vr%p()W%s%?QVHQ9X)h$meIVlrDYF&X*p1PAKwTTQc*pgwXLY)ay zS{sHG8;+)~4K3%LqFY;C6e(HF%3$Ps&)L*Tu@V>7*DgL}0;L7nhj_Rp)u>?p=CwG* zp9fZhR{YnV>jbie?VmUaE%A4B9%SBTeH11Df+QVfu{8Ml2v##^$3>@x{Q9= z?|WN$$uWKRqy{}si7lO7lRr9+7UexLtBJoPy#66t*?IRjP4PP_7>083=n76@}GOw)nVy|6!hq<%svm$?)%lC(%8Zpc&U?^BfeSeBk(M1M5p)Q#=lKQ082mh7t6u5SaRW? zOqS$R^&uh1*w|k=sh+i)M>ZwY#tFm%i`yAw_Kc-@n}K}-1J4UttK5i>Nwx73 ze4epbCQ-vfVo4*xEMFK};kOMascwA~5z#v_lqQhPvx$+C)~a11a80)r1Mla_mpuQS ztlOTU416o8Td^rAZW1q841;jtKW22azBY7Rq;2V;19dk__2p<&0n!& zq&Crze<@>)+ zy+rOjw;;<_`pX!MA3!bE#pnN3E+$9+*p@;a5cmEL?xs8dB3P2()1q@kQLuyv=ApIY9#N-L zgYl0D6}(6aecDg|yhLJ_#k~@(sco8it<*3#t2hP3U5F5#xf9gs5){^0i^_*Bk~-*6 z$r(WlIuyyE&A(jE1kB5L`(Lh{54{|>iKh->KF*iZfJ=^ttoN5Z9tjaYFvE-J*uQ@< z)oea*wgICvNsMCC{4oWTT1*l6vX3{Y* z$L#e*p#I%EAC(QAQ$7~GxxOT2{1OLNiby^%ZQ+W09N73_5euz&yZ>`iWWj$OMjl41 zQ+dutW}dj_G5M|K1kA0vv1os)uQW+A>0wY5I<_HFrdc7oZ-~d1#^~58LX(Hu5Ps}& z0%jXci>a_+g-5ZAAdFgSB50)BJ2_A`C0iqHEZoJAxFqP+kz8_ZGP$2f`IxNz>mgnJ zp9V|G&F|BRP@Q};3QL&t5wu}LW|pO=JmrzY5fsw4s>{gu*Lp%+@`saEH&)Gm4#y{* z9DncyR=&4LGoZnK7IF|-#pEwltJq7-#{Zh7ys%SB+0vA8A~QCyGnJGQc~33rJ@uAI zp%>fWY{k^3j?Pl3%F(xz4A+nSDykY5zeMpMb2dDQbOn_Tn7zGv_@c?H+}XQiBi>0Q zaB)dV^mfrr$R&u_(MnoT6T^Oiv$recVqzp_BdeG0c8aPpJ)K|2W=o9ED@Jw{jxnOW z0KK?<6p5(K%e@}jyk7$A-cIVS?t3q>)FfUmYWU|Me8eOqsJoAOuVjB_V$U^LWKAaq zu)DAH@Q*YKt-k18umJhKGDYawL?Bw+XpC}2H{eH)QJG9-RT2$zIc{-w=SHv;&Yg$> z4ZQ6hKt^SIottHWH0a7=R+|vAfLySKV)3P)`%%~P=Q@wxw}(r4$a#-ELH*met`Z0G zE8dcE?)WT})KyNj8NI2AN1>+2?5(LZ56_vyLu6(%AGbkAu4~02r!n82qFR>^Z=(iZ z$Hri;Jc3(kT0Nx+U~3?DeSKZ)KYj`iri+S@wC~@&Mtf_yoRm{b$0f&dD5-o3wp(*~ zacild7=e{+mcm)LeoHPK~UK&!QP<)B_%K{IXj$GXT|eq z-XhC<0vq7F%67=C$ea;IszbQ$v?0Cn=$z+0P&?!j0lQIKLM{ifN6^iD_>72^)gEQ7 zz5P9(YSqHJS+SL;Z`3rm>6JBH6I034$L#-@!iD?&6ffEv;YRS#f#i_q-G}{T_R-%S zP9aXg@QH%B*cIGYjW`;=c*?H@dzXioSugfX6h6tvF!xf^%DLK2M=BqyFgrOZHYYiRdF( z;?AvS;In|%-9I@3T)0j4CdY9j5kze&Ehd=~&YP&wdBtpzP|k>Vs&{_{*LECoN`D%x za&!9Nz1ugz-Ex|+MRJVexoaT!I%et*a69+6#sDQt?6pR^ljv`bSqM!B?dlVQUeHVn z%p-pF9~WyMQ1B2&U~DPmhse2`9z1HI==p~~;~L_0zwZ!CRUdC| zl56j>>K3p@$r+N+mL?DhCL!l54z(Pn7MUc^% zRpRq?5pu{SH#LPR$-ld{oV;3-r{m&&9w=7Mcbc`2H*~ATq|oh|TUj4t1S0Qken~l3 z5z_M}+YKwV=QQwRQeb9SVouui`Q~SM<}U~{bD+Crr4pz1g|U!@bHu}qNne^cGRCO`c~f7Ph&{ms6JQ(%>Z6A+kGw`ze+sg zyaNKjc`pQw^GgtUJ`*6+@TG0%)i^f*YRLBAebzDF4kJn!7PqXQC;(>J#B<|iI65(Tfy?6Dz(>`O+3Vh@*1=S%7{cR_Y(GENT2-uhgobz_0%Z)bPE(e7jRT} zobNRbLfxL2D3X8k4|Yw1FU(Ra>nZt)aupm0B@wMGWIDR@yOFmRg8qqTBouF=)&@V$pI1L1oWST}n{e;p6em z)6aaWT)k^0lA+EVIfj$}260_ZWIjl;k^#~Y4>x}tM!z5;uwq%$C4!lTVMYQEVL4&b zi9y7$j|JzO>qEj^hcb2m&YzET^L~P_HYB;_c$VTrjWVDZ7NhfHlD=_{m!*KoXNmV~ zmlpkPukM$-w#Sg2C-%1~mp2B9ham|%MeR6=hh3tPPf4M+0Z(QBD^Fx+zvorgo`%d8 zN~bd!&q-|NqVnQ!Sf-{Yh%9Vs-aYCQOR@}vlBLAWA%tt17=rD;YybYCgfIJ9cVx*Y z3mn_CKr<$WJr;igbgA+1_Yr?r*mHYMl8^VTGc#T3MY=*2QCUjvv_g|`<+y?y12l1-B0Tro_9qDQ+f`h+vmQZskI&|4RayZ;qUDH6>pYW3WvQ%^&M z0cK4wvx`sbJt@k-Lk;(l^(vx5M zS5ZCZOfrZ`I0*~&<%)qO{kxDvyW(h7azZ+n3+O@+P#U4*7i^8{xuO6ra(ke89xGmG$#N#l0z^&aGhm|Ai{+8;R@4$9n1l$%*@YIM(In*2 zQ2nAq+n7?$ZV|U9dV;Wo<$p8ecJ>=5b*Qg6@bFRkNbjsWu$(p;8T6$0nvYEg0T31@ z7iLpEMuAV`T03G*(cnkzPEMEWIs&wR>4!JAa=0%!wWa^}Adk+7CQfpzNpR^-Fzvw5j`TOMkb^uM`JPqX+lBV*#)C@44>~i5HYs4wIWa zmt66K!w88RMQX-eccy@r=4;ql^O@L30LZkW9Xo+IhOEOr4aJS#It7Fdwb8q zinOAZz?PN$)Ema8*FCLrIKKOEf8py=mVF;a40d!HnQ*n{PgzWdW*DgBPNu2e0z&V# zoHJCeAG2?xNj!|l4i2pQG@}apLxsQT0_GxG>6Kw&3uar}GNz2nn>C)=6$hgOro`Zp zZ-3HiVV0_KIEVh4uok2LK*sG^6pk0b#Q87NdsP}co0~VXL4sBnF|Kj1&hkWdTd+8u zH5n}b=VVxG+I^7)|AfUjD5eiJ^lOt^C0=6IQo0K=@ppF*LFM|j(xW2%K<c|fh zmJ=_!i<1Q@3!6Nk=oNIW_CXuea!qU1rYql?E>)@|#a#pO24!l4Zt#dS|8Z%DjRvUN z#R7`E2?*o41i3l`0Eo|}9qi9E?C1G*ma~bdxoX`jZ2UMe2u2U-b0;A)ZK` zkIhijhhGeFxUW6i0-+Z%L%oS3|>4PLj*p}!VoS+G~TksT_R8$n^ zn8;%8;MB9k`|RfNUHbo1Osr)Jm2unNxWJZH}#d#RMYBa*uo5t<93*2=;uSf_9^*t+oybQ%z}t?QQ_= zi)%i|G@0qJDAUA@*GAexkqIDs%Oof{UF8A?MHceDP_%NlXy1W3E2{5i$5&<}Y|BEWw(GLN(nBlY2*!8V(X zne|?_Fx4i$_vJvh`gqQ=`(e55A!O%8wf9k^Z|Lj_pJD<~Rt9|34M;J4YkN-}3plN# z$`%n3D$uJjc@#wtXa_|sO4h{reP1oI^){{BeD7b3<$c_H#>4t4qk|NF1C?ngb`9R( zR(ENS7YS1t8zajmaTaUc1BnhV`N$2(4xMq>y)dm>N9@i#?^_1o$Wr^0J z(Po?#-uvorr23&FdESC?s-pmfu!GOli_eY-J#i{qQgI!Fu`ZFSpbg9e@drH+mn~01IBjz}QL_62MvIh$NI_JkuuQ+><~rAh#Ot;^ktIUaDg_yWl96tfc&; z)5VE4JA@AK3*Twlsb9pmbrB+y5@fd!rl(1f?)M*R`a`8WJn6MpvevepqPFQ*rr)kj zdzl2HDWa(qTVGs=|IZ5`UD4~Jc~fqYeT)mmu}r6;alb*fb9$X%1fFN@{5{I~L9N37 z6CD!&wiHm<*?ILjdiie?ndxJS>7K*R!)OmW%2A43Op2`CiTKZNDy(sI2mx7#L{c{= z$7hEdm|_&(f0PA>4Z6bAUBD{$`hOz2<1XKK1au#8Ogr8MVr5ca?vfB`X>jOC#; zG0KLY-xJZyBU$Wf0Y?6JfYU8+dd{#bRygH;O! zd{o}R|MAWYS5LcSTC%+DGGKYou~2@bHsOVotS!M^*_q*;ojfyJqf?6dWiZUe>XUc{ zlVPHJQ?N@aE8rH)x3nk7{`HSyDcN6QK*uDW1cL>uMK8}H*Iu>QvB|VtAaC&n7V|_q zDJ{4H(s|&NmC73DVBN^;q}!Ik-u}2n_PF|V&2aPY_?|Es7_x5`MLW9hWKmvKylA%@ z6Hhs^*S=3lZja-~)gfnnf!ON*fw3(g?n3jcf;VZ~&ZlLAkArYmdOyx9ne{R?T+1kd zQA^GIJJlDz6s*crxzLWf0ylGV?<%eR4is(_Q2s)jwvceF)pz$w#%K8-+Oz~#o3yI* z%Wa7~?jM$tCScNJC*WV_=U(q;VU;iVS~^slMQg5qx!!iGoHZli}`qDWWyb{x;F5XwW{(c`c>D32nHX`J^oZ zF?yRejMcmRi`tg$=Z_zGk!v`HUx*|2W?g&V|5V`05A^nUq=J!k+$|qZHS%i9-1Nx` zy%#km10@Vh*eHFs5d$^%<&|bBvB-PUDCwmG`aS?cj|H7MpC?I9 zEM}K0px26X%lo-?-&iQv=LO=v&}pj45W-b)C8%|6_nr13PR=={|J1 zeK*;D*oWadKK5saaMMWH-h0D3&RW36@l6RY9B(PBJ3*T26+V9o0o9{jXtni8RjF(* z1C~MtCl!v1MkCq+4%U3vd@6L*HZC4JOQSCPV9!L5``p#HljM9ohm3Ef;QB?Zv30=Rk-AwyxnK1%6q;3>bOH?2^`FljiW5S_&DtFguJ^-kPa+*xft@h` zJQ|Y7el9L^2S^7xE>KT07IzEz%Yp6gvA>D(nFvguGYy}~^xVU@g5(jr6AXpZJt>*@ zG8dk#zLEs?Q6q{SKi$SrGMjmS$9-7dgvf%h&!pU}SMQJUtyli+Q-vHGAhU&z8L0U{ zL4H#n`V%imM;&X7t`qq`-om>o*id9ls6dF3Gc6J_!?5fQ^YB!I3L zsqo!l$r%4^qKSYfgkD@p?^H|BYN%^wVy5?>~*b%vGSerinir{@d)taK;gpW z+gm}9%?8nxusB<1zOHpKIb1oIC6sII7ve|A-IZ&t)+njwYTAh%E0q|-`eMcz`rn48#yKJcBAX=RsSZO@&vtsefq{(0N&1;&;EVjUj~(5_Q{i+ za4a+;aZ|+nbBl1DGR4PKH%aCon>bi*;Enp8Ajh1z)I9tB2Q1u<1MfBX1~BL#n{ENQ z1CB>lPoDr2O=hINQ9in7XC3QDoS>ecZl+?;gaI-!M@RdD@}gFD@mW{NB6-d~^0~GZ z6E|&-QG9C^e8G5Xd9rC7I%rulAmr*Dy@-QDAC48T2oXb}-#yhcx3-TFbCxlBAcy0Q z_^QWQxAo4aAE8mer@q1kK=}7#d{2T=f8MXH54i^?A3q|W5{^SJe@MpN>A1(h^~FxZ zDhg9c^tK{zQuiZGnpJvNAO0SYz2l@9Dg3P^hAjnMGq{@FhZ~zno?k#3r zA~5hio5WIYclY-p{KQr#9nT}?e-ioAbCxQp_NC37*;NkzMfGMQ?A5a@U{Ko>?Qde@ z(n@tkUBb^tX5duCX;}XWe2u-O->>b1_wqSqbhF`U9sQM)$+f95K{rr>Yv>NWh8pse zCe~ampqs{Wa5SNPn*@`$mYhS}JTe3d%M@0d93}VTiO@kRD-zO54!j_W(vALpT`cz( zr8a&I7yG(!(u<;DEQ85KInJn?pd@J0!X5Jm*eNU6G(auyu1y!p3Z#T2%%Yu-)e(?YvdAyp-X(5O zX^Ehj?gg*vTXUg(11qQDG4Gl=S8&8@)+Y48%VX^<*dPlEwo;jh{n9nD4+Px**n@vp zecP0uAJ8Rn8WX3mCD4+2a0)t$w^S6#$HYwLpiboP^m?WaGYfjUE9K++?#$42){QCk zu!ad~yQ0Y|>G!&{^m8M^)UL<4w&SUlY$-CCQRk}sq?P?nGQ zD|dTuQ6}{kYfgz1Ps^S0l9tyPGWP?brNk5yT=6>YqcyrIu%#N+n|8t{`T(=H_3s`oU7z$m11eR6W32L@5^CuY zxU=p!CDQSSdH9Ib1OlymG_`qigj5GacEq??OKMVKC|TJwW#X%5WBZ;Nm7}N^hjkK1vG5vqy8Bg04v{N*^ zzX!G8WK6|gL^7~RlF=x)Bm`Ki+Z$px2tXjK53wD`H7(7rYRop);KWM@N9OnUtB*_k zCYwKi(ZugQ_t>v@J@j$#DYmhUUq+(mXXqJ+BNd>iEsDUrKd8C~Jr2m;sx*7isUMah zpl)Q1BDlt16y!*e;)E-Hwklyn=R61$*+1v2sGvf0oA-_t(bj3}?Pd;BgfV|?TGsCF z01r>ziJR<*&QvwA;lO#`u~M&X?}UZ1*qJR2f|TItsj#JV=qrxpeLtU#zkghvZ)b8{ zT}(4DW9n17yLSu@28l%cpfsxCu&%fiPwBTo--po41T}jp7?MZ_<{;gz1>eG6JG_Jz zmyU$CD7KghM!Z5Uj|KBhQAJEo>q|+?sx&REIT`3?he5+>lY=+w``=;qQ?wb?ldk-4 zpnX@@&1PDQr{ETK=--Vig@pJ^ zGF1dn1%NSSYnV((Zs@g9$&a$a4O18*@zh`|iTlWW>Gyq$>xN8{t&0e)rOH<{J;T|f zv4*zf5~oRQ_iI46msR+RTUBD=T3vUCcSslAw0P2Yslou#VX}`Et37GQA)k+Gj!#z@o&@||KWOM=P9U!r zEFbOf6GN|wWV3qE{kMAGR|-buto(^0^!LRTX79t8u zdvaK+O?3ihsPcSwY6#k6^V20#f9P1QUwbSsC3_KMp9a4ndg=U@8}d(lafWo)1?#2y zq*7Ofc3X5u`RQ83GsjzcB6?ZnrgG@V@wj8D34#2H@A=OIxfiK`v@RgFr?yO|($LS$ zps$%H4tB&=)NmC}#$%V9oE)6Dd3F!^yw;EB{Er-6Cpfu}N=O~CCn4k-Kjj#?Y1#xm zc$+Z~#unn1$t+OioG-vb{OQRF1~hlPij85ez2}U=peB9YNpVLXT23?xmBK2 zDRvWb_!%%2$ zyTxMbI@r4Uv-oPqlk9}Xk}pH=g#8!3f#yyz*})iwps;x7M7taodi(3$i6?@ic_R(&cfi;bPubxBC#XH)1)=G^(v76{HF3>)w{#{BC;rCit?e@S+hj3DF-L)P zuzFxpd_mtcY0-GlXUI z?N|Y0CA_nsgpT*?0sC>XuHf#PsVM{Uq?I5txBI^nOzSqQKa?eMH+EK}zlaU=-yIii zxn~*Oq@|GstckVuG z=NB63FJnvKFL_tH5`81j!O5zW%VGQSy5#!)=?r^^wI@P_p|HYK$c$BtJ{j?bXh}Hi zQ0Fc7V(VqRv>NH(_P{w``cGx2Vo3sduY;x=vS<+t8A%4})**heQ+^2z;5^R*|AE9c ziOQhWKf>_Zixx7pFR#B*B`fcU^-W$$|0hFFZ!MLLfWqGR#J9e;qLadZDddB!pVjNY z!%|C{2FDBz0ySZ;OkN+nvrpp$>1L&2kJD)q4wx%~l^TR!BvVhklNtL{!+3O;XOz)U zQmBQ-KhX3dWtC(4d(2k!X$ao&@WxJSQWBZHUF;qZ0df9L3)WW-R_wZd=Q#e~H$<%a z%LzgGVvoup&ZzY4Dz(xIkSW1QIC(4c>KXdiwL+oGr~=*y0*F!U*Z3fK7k%nE-hbvRBLrBEs;zh~ zw5y*fe&zdZ(oY)aNCzdT5XtnV&FF8XksNh|P!wm9qB4oeCDlQNO#O43_d32;3P~+!VTYV zrh7?NfPq#RySD74o?`dU*2^_sH_ImE4wp;MeWYiRzOmsCnbH}vZX^^Q^egpUyqjP? zOPs9`!K+duYjvy{uCm_KcF${Um4P)NUJMKZaz9N!;!^KJNL)RewLJW|0sNN1wxal` z0xexYXMor>k)=BJ&AqR>9CgI0H;7E>F@(-^PX3aN>(vr!3CWM6me2OD{ER=4rp= zk;%E^XBFfjq|19bHtiQRApRp5BoDUQ(KRPGS)$BZ_#Dx?O9dKE4mglux~tt(`qVXu zxUkr}<0}=C-Fx`L_X~;oB*@P`;3p(!E^K7+VrrJxWx$PBLWx4zCqdib7>id zQqIsxm zXQGe%?IOt3(a@+g8stnyNbWORSOEjqEpJgMHTWHlv?q13?;gv98yZ3LwrxYIUtdVnGj;#w}8uluG3+v)as1?}Y8MG6L z(FbX+BAnFA=eW^WS?i1bYGsuGISk4^oJ!K}C0-JZ_DoUSxM*>==2QZon- zcK{G`smlkNZ&cBDwF0vhqZ8soqiXkcJcT>-(gT})?nDC645oFKwi}g3c=MDP8~&CR zI4}=Wy`mZXLJwI>HO9;FqS_WGBqI8+gj0a4p117R0OjWoNoB}y=i;e6y#aM{t0;Z~ zGI|C`%G<7iaoRYwCIZI zTAJAC)mLb>pXDh@5H}l4R1}L{_-;Zi(gLiMhxVohNfwRT%Dr@fc+>eX0qv*{yCS#v zQ6g#8p=S-7N$gM}T=nk5Y!2+qT2;5!1aNIMcMR?w5G=SvOXlDG_41Mw1SA4;^KldS8t(M#vDX6(nXjA%1H-N>08VhtLBE05E$;S~r+JzVG2d&Sm=i-hSDI_32!;%F{k zKd(rX8|$xwlVnKdAqsPn|GMde=cR(-n@uY{yGw4Xe!Yrn@~CUjzzwP+M)vmCYM&?o zhZMbN43u|fmMUN3y#fz>d~^G&BsFrfHWgFtgN+@Bp zUaFhxHI6FzPf3s_G3Y^Snk>G#b}8D-1m<`p2ALx=R#N&Zu27xp)zPen-toNgUA_K9 zskHceDSDP9=8G|6rq@Kuc;z?Wt ziF^#cxoh~K@_i@;#qL;hVjk~6{V(u}ljY{Ma%n;(Eyft`r$ry@8YE}#XLRsiJA#Qr zG@|O3VN^Z}6}(Cdvd+v;E_AopT3n~9%=|1q_e07e`les1vnr<-y~*xh5Oar&`Ta%l$SBs)K*pAaQ zd}f^R-;Q}qVWqBnFfQ0&Q3Z}hm^Kw_^*dO*{)KMjw4`tBQw7gdJ#SQppS~D{vj-S) zED_Fd?gcyvh7Xq%KUvN}MQOqN4HHvTnz@=P#>(k}=;pt?CHjYl@n)hgq(@rW{XT$o zJ0cZqC4;TNi1mRqJOEpo9TmPUQCRimcZ&2&?{O~JHSLn{_K9fa!8;m__mRohr%KBF zYQCxvL6wCNJ}sURzJ!8OG}U$M+LOGP;s0qH=dsWx;<61fVmR@kRamFXe-%!Jp7A>< zo$3-Tzo!mnhsvGYbA`B7|6P$!{j1JImmJrSUY?FE>WVobh3M8oGzP>a`ful#=63vePP1m<=zXGuYT}&{Gd&s$%fue zJW|uY^m`@ZO_i5gqs>XMBo(iNj~`&q5Ec3Dt-k<*8IJ@Oo^dYx%1?x^W}=5k!TYW8 zz@1dh=Z3;6T0Zyy=y=~C_}IRSjPLeg{myTpC3wZxZ3E93X8pKm=P8@S-1d08@3=(4 z#*!MKMT*=MaK)hD|DS@zSZmU^Ex5@!{FAKJ&Am za7SF|x|}}=d>KdbtA&^BPr8UWmVsueFtEcWjXg3D|E?BCNPYjF0)Y!@c(Z?%3%1Uq zKP{X+&Ae0a$5Ek^pG_S)e7H5--M$E*GxH9?_Ir?`~AehvsyIJd=ot_3)%aSV6AB={#{gX&A(OJJuT}lVQq>&~$B{~Cs zYvK2-n*y)FBtHb#def~Yy11gCNr)mxmF`_JWxzp?%}x)GXV%MsOnex)u11Vi2;cy& zG32Zdme5*C$;$y+e0A7-iPGwoJH@0rOZGb|O%=yhoLS=wAEY#wF&VQ}d4q+&I<1E- zLD?@HK)oMR0(C!|HKk%;SoI?dN!PWo*r4rvy1Nd2Je3`IX8F`gdBFTP%AXN}Si|+g z-k^@6S908r&Kr_ZBI7Cz9)XTMj~rpS(5W1uHt(MixsH$>?3hsacv&c37`*A%2Y+!o}A5

xv-_s}nfb$Ii)9H&S4%yNTk^j?G4kCuP_F>H3yY2cMW z4lQbu7Pun5WbdCH5E$qZ_Zb`im5}Z~JryXcRm}V9KF&n1Ns>GeJ75cT)tKdv`FmT* zGVn1r_1FZKzAwxcc1LfVv3{}@8JS!3C5(OPI*HLd2ip>tmEzy^yV zSDF!2H3!g+fAjRdYrpcxd1m!LEMR8{I4PucD(fjN>{)QM>zA#yYbqU6vAV6&Le`Hy zNo&7G3VzTu&oXOx^*QaqKC;SUYgns(Pp(PYvk%b0kSRx!6tj50B<)BAg^1a}-)BXS zV_p%6PZTyNk1lHkrlgK5vn-~B%h*oDGGv@_=A4tn*6XD!41bB8Hqp@8L9?giR6@M8 z4dNxP-Yz5ypyQwK@p|w`Qh;GU|8;3aGl|1b;^Q~7h$$8D^N^e6SVhEi!oOpbNT%!G z0l{Xk!t3|Tiz2RM=zSBnf}5vJ9Z^px%X|F$T|hY@W49Kj2UgN?ZXypWXIdylFcM(5 z`w1Xw@y{WuEF|ArD&cgW`;&x7S}7^-*QGgPg%S~dxbY~wUGsBZMlVT4h>Gcd5@eJO>y z7^h26X8H5^bMKpou){L4tm8=UFrv6h&QS-3Mu>Uiem{u+Q)b47kZddpFbU2v8Xn^W} zFXn5X8KHUiSS|MQeTjrYTUNDjz%akfIDts-5uh}iCGd01!Xd$V7+zo@p05$XVNVi} zmHI0Gr%bM4v0x?rjU0m#zsGBkIcL4n$4aN6I$cm&uR?;u%XFW_ymQf6lRh3DN#vwy z+3=|~pUb(twWPx^3!5>HV`3h5^`90ow50viugg(rn2`e<>iV*l7}7)^Dd0=AMjr#u zgO92`yxwcfW7=6O>u#Ac#C~I=hZ}V?)|HOZjBs{wHbbK~0vplLRjZXgs!1nzmG%bd z>4W{wmX9~i+EJ6j&j$tvhmc+-d~&YyD%6(&iO($WXgY2`Rjp}vo{>uhKRx97)bjbV zc)63)%I$PNkGj|C9yv|rTReSq7yk1BniCz`srMb~Q{088va=qUH=PU%f~X@6{Iu@U zlXC7_kBJ5+(|#WP6s5kCvJlu}ecSGqnDz89JN3|U_+20aTT5H}`^~&_6k)+VwwIqc za;-JVla2SXjf8u_DRJ&-Ss}+>@u1mkb7Pkct{JDQ0u^CP&=vclX_c-}V^O$EQ#x-I z5)`W)vX=(s`wSJ|T@`s=JB54Wm!J$6ruL_JpApfk0AXOTZ8z~(vb&={zkwKMAa*74 z15;Ac>=BuR0_k2@Z;t}=HN?cEE__&mr>*KtbX^Ixy=j!bBn&!cn#+w#W@-V5n9i)Q z1X4$ELz5!MBXUc9qM;L)k*91 zkW-DZ3355C-V+cLQgv#E!j}Wnm#W2`n5H8huMs~P4`%9Ow!yyVW9P2f*cLh%Q5ku! zc>_xbPt83Ic3tj-GVt{du0o*>&JejD&K=~a__WA`&o!#<@@soAYj*m~L$4}Ca7u=TJ zO;6LIJ+}vAvilwGT06@_RG?U55M2Pn-6HLfN78d%CN%6ui!lSdhulE4yxmMu@c0}$ z<`$i$@4bpz?W$0^_w;%Dh(J#ETMv3_1j19FjT!bTA@yys+1;z|>${%!eoHkqASAKD zzAyo)Beq!Gek1;fs<;Zz^tg3{nT>x4ArcoiWxEAw!M#MGxy0N^vqM@5-AgtF0F%zFPhy#?b=gSKzO&Yu zsHTElT14NE`W_2U3zfWKq-1&j-dSonjAF!ub2a`M8YnCkg+{J9j%;pjepLp3u}DD| zlWfO=LNg(jti@9AtJO}!+O|QTYc!Gx20@i_tj;#j&65LMpNm-xo8 z@MaD?#y@iKltlK?wL)AiG%{uvdvk6Zxwjq%aaQPSXECyUbAYgXfaq~4w0HlwEkgVL zeq!@#$!!zBpzY4ZUD>6$Bhf)M@5d)R9#;adR~Q~hR-Wo)dyCwH@#CKneduVaVw~px zYASJkg^1~go1#nhH`UfC?HY-I<)fGbO-c*wBE<{WrH3C5@OPsIiIVZ#D}o0jS8von z*639$qX7mJ{xiYm#Y2?=4hsE2S5V-h%P zOp*iYde^?vsusOSAQf_kWp8jZi<3nnUo)#(uUxnA3ME}O`h2gSrf3Q`-|w70E0xgRje^8Fyevor6JwX zfWItkvk_F2am;1SrxzdAyNm@1$wQQ&qJ6Ty!+l9-2WWt5e^cPa3%>8UUQ0d7B>!S! z#3ZEp0@{_Ah5DMMiJ^Ht_6^Kfc`PM|r!LVm0g09Sz)lIK7EA?76-%L4E9m2l`T~V& z36=5G9dt!dXo6wY9QZeGrFbL@x8}hwyt%>hYYRL2u)}}u$%B13?F-k1MtG}m`+Dr}E-GLpRg7CnO~&3T$~#)Ikx43>_n zj8$8(Qr`rHQsmAL*o9AG>we=K6{*F-u868oI@#;^&MwQxb%u?L!zPcjVQm{v@A~JI z2Mb2#=C+p?oZ~=Rh{NhF#mJ~ez$$uOUBj%X7=(}k{v1mkGKl7AE-AHSXqEpvg{eo@ zg_?w(<-Eb|nqRVU#MRQ#0os>7%imqoi@ecIq$I!M`{AAE+y0h(wsrV28phHVlkC}n z@DR7_Y zGAcN-n*${H50mYg+78?Ncws2^lIV1K^LPz#4$tE=NAxyX^unr^`vZZ&(zo-$yk48@ z%_w=g-WQMO%1b`YZOsKR>~Ll7s7*;<9kuL_wTc*w>mjf7cv==*9D5~WEXqeusnSlr z3@K;c7;{GHLRbW&U!fU90Y6B3Jr8<^_(Cbu!ZSJ)mB36S0fmQ`I)+oS86HMQd5eWk zPsM)0S)|B5$DSSU?(W{gS#;c*hNPWh?VYlTKyH5z=wNs1L0fJXQ?olbDJTqK&Itog zs1{NYt{#-JM?|B$c+_7v&ni+b=lN0MiAnb)wVqn@B~mUeFa+&WiRzc<@_Ugv4S9>o z@-7*?p)HifjX5wnS~>GMCLAfNuS8fsjUJ<)e~)YzcrsqSL#AkbOXaJZ-Pm|Qd7MTt ztSzbgQ(!N67osH!$Ux@3zKmksIjs(WRh!D$GFPn)o(wFaC&kex0%*rcYCW$}{N=UD z2nm81Z$x3L7tYErogKg8hzF3nn1$hxWv2eEK;nK|e6p>XXy~1%YH#(v*MznuPWAS7 zV5LgYhfMAdM{;(npG(s2`lFrAX<$>5d)cW20$T5v<$J$=wn3;>Dw^H@dZ&Q#2|L{o zls1Lylm#e%bQSouUNPk6Fw!RKh&&gu|M-j{Bz9(-^jC?z`5UT!>LdD9<*!1mtr2mg ze=1d^sMilW&%}+EtQ(9GP|?ydQgx>Z+zO$YxeLvR5@_kaULCi5TXyg#tlGZMwzffz z6`PX<`ijWH^q#3HlCx8)>{?b_5$+5iUKR0mKM=ex+}(OdA05@b{L{Bx$+WIkXn^sT zR~R}quR>2dstEjBY#_%})%RY8CroG*-B!mySm2{CfYIEYtmuYt&?Z_XAc)iZZqc{K ztY5Gjd?u2;U*xy6T_Gow~J{m5yX1&?7!uTNux5c1wSN*nb zmYu|`2SgjNG0y!V_)n|(p&s`!$r$f7Wcp|KY`AmOZrFquWGBKzGNe0VVg?;ofKKCZ0>%e&?B`xLGw z?Dgf@I0m|Yu#sxwFX0>F1XGc@^Z{cHRKSnF1zVt?PV3@qq?lSPJevH+pHD-v%_}NmV_yxfDwdk!GV+;z1uyBzLf&`G z)`ahhbuwZI+9)4JGwmc{zZ-LW@k=Q`(W^9Tfcp);m0&iLnpe7gVu!QNTVaXflr8ZM zRwgh#QYw;d$vw|mC_k`1yN+T&&sA@vRQ8uebQr-`5sq;|V7nW#SHvvCp1M{@X~IX# zGlz%gYcpuzG3o zTj#5=?h$=Yv%5V{p#6r+UL-`v*-pY+_k_My_#q16%YH+Y zwmz4LoLLUa8PVq4e%_h?r)Gj|@doeHF9Xms(|#7FdI#_)KMlrBZj4xYMb0S6*EZKH z3)D0Jcs^T9V!WDbY+jqp*urP6cXxLW+xCnD-ZpSWSb_@6>p|N$z{-uEgzs#YeNZ9LsFDL$m1*G4#$0(v|TV4d~%6i z;`bY&%oI`>MS7L-i_a_BsZ7>0@LucS)gnw{uQ~mX;Y|kuW(^(+h|ikrXt+5#_@mv7 zZPSgs-eKx#Hxp+NxR<@OLJuNc6vM3gpPdmg1|Mx=X$)!8BO!Kb%FkOFh57d)6XRn_ zwa)`Xbs@cISeF_6n~Z;;gX;6MF~yk4gP8nSf4f-JNCT44UrV|0@>=A*g#&<%#=Mbotl44zdS7 zKPP(pnwX7-(Ib$PjEs6y9A9@++}nE>&Q*Fx4}2+fNNOIpNFcar%U??zbhKcTAeX8) z<*@1lR<_|@6)*b^ux!mGmCy)iy>So)Ib(3<6d2H)}Uw0M_}; zwgHtF%-zs;>wKPD(kIl;tDz5eF7i-Aw%#Lq6wo7$;$m zA;dJTiHN`iLj1>Of|DkSiEnh$^<>(K^?ECfl#npQ zfT!IiDcCGHD(3z7hl;Z-dFrDmezMs|PX}K?-qi3mPGg!ArOB0Avo5iCg@h zJzRpP=Ov?@iD!qxo;v%pXTaG)zvve1H@_Ws!6|w^>FYQ`+c-=$-tVAi`c@&fJEMh?1rNbf6k^nUsIl5He6YnA441`u1(;oBkW~ zn9FwxASL}KJu##gTchofSPB|^lS(BfrdnM$k(k@F2%J8%L%Y%C{?i7q`Qz zk)YNw@ZT*a(~x{IV~Uq`eRWXCsk{OcjnaQ8lPF#jbeR~o7Pe-Gc*SX<|K} zJnI*7mHSb+jV;ytWlt!)|AJc*PrTw*W9U~C(^b*T=0Bt6eceRq5WneGP@3dZDh5V( z|Mu-We5W__ed+TV+Iq;^<2F)`oow4sy!-f~;uK*wvd4d0Ry|3Vxj+Kj)0~9bT2RX= zA4mKR{QX_HBp&m3&XiR^Rwt1CtJ4lHd;2ym$ z4O5cvhFExnoUvhP7LKcS@JHqf&bbod#X`p8A1p^Nd;5#gq6~BWILjd}VCw+)S3J0S z$PLKrR6jl{M!ursR@Wbx#VHQdQ>$2!g&@|y(xZah0@W!Qw}AiKNxG(qO>^tF&~nX2 z&}V}iUDJz9jz>F~Y|(OI z!1wZsGxw=8s`q`NYK+BeM*>2m%1Q+QenjXDpCk)KM(W8#2G5w%j{m#~*F#~`bJH@% zF~3%3d84#0K80o#;1|m?!5K1c^>LCL_s0nS`(YRK9ca&?q%X0Prc$nXOj#w9HD^E3 zq_KvMxgp3eb8pi1MA6kA zfGWD()%P}!(VQ;O2c<<|vifUX%FdFWqxHH}Kyw!oKoXdQF999huXh(_!P=UGMsXjp z|J&-i?LY;;`^wwnC~|HwyCPC-ndH{)`T9=SjRZ~k5t{rCb z+_4z(rmx~T4`7)ewv&noms>S09V$4YfokSz`Ao#?lE~)lw^qm@gnv&BAr)9T?8I)~ z*CbBCi9fsRrkC{XbYT}}^xFJ3tE|fiSuA)EvlJZ_)EgS}uCA+`$NY$kdPS_^r>^5k zdK5X^=c6L&{w;uJUMb(7FFNt7w@_i?n01Q@8hP77A2;bc4-%ATXI8JTwY4+UvBAcU z3R5-RYlR!sPDygMfrwN;pti67#v9If5iM_(Pe}~oPQJy=yZOry;XrPF{j?u)kJ>58 zlSX;*T<^<-lEe26l7C>`8{GWP&f&YK^fMeLn2X(Fj+sOSGmW}i#1P=D-#nn)uJ3i- z;-tmxAkeqm^?Ieq#!pkm8R+WP9{#)gq-Rotc7lkFq1J)vZ`u#NOlrWsAl?-rCCEhp z`cP`#1k&imXUCs}0HB0zH5R9f=&TZ($_|(3dMFv#5mU}XUUx?jO`@a?wey)paZoFd zV8RRyGm95GqQYf`7uJabR9~Pyz}ixpSHBoBk)`&Yg7jo%W8yp%_+`S@OvOg3U!CAt zcmhkce?QcY36{6?pL@1^r6i7we+_1$ORVP7(8e#i4r)cph=z4WLq%W}ZZprXz-S=N zF{IZBs(h}r3}nC-ndxo3#9d#ZFzsEshoeg4SR{~@z)z>GBh{g3U}#inh!z$^+_WN> zhpxCbY=zFr#VeA{Yf`a#mZe4}Spg=+3FtFxGxahO_E1!**B6#0U^!Jy#nNj1(a4Ku z-CptE*<8Kpk<{pHrWWaH=uqHn+rU-`YFn!Br_+Ac>_-8ecS{y+NSt6a{pZ*)(<5#I zaW%g;UC&ZY(`>9v1eazvnIyENUWto8eR26XC7eufUg*% zcEdjh2C-02kQFj~L!K6@oifZ(jqj>ZGa>eqYDl1zH=$yD3YZ720*Xc*W9`|NRLRGK z18XO1VP$9HnY{SZzF+GV;l`d%G$#sn#?in?^Tr@b)10h`FKpN@d^3#Uo=M*Yj>GjZRk7Ai9?U6XG$^*eRj@ z@I7@vWmg*2*ruA2D&lcKwl3T|j9v?3E_N5oWrj2JP~uujS2!BD;v2%WaJi1`Cd%`Y zefz*W7RYk_-yQ$c{^1g;JEO3gY*a%?H`27}{SC$M@Rh9B>_A&|Y$$}5mV9H;Q|&b@ zjbjEU5bu9+2KE!%2Keo8uZ)(RU9!ZL;Mhp0O`7iCEvwF32i%D?w7vlSv5)ht2|uE9 zIi8$-E-{A=0wCY!<~A&4>azu`Z>W_nTDM?Q=N7pJGsHWY#usXUW#A1TCf6caUj~L% zdB2@d;obHH9+V*hjrQJ=LZ^2K8I+#T$QBo>}$j z>{K3$_pPVc;izR49HKvqs^kgQKr03l(|%!nd4F*nTQFMwaa#cbjEuewdz)83T)tLVFl}YGnCw7d{n* zcoy&opeKXMfw}P)nAo0P%IBEAy6`z9C(Mbk)mGYbjh;2Ff(qekUP%1z98w}74=@SW zy88>^)*gbWcR-0B1zy@jS~mtWB?L$1k%InnfY5WVq}qmU7bx(7UT(Y{W#sp6N^KFMWlXph;sX1LbRh4zzEi^`(9rNA)fDC4 zG_S}z9kw&u6QmADda^353kT#O#Q>qzxNiUb!sg2yX&HqUPINKWfi)|^ZlQ_wMZ${1 z$?igZ!t)~Awwr$(x-TezqKeI}+bM3(j7dXRT)OxO6mT@D8FkfXTb2YIJ;81HQQzy8 zc8ucY%wvGg8|$tI204wAHtsjaf9v*>Z}$|*2KE8o<``!oJH-A7rq$c;n^9Oh(;2|qxQjs5~_q<0eIdq z(qPkxq_!=EeZ^8~P>xd_)+bU5Ly&By7nWKhL`xsuQ%I;7N~ZLmTf-!(ePS24RYN>n z0{;~{Txv*2Q(BX#+Fp}TfkJcj?k;A7>kt5r%af~(UXI;FW}A3QZis7ODzF3>Tt%kH zPrypuw=Cq9D3TBXTl(=0%Ql(2K_76~%S4z=tj|JZU7N<}Be^gWF2PC2@t} zkKEZN;|$#)SRK=2Wq&w`0rPz&kQ?7xHiS(nw*>)YjdA2zPV4B(UYhJ!GV?C(9{zZv z>-FxQDn%p#I1EE2KGD!8(ZAo%Q;iXy8YIb20JO5fqF2ODQ&~4Mt;qJGRpsV_lio$7 zdB|(aKk4)o5|Ca{)?Dq$Z#_T-s0M)L1JKOBb!I$4Mguk5JO^Xz8>D_dt0+KzC0xg- znCge5)Ds-cMnT18)5KKFyptBizT`Rjn636YN0l&rB}HU6;sdA?*}~T5V0y&9g!cah zAP3+0LnAq=rfEFNM6R3gyIw37D9aK_9K$6Ek~qe6GC|!mD2f8h)rvebRzfoGd6q#6 z8J)H0dHqCDM4eZ=4#jdwYb02p5_%g7EzRDe&s*^P$<}nvc>^arR+OqRPz!%qqV*2g zU|(F?7~^v#u-4~`QclSC?4dN=*C@QMpx(-|B;rw4mWkw$7)TO^21BKw)c&^Aa-UKl zD(|f0Pze~_rdaXF`D92w6obt#_dX2K?c-Cs$&huh@3^Z3Z+NT#E&RRk-$@=h03Ei$ znrF@cAO^6Tw+Jn8=K^+$XA~Nsb$I@rz|sqio7M0PpGU#D>#w&j&-ihU;hIo`H5IPa ztHQ4P&L{tuwGx$OiCA18)uXP~uzd|UBC|BCZ07ShqA0?{hYx*ijo}R@ZI9RI=V(?d zuW%fPXy)@dHk%FFx<*;oK+_e)svcc1fCvd4j zz3BlZPTF4n01U{zIlZ&rjt!_fJd>up3po1*YulVfARIEPp%)Ip9xDdl<1 z+O{PqK3_8w1jbSQi(*5@Tl}LDg|q~^9tdw)&|w1Iu$LiqPeSnO$w>LQ(9;Nqco`jE z69V}Tgqm!i5SDFt4q`?8eZq+c;2G9{VGk0yZWxLS1-E!EkUZN!7)k8jvsVw4k(@8g z7Y!53;qzZ5?80M*#|-~}U5M?vLF;a4ASi6#oc#W54roVE2YHTRsK_Y*1G%Y`4S%^( z-EF_}Y#wXp8hhq7y#L{}gr7>s+v~hZ4Bx@v{vrp9%&FhF_vJprND=+^+1Cp%TTOVWMOj-CLfOp^4oQ2 z$`bXaL|?Z+XVJGkDg&I{z71%Nv-5LkSj4fxt-H5z>&|Vob&IkrQ4|H%n+-Nyht4_V zT4S8&NVxlGIQh~Zx(PfAvD91k+TtvOi6Z}@s_kcl|IbzPoC?t6#B4cpw<@L2F?0yI#pz(b`W#jqiQEJU`+ zh8>2)XgQEKCY*ROfBP)#eL#aDU_io9GMC}K$g}Jl`$8)Fgv?dU23MUc{M)V|4;7Ds za}l<1jy>U|(D<<1+ApQl{zN%&luyz~n zg4^Kt;V zFp46q95WVM%f*_v@bu{gnx?_!<)yE|3E5}`TmWn-JF@W@M@L6EfBYC_Sz>*8NfQ&e zYhBZzST2FK^=LGs2+aimXACfCng%Y4D7?qYX|q^RO;NCMl-9U=_byhe6_#gbXqpy) zMif!Fr)e9YZ1ID?{5AmU3zUz?$kG(|Ub~08ckevy7u zp*JRm)6VyY=N!&uptR+_BJ2hbhxZ?jt9dGJJ|vGBUPHh|a{d1g8nnM5CB*_300000 LNkvXXu0mjf^0`O8 literal 0 HcmV?d00001 diff --git a/src/MeoAssistant/AbstractTask.h b/src/MeoAssistant/AbstractTask.h index 54d0d69ab4..aa94f09f6f 100644 --- a/src/MeoAssistant/AbstractTask.h +++ b/src/MeoAssistant/AbstractTask.h @@ -26,7 +26,7 @@ namespace asst void set_task_chain(std::string name) noexcept { m_task_chain = std::move(name); } const std::string& get_task_chain() const noexcept { return m_task_chain; } - constexpr static int RetryTimesDefault = 50; + constexpr static int RetryTimesDefault = 20; protected: virtual bool _run() = 0; virtual bool on_run_fails() { return true; } diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index bc0b3c858e..58e06241d1 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -304,7 +304,7 @@ bool Assistant::append_process_task(const std::string& task_name, std::string ta return true; } -bool asst::Assistant::append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh) +bool asst::Assistant::append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh, bool use_expedited) { LogTraceFunction; if (!m_inited) { @@ -317,6 +317,7 @@ bool asst::Assistant::append_recruit(unsigned max_times, const std::vector& auto recruit_task_ptr = std::make_shared(task_callback, (void*)this); recruit_task_ptr->set_max_times(max_times); recruit_task_ptr->set_need_refresh(need_refresh); + recruit_task_ptr->set_use_expedited(use_expedited); recruit_task_ptr->set_select_level(select_level); recruit_task_ptr->set_confirm_level(confirm_level); recruit_task_ptr->set_task_chain(TaskChain); diff --git a/src/MeoAssistant/Assistant.h b/src/MeoAssistant/Assistant.h index 65c6553d19..fd05f18465 100644 --- a/src/MeoAssistant/Assistant.h +++ b/src/MeoAssistant/Assistant.h @@ -53,10 +53,12 @@ namespace asst bool append_infrast(infrast::WorkMode work_mode, const std::vector& order, const std::string& uses_of_drones, double dorm_threshold, bool only_append = true); // 添加自动公招任务 - // 参数max_times: 最多进行几次公招 - // 参数select_level: 需要的选择Tags的等级 - // 参数confirm_level: 需要点击确认按钮的等级 - bool append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh); + // 参数 max_times: 最多进行几次公招 + // 参数 select_level: 需要的选择Tags的等级 + // 参数 confirm_level: 需要点击确认按钮的等级 + // 参数 need_refresh: 是否刷新 3 星 Tags + // 参数 use_expedited: 是否使用加急券 + bool append_recruit(unsigned max_times, const std::vector& select_level, const std::vector& confirm_level, bool need_refresh, bool use_expedited); #ifdef LOG_TRACE // 调试用 @@ -78,7 +80,7 @@ namespace asst static constexpr int ProcessTaskRetryTimesDefault = AbstractTask::RetryTimesDefault; static constexpr int OpenRecruitTaskRetryTimesDefault = 5; - static constexpr int AutoRecruitTaskRetryTimesDefault = 10; + static constexpr int AutoRecruitTaskRetryTimesDefault = 5; private: void working_proc(); diff --git a/src/MeoAssistant/AsstCaller.cpp b/src/MeoAssistant/AsstCaller.cpp index 8ce8d4947a..984999f03e 100644 --- a/src/MeoAssistant/AsstCaller.cpp +++ b/src/MeoAssistant/AsstCaller.cpp @@ -197,7 +197,7 @@ bool AsstAppendInfrast(asst::Assistant* p_asst, int work_mode, const char** orde dorm_threshold); } -bool AsstAppendRecruit(asst::Assistant* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh) +bool AsstAppendRecruit(asst::Assistant* p_asst, int max_times, const int select_level[], int select_len, const int confirm_level[], int confirm_len, bool need_refresh, bool use_expedited) { if (p_asst == nullptr) { return false; @@ -207,7 +207,7 @@ bool AsstAppendRecruit(asst::Assistant* p_asst, int max_times, const int select_ std::vector confirm_vector; confirm_vector.assign(confirm_level, confirm_level + confirm_len); - return p_asst->append_recruit(max_times, required_vector, confirm_vector, need_refresh); + return p_asst->append_recruit(max_times, required_vector, confirm_vector, need_refresh, use_expedited); } bool AsstStart(asst::Assistant* p_asst) diff --git a/src/MeoAssistant/AutoRecruitTask.cpp b/src/MeoAssistant/AutoRecruitTask.cpp index 1ef47615ea..fd200a172e 100644 --- a/src/MeoAssistant/AutoRecruitTask.cpp +++ b/src/MeoAssistant/AutoRecruitTask.cpp @@ -27,6 +27,11 @@ void asst::AutoRecruitTask::set_max_times(int max_times) noexcept m_max_times = max_times; } +void asst::AutoRecruitTask::set_use_expedited(bool use_or_not) noexcept +{ + m_use_expedited = use_or_not; +} + bool asst::AutoRecruitTask::_run() { json::value task_start_json = json::object{ @@ -37,60 +42,97 @@ bool asst::AutoRecruitTask::_run() int delay = Resrc.cfg().get_options().task_delay; - auto image = Ctrler.get_image(); - OcrImageAnalyzer start_analyzer(image); + OcrImageAnalyzer start_analyzer; const auto start_task_ptr = std::dynamic_pointer_cast(Task.get("StartRecruit")); start_analyzer.set_task_info(*start_task_ptr); + std::vector start_res; - if (!start_analyzer.analyze()) { - return false; - } - - const auto& start_res = start_analyzer.get_result(); - for (; m_cur_times < start_res.size() && m_cur_times < m_max_times; ++m_cur_times) { - if (need_exit()) { + auto analyze_start = [&]() -> bool { + auto image = Ctrler.get_image(); + start_analyzer.set_image(image); + if (!start_analyzer.analyze()) { return false; } - Rect start_rect = start_res.at(m_cur_times).rect; + start_analyzer.sort_result(); + start_res = start_analyzer.get_result(); + return true; + }; + + for (; m_cur_times < m_max_times; ++m_cur_times) { + analyze_start(); + if (m_cur_times >= start_res.size()) { + if (m_use_expedited) { + recruit_now(); + analyze_start(); + } + else { + break; + } + } + if (start_res.empty()) { + if (check_recruit_home_page()) { + return true; + } + else { + return false; + } + } + Rect start_rect = start_res.at(0).rect; Ctrler.click(start_rect); sleep(delay); - while (true) { - RecruitTask recurit_task(m_callback, m_callback_arg); - recurit_task.set_retry_times(10); - recurit_task.set_param(m_select_level, true); - recurit_task.set_task_chain(m_task_chain); - - // 识别错误,放弃这个公招位,直接返回 - if (!recurit_task.run()) { - m_callback(AsstMsg::RecruitError, json::value(), m_callback_arg); - click_return_button(); - break; - } - - int maybe_level = recurit_task.get_maybe_level(); - - // 尝试刷新 - if (m_need_refresh && maybe_level == 3 - && !recurit_task.get_has_special_tag() - && recurit_task.get_has_refresh()) { - ProcessTask refresh_task(*this, { "RecruitRefresh" }); - if (refresh_task.run()) { - continue; - } - } - if (std::find(m_confirm_level.cbegin(), m_confirm_level.cend(), maybe_level) != m_confirm_level.cend()) { - ProcessTask confirm_task(*this, { "RecruitConfirm" }); - if (!confirm_task.run()) { - return false; - } - break; - } - else { - click_return_button(); - break; - } + if (!calc_and_recruit()) { + return false; } } return true; } + +bool asst::AutoRecruitTask::calc_and_recruit() +{ + RecruitTask recurit_task(m_callback, m_callback_arg); + recurit_task.set_retry_times(10); + recurit_task.set_param(m_select_level, true); + recurit_task.set_task_chain(m_task_chain); + + // 识别错误,放弃这个公招位,直接返回 + if (!recurit_task.run()) { + m_callback(AsstMsg::RecruitError, json::value(), m_callback_arg); + click_return_button(); + return true; + } + + int maybe_level = recurit_task.get_maybe_level(); + + // 尝试刷新 + if (m_need_refresh && maybe_level == 3 + && !recurit_task.get_has_special_tag() + && recurit_task.get_has_refresh()) { + ProcessTask refresh_task(*this, { "RecruitRefresh" }); + if (refresh_task.run()) { + return calc_and_recruit(); + } + } + if (std::find(m_confirm_level.cbegin(), m_confirm_level.cend(), maybe_level) != m_confirm_level.cend()) { + ProcessTask confirm_task(*this, { "RecruitConfirm" }); + if (!confirm_task.run()) { + return false; + } + } + else { + click_return_button(); + } + return true; +} + +bool asst::AutoRecruitTask::check_recruit_home_page() +{ + ProcessTask task(*this, { "RecruitFlag" }); + return task.run(); +} + +bool asst::AutoRecruitTask::recruit_now() +{ + ProcessTask task(*this, { "RecruitNow" }); + return task.run(); +} diff --git a/src/MeoAssistant/AutoRecruitTask.h b/src/MeoAssistant/AutoRecruitTask.h index 5497834a9d..e36470065f 100644 --- a/src/MeoAssistant/AutoRecruitTask.h +++ b/src/MeoAssistant/AutoRecruitTask.h @@ -13,13 +13,19 @@ namespace asst void set_confirm_level(std::vector confirm_level) noexcept; void set_need_refresh(bool need_refresh) noexcept; void set_max_times(int max_times) noexcept; + void set_use_expedited(bool use_or_not) noexcept; protected: virtual bool _run() override; + bool calc_and_recruit(); + bool check_recruit_home_page(); + bool recruit_now(); + std::vector m_select_level; std::vector m_confirm_level; bool m_need_refresh = false; + bool m_use_expedited = false; int m_max_times = 0; int m_cur_times = 0; }; diff --git a/src/MeoAssistant/OcrImageAnalyzer.cpp b/src/MeoAssistant/OcrImageAnalyzer.cpp index 7e87ff9701..9ba8f98586 100644 --- a/src/MeoAssistant/OcrImageAnalyzer.cpp +++ b/src/MeoAssistant/OcrImageAnalyzer.cpp @@ -67,3 +67,18 @@ bool asst::OcrImageAnalyzer::analyze() //log.trace("ocr result", m_ocr_result); return !m_ocr_result.empty(); } + +void asst::OcrImageAnalyzer::sort_result() +{ + // 按位置排个序 + std::sort(m_ocr_result.begin(), m_ocr_result.end(), + [](const TextRect& lhs, const TextRect& rhs) -> bool { + if (std::abs(lhs.rect.y - rhs.rect.y) < 5) { // y差距较小则理解为是同一排的,按x排序 + return lhs.rect.x < rhs.rect.x; + } + else { + return lhs.rect.y < rhs.rect.y; + } + } + ); +} diff --git a/src/MeoAssistant/OcrImageAnalyzer.h b/src/MeoAssistant/OcrImageAnalyzer.h index 9eb18a1346..fb01f8a8b4 100644 --- a/src/MeoAssistant/OcrImageAnalyzer.h +++ b/src/MeoAssistant/OcrImageAnalyzer.h @@ -17,6 +17,8 @@ namespace asst virtual bool analyze() override; + void sort_result(); // 按位置排序,左上角的排在前面 + void set_required(std::vector required, bool full_match = false) noexcept { m_required = std::move(required); diff --git a/src/MeoAssistant/Version.h b/src/MeoAssistant/Version.h index ce25bfdd94..59ae7562c7 100644 --- a/src/MeoAssistant/Version.h +++ b/src/MeoAssistant/Version.h @@ -2,5 +2,5 @@ namespace asst { - constexpr static const char* Version = "v2.6.3"; + constexpr static const char* Version = "v2.6.4"; } diff --git a/src/MeoAsstGui/Helper/AsstProxy.cs b/src/MeoAsstGui/Helper/AsstProxy.cs index 95b5207cd3..880eae5a7e 100644 --- a/src/MeoAsstGui/Helper/AsstProxy.cs +++ b/src/MeoAsstGui/Helper/AsstProxy.cs @@ -47,7 +47,7 @@ namespace MeoAsstGui [DllImport("MeoAssistant.dll")] private static extern bool AsstAppendInfrast(IntPtr ptr, int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold); - [DllImport("MeoAssistant.dll")] private static extern bool AsstAppendRecruit(IntPtr ptr, int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh); + [DllImport("MeoAssistant.dll")] private static extern bool AsstAppendRecruit(IntPtr ptr, int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh, bool use_expedited); [DllImport("MeoAssistant.dll")] private static extern bool AsstStartRecruitCalc(IntPtr ptr, int[] select_level, int required_len, bool set_time); @@ -409,9 +409,9 @@ namespace MeoAsstGui return AsstAppendMall(_ptr, with_shopping); } - public bool AsstAppendRecruit(int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh) + public bool AsstAppendRecruit(int max_times, int[] select_level, int required_len, int[] confirm_level, int confirm_len, bool need_refresh, bool use_expedited) { - return AsstAppendRecruit(_ptr, max_times, select_level, required_len, confirm_level, confirm_len, need_refresh); + return AsstAppendRecruit(_ptr, max_times, select_level, required_len, confirm_level, confirm_len, need_refresh, use_expedited); } public bool AsstAppendInfrast(int work_mode, string[] order, int order_len, string uses_of_drones, double dorm_threshold) diff --git a/src/MeoAsstGui/UserControl/AutoRecruitSettingsUserControl.xaml b/src/MeoAsstGui/UserControl/AutoRecruitSettingsUserControl.xaml index 2603b38e99..c7a9997955 100644 --- a/src/MeoAsstGui/UserControl/AutoRecruitSettingsUserControl.xaml +++ b/src/MeoAsstGui/UserControl/AutoRecruitSettingsUserControl.xaml @@ -14,6 +14,7 @@ + diff --git a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs index fb21fc972d..952cc06cb1 100644 --- a/src/MeoAsstGui/ViewModels/SettingsViewModel.cs +++ b/src/MeoAsstGui/ViewModels/SettingsViewModel.cs @@ -250,7 +250,7 @@ namespace MeoAsstGui } } - private double _scrollHeight = 660; // ScrollViewer.ScrollableHeight, 不知道该咋获取,当前的默认值是这个 + private double _scrollHeight = 684; // ScrollViewer.ScrollableHeight, 不知道该咋获取,当前的默认值是这个 public double ScrollHeight { @@ -314,6 +314,14 @@ namespace MeoAsstGui } } + private bool _useExpedited = false; + + public bool UseExpedited + { + get { return _useExpedited; } + set { SetAndNotify(ref _useExpedited, value); } + } + private bool _chooseLevel3 = System.Convert.ToBoolean(ViewStatusStorage.Get("AutoRecruit.ChooseLevel3", bool.TrueString)); public bool ChooseLevel3 diff --git a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs index 1ac0efbdd8..a92eac7a66 100644 --- a/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs +++ b/src/MeoAsstGui/ViewModels/TaskQueueViewModel.cs @@ -256,9 +256,11 @@ namespace MeoAsstGui } bool need_refresh = settings.RefreshLevel3; + bool use_expedited = settings.UseExpedited; var asstProxy = _container.Get(); - return asstProxy.AsstAppendRecruit(max_times, reqList.ToArray(), reqList.Count, cfmList.ToArray(), cfmList.Count, need_refresh); + return asstProxy.AsstAppendRecruit( + max_times, reqList.ToArray(), reqList.Count, cfmList.ToArray(), cfmList.Count, need_refresh, use_expedited); } private void setPenguinId() diff --git a/src/Python/interface.py b/src/Python/interface.py index 1add7cec4f..a867666438 100644 --- a/src/Python/interface.py +++ b/src/Python/interface.py @@ -117,7 +117,7 @@ class Asst: order_arr, order_len, uses_of_drones.encode('utf-8'), dorm_threshold) - def append_recruit(self, max_times: int, select_level: list, confirm_level: list, need_refresh: bool) -> bool: + def append_recruit(self, max_times: int, select_level: list, confirm_level: list, need_refresh: bool, use_expedited: bool) -> bool: """ 添加自动公招任务 @@ -126,6 +126,7 @@ class Asst: ``select_level``: 要点击的Tags等级(例如3级Tags不选也可以直接确认),int list ``confirm_level``: 要确认开始招募的Tags等级,int list ``need_refresh``: 是否刷新3级Tags + ``use_expedited``: 是否使用加急许可 """ select_len = len(select_level) select_arr = (ctypes.c_int * select_len)() @@ -137,7 +138,8 @@ class Asst: return self.__lib.AsstAppendRecruit(self.__ptr, max_times, select_arr, select_len, - confirm_arr, confirm_len, need_refresh) + confirm_arr, confirm_len, + need_refresh, use_expedited) def start(self) -> bool: """ @@ -224,7 +226,8 @@ class Asst: self.__lib.AsstAppendRecruit.argtypes = ( ctypes.c_void_p, ctypes.c_int, ctypes.POINTER(ctypes.c_int), ctypes.c_int, - ctypes.POINTER(ctypes.c_int), ctypes.c_int, ctypes.c_bool,) + ctypes.POINTER(ctypes.c_int), ctypes.c_int, + ctypes.c_bool, ctypes.c_bool,) self.__lib.AsstStart.restype = ctypes.c_bool self.__lib.AsstStart.argtypes = (ctypes.c_void_p,) diff --git a/tools/TestCaller/main.cpp b/tools/TestCaller/main.cpp index 1b8d39daa3..5e287543e4 100644 --- a/tools/TestCaller/main.cpp +++ b/tools/TestCaller/main.cpp @@ -17,7 +17,8 @@ int main(int argc, char** argv) if (ptr == nullptr) { return -1; } - auto ret = AsstCatchCustom(ptr, "127.0.0.1:5555"); + //auto ret = AsstCatchCustom(ptr, "127.0.0.1:5555"); + auto ret = AsstCatchDefault(ptr); if (!ret) { std::cout << "connect failed" << std::endl; if (ptr) { @@ -43,10 +44,10 @@ int main(int argc, char** argv) //} // AsstAppendProcessTask(ptr, "AwardBegin"); //{ - // const int required[] = { 4 }; - // const int confirm[] = { 3, 4 }; - // AsstAppendRecruit(ptr, 2, required, sizeof(required) / sizeof(int), confirm, sizeof(confirm) / sizeof(int)); - // } + // const int required[] = { 4 }; + // const int confirm[] = { 3, 4 }; + // AsstAppendRecruit(ptr, 3, required, sizeof(required) / sizeof(int), confirm, sizeof(confirm) / sizeof(int), true, true); + //} AsstStart(ptr); ch = static_cast(getchar());