From de20e7abbda7077ad7e0608da46dd2e10ff35084 Mon Sep 17 00:00:00 2001 From: MistEO Date: Mon, 9 Jan 2023 00:20:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E4=BF=9D=E5=85=A8?= =?UTF-8?q?=E7=9A=84=E6=8E=89=E8=90=BD=E5=B9=B2=E5=91=98=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E7=AD=89=E4=B8=80=E4=BA=9B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/copilot/SSS_Test.json | 2 +- resource/tasks.json | 78 ++++++++++++++++++ resource/template/SSSDropRecruitmentFlag.png | Bin 0 -> 5146 bytes resource/template/SSSSettlement.png | Bin 0 -> 3414 bytes resource/template/SSSSettlementConfirm.png | Bin 0 -> 8401 bytes .../Config/Miscellaneous/SSSCopilotConfig.cpp | 3 +- src/MaaCore/Task/BattleHelper.cpp | 12 ++- src/MaaCore/Task/BattleHelper.h | 3 +- .../Task/Miscellaneous/BattleProcessTask.cpp | 26 ++++-- .../Task/Miscellaneous/BattleProcessTask.h | 1 + .../Miscellaneous/SSSBattleProcessTask.cpp | 17 +++- .../Task/Miscellaneous/SSSBattleProcessTask.h | 1 + .../Miscellaneous/SSSStageManagerTask.cpp | 76 +++++++++++++++-- .../Task/Miscellaneous/SSSStageManagerTask.h | 3 + src/MaaCore/Task/ProcessTask.cpp | 38 ++++----- src/MaaCore/Task/ProcessTask.h | 7 +- 16 files changed, 222 insertions(+), 45 deletions(-) create mode 100644 resource/template/SSSDropRecruitmentFlag.png create mode 100644 resource/template/SSSSettlement.png create mode 100644 resource/template/SSSSettlementConfirm.png diff --git a/resource/copilot/SSS_Test.json b/resource/copilot/SSS_Test.json index 0894652d7d..32e4223b1a 100644 --- a/resource/copilot/SSS_Test.json +++ b/resource/copilot/SSS_Test.json @@ -46,7 +46,7 @@ "能天使", "Pioneer", "Support", - "None" + "无需增调干员" ], "stages": [ { diff --git a/resource/tasks.json b/resource/tasks.json index 95ee67c1d0..7bc65d6cae 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -9546,5 +9546,83 @@ 129, 157 ] + }, + "SSSSettlement": { + "action": "ClickSelf", + "roi": [ + 1009, + 0, + 155, + 143 + ], + "next": [ + "SSSSettlementConfirm" + ] + }, + "SSSSettlementConfirm": { + "action": "ClickSelf", + "roi": [ + 756, + 414, + 174, + 160 + ] + }, + "SSSComfirmBattleComplete": { + "algorithm": "JustReturn", + "action": "DoNothing", + "next": [ + "SSSDropRecruitmentFlag", + "SSSStartFighting", + "SSSClickUntilStartScreen" + ] + }, + "SSSDropRecruitmentFlag": { + "action": "DoNothing", + "roi": [ + 0, + 39, + 250, + 203 + ] + }, + "SSSClickUntilStartScreen": { + "algorithm": "JustReturn", + "action": "ClickRect", + "specificRect": [ + 529, + 27, + 227, + 126 + ], + "next": [ + "SSSComfirmBattleComplete" + ] + }, + "SSSDropRecruitmentOCR": { + "algorithm": "OcrDetect", + "action": "DoNothing", + "text": [], + "cache": false, + "roi": [ + 0, + 434, + 1280, + 169 + ] + }, + "SSSDropRecruitmentConfrim": { + "algorithm": "OcrDetect", + "action": "ClickSelf", + "text": [ + "确认调用", + "放弃调用" + ], + "roi": [ + 1105, + 525, + 175, + 132 + ] } } diff --git a/resource/template/SSSDropRecruitmentFlag.png b/resource/template/SSSDropRecruitmentFlag.png new file mode 100644 index 0000000000000000000000000000000000000000..300c7920f58db4b307b0f5b4d0bdabc7172c6ac7 GIT binary patch literal 5146 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 literal 0 HcmV?d00001 diff --git a/resource/template/SSSSettlement.png b/resource/template/SSSSettlement.png new file mode 100644 index 0000000000000000000000000000000000000000..7543a2f90b2ebca40bbb685e6aad93bca22b23dd GIT binary patch literal 3414 zcma)9dsNbS7H@Z&aT+bAoRe9pXEv*8o6@ATL}0hcv={W)ttm}%GN~~olSDw^OqOnC zYEqF;jyc9@Ty?8eGXzGl6d#bB-+Mpz-p~Df zFYHEz&HZBW7qe!~n!7E0%UVR`~2sTD3j|Z6do?%i3;U2HdP0`X z5YL>F^~2FyUd5B^BOwo5Wz;Kop?L$1hm(@jPlh+c*S<8Exb)6b2D!y^I^$1cHC?O12YYQ@Hkw%C?J=4t@NaJy7AMMx zY=r{76jpQRzv0v6dL4zFy7QDOYcYP4fcX1E zzAtOq^?E-<4a2lPBgkAM&P5k$-FyX!ssAzre`gBW@K&cN#n-&Mc6Sh^MBiu$9}Ha; zK^Hvg`pfhj#D--4-tGatgn_Gdj!OZBHo8=TXsf&IjC@Ba^ddnE&egYc*Entj%x-(g&^kWi7V4%{o3?Gd)fGb%p?&^#bR!P z)n**QlG#No`1YZ$R-y`vREa&)BM>&RD3YwEAn$YbfrU^1x-G6eV;-*Z-&MGG7cQr% z(H+HkaTypt&xm@E(s#o1vuq`PbRA5xl4rXH=sF6x<9uzZsU{+UI9|yPmgW^P(dq8= zZ7kSF)NWh4gXLWhc7%NlNtE2i7Hx1#^HHJAOR|vm@gM|X0VWzCvgEckl5B5G2*tvR zvgdY=jrD+OWKi)3STn=2g3nEJ@k>#cA#K-d5rYCW>h#!8F5YkwKDcNe|3CNZL!dB8 z;DwmDfV$zQ5lCY>&pL3Jz!{q$gyymB;V(cStQ(u?ttR;%^h zQ;1cJ_}!oEVsP|DtRhNsE|~{7kX+3J93W<*2)9&zq)s_+=;FiY$13czlWS^e<|1uB zt=S7reR|L6wei$ggA39Y!86oB9FkHK@^3R12rq9)%RnTWZ~LV*_%D_wN#cEIA~IK3 zC-S11ODtt&2O=#RCefi%EL_-!A|z+Q$A7gC4Yg~e@hpj?^e`K>bA{aAxQj^zHq=T_ z>jf3`nX^6OTE{T5`?EOWtvBkzl5AGnLiagX^d_DSxW~|?$ z#?h?#am6&t10q~EYxFeX=g2WvJ4%0 z<~J`4@JJ|#|Cosqv{&XSg#smN>H~}SqA|#>Im2Qmp%yIV08Sc|+5tKZC5@or!yc9Q zf9UBiMjxga)PPC_TS@q4`OG+iTo%3%1vlqIQU~gI=3l@yMQk@-aK|{>u?VMzAa`)I zvFrN?14nYhG#sqr*}RWrtND6QqCAhYIwjLFP|w z;h8aCey+>c#yr)hqUwW~`ilqJg(Bw0b^)YQt|!aQ4#GfJGX{?O6rt7tg|E<35=|38Y##p{4mdW$!x1KC}y+(kj-w zy2gVE=`y?@DEWXc$;bMbPmp&9DrKLrxRdcX8yiRJcBZ*N-5_9D3|f++Bd9+o`bJTK zPx?;_vcOu zA^>sz7`&#;Gd&H9P%>x=La{EFG1kYi4U#pE7MLGkRXEM|OMVA=}s zb5(tS?rC-;@3f|l?{6;1jgE~CuR#~4IAp}PvUnxV%C-bR*>NX`MCByU@ath@KO)f% z62j1@j7*Sq?HGJ8Wq8$&cWI)R!n~{VczPjKxXFW)IQ(Q~(Y5H_O~hR5h26A@fW?Ru z-NX0)^N+gzH9hc3LjOVBzaeAaC+XkN(*MtNI+Ry3|8*VvzI(RRHiQ>^w)oWW8vvvM6NLVqdw)?{4lY&LI-OeLaDsb78NpGk{UFZgle~zkN|R=2 zOiA)B!s!Ra^p0-_ZWxTne#!J+xQTygtiUUxBArb4E)aR63vj6t`vdWUg zM-7f*azhJN^D&QiS?Jks@`s*0)>$Lh*2?m8u3@2u(vNz*ive}Eu>x?jhC=zv)h}3r z!3%XqkuuNY{1IrLMy`JB>8p}!)Zn0wgoF>`q#Dcx6E{Jvyw648dn`X^L<5?m?H8>1 zyq$2aTN0XDKK9qDTO|~B7Ve1=#}25TA<$?vC@=7Oy`$rXeP(xiEdDg%DK^7R^Rzjg zNc`#Y;DHH*8SZxSgw_E>p<=JbNJGMr z+ah{|J0hJXndh_2I5Z$e!-Q^=XDlrroOqX{tuI7uq({9xwYOF4aP z9sbU{iL*6Y52YHa4)+ck5xe+ORb=8nlg_hLUw&#!Xzp3i7Puwx7f*TMRQ~B$NWvFy z>h|tlMCCh~5YB_@& z4_{#l>OIV-qVN`8etvx@K|M5$LYbzqSS$$`TqJ)If7|p(LhDw9FX;$eT-hq1-%#QT zBiXVr`L!`(u0DwAfW8i~5>u(h2*FL?I+L@CXYU3NT}i@5L#*y5dfO=S)-ZJVRi0*l z&;GspfidEqa?O`?2JU{dY_Q6!|9of4@dvrqq7hJ-jrQ=#8r0TpOKlmrO`9a<*XHuH zTV?i5JB9Xfb@nrUX@Yj&Yx!LBQhokt6;EZU3fr>jN1u9_;jk7MoKZhCKT_{3@dRm# zrd8IBoJcB&Soste7Y8*UT;bt|rmEafF>?a(!Ascimz4X&oTbAJ5P-1)Tz>ksy2Z<0 zA150R`$3A04;qc8pumj^+ul&)?<#vt_9LCQc_R4?KGi)C&QeCZ2L%P)cd`r)KEn?) z8K}7?l`JR9mV$xzeM4docdV?q4qmQ=T1Kd6teds{Oh?y6EKnrem19`+YA%GF3dJ*2uV zkO0T&r836G#=6_xDjg5xPhJP0JU9(M%3QrqE-JcNv(Lduy!(u(2FI|-kvu!0rPUiQ zSY$twUrn)gR>6c1`%+d~OA9x8L)p!V@&g^|9&gieQ}30!L24s6~t=XHoMw@X_UqDqW?JBT3%Jc(XNcH{zWVDw((&gR44Ps}dj6Xm)Tc@>K5CoaH}mg9+;&iSvVnFplZU@Q?0VJxl_P>$Gfz+DM2Q`E} zYep5T&&pamWfe=rFv8r?w~Ku$9YZ+tM4@8aa_oQM7xknJ|5c)KEfj2gRFCQ3t)&`8 zbD0QOskilzh=Ew=TJ0nhNIf8r^ih{Q*WM5w&KN@6O+1=(qioQ}UhE_Q+rweO-*ta2 zk85|+kLFENU0BDzvP=>|{;c zht(IV^vL@dxyejSN&^%wX4)BQ@ zhBh^!ND=lv#lY9V^Kj|!vKo)Sx7}CE>tiGMqjOfZFLn>0%F=niH6|DzZhJU>?C@Fo zTi_h-j#yIi39ZLl(|LW5Hkv$geSpEE{@Dpmo%hAaO}LnSj94~QC-p+Iv4Nt-(#=zji`6|uUK zCv{}+12o5%`#r1iNBdP~2w3IKw4drFr+eBG{XS|9rBAP+UAA2ce}8R_S`tV|(H^*C zeaqB)Vm6?wN(mQ>HGqJFLs_!Nv${hARvCDraYzQ5im=L+t(E@>BiX;TDfF88AsxX9KeKXZ5DWJ1!T74x*hg zvw=fLEb?zz@#`5tVVWNkn{F>LD{Nf0ze_YNZANl|`ZHZZkmzFCnxCXvL6IqR))O)m5!jH6k@bED@&Y()3lG zcxB1MaCaeLVHy`9X81>LSc#PpUev33|NdqBVP)>PpEet(NKiWMxud(xs5twwsd0O8 zTW2Meo}x2{KMl9RA%-;oXN56UQ?zF?ibPsiSPzSQ*VG5HAOPZ==2t!_1J&~z8NStX zqxZkxkwANZDFD)#z}Q&3&y|xPm`oMmNYhZxY0|2;Uv5bSQ65*Yg|l_U(9PM7ff<($ zu#Uni%Lds|+f>f>pvy$mugY(`Gc#wSN0`o#7RBNkHLE)gXjIsHC@#MB8}`p$ih3ar#e&mB%aR(%+ciZ(AOjni?3>wulMp` zS9eBqm-txRr&sgeub6rq{$Mso*!;-ZWnQCB)N+5mw$J3bhvU_|o=!!98yOYV1hTUX zTr}s+i8yG)7gU4wZIapaHK2Zab6LO1d^KY}5TXyjTI^*-j$#(;*cNAB zwg((*O!>YUs=L!_3nJf7m#uLQx8&q8G;g^-M`kX^2&X^)3*eKV(JM-PmR6)>#+E{4 z*ReQ8b>NhcYe)3xr%HdNa0{6A6pwT_wj&+#D!prax4)y~?d{TX3Y=Fu*`0Sh?1-L< zC}x%hu$>=oDf-n-AH5h=cj>_Xsl>vFl?vgvA9*})2E_lj-@15r9cxgC3 zNbBUusV&52v5#ZMs&dJVT z*k@W>TMu2~xgi_>ML8U1SyNYMf|wt~?M>g4m60U%X>l3}@*7;Pew&vd`fpCR-$q9h@U!_Shh6r<<4NsRElEp4GG6r1c(cJ?ss+5^6}sg`@7Qt zT?ph5(1<*XI}oRDCDuKSH25N;j2T!!q4U;JFdk{oFs`A*NPUnwox`OCzg*77K9e^| zoAg&dnL?tNDqvr5UtCUSupPr@S6#UEY}y6|+^!R7;#_wyD{`N_A2#6YvU*!Lkhxk& z2CvQiQMmKz)Xw*dI(s91BB?7nxT!7;o^+&4e1``1C#X#E{cmb(bNikdBdWAZxlWPm zRq~GZne!PGMNU4fwPzuyfj*nq36AI-`{qYKdJbnnn9n%b0Rrjy1%VBQk~2G%JQDok7yk* zILM@F^-m#+XQKb+Y3{-MX6fwUZ1Z>KZ2x(1w?+kNouP=Y7J_;T>1P`Q(7>myAgDww zwI>^!em_0FH#x>)j*NZ`?y%qfZz6cVe}P&U@l(cDOjd+~y14bMFl6@gRd%aPZyI#( zSMXzYvV-45)S8vb4TUoxL6)BG!T0|sd3j_a0}4Q(HR6PC*AxvojY|e&s>mVS+d*7y zEww6$`{||S;sWP+mUdUI8nugv>S4PwP!4D<2Ztfr!UJ2DKcC_gPP7x*a&NYf8MVFO zQa@ku&C&I2@eOw2{;uwJb>DX9{&11P2jBgEBhL0W0o`rZzSaqzH{RJ0Bdod!_P?w% z2>H?NtOPvGUhNQvq>)v#$$kVBseC{ zkVCp1E_|3d79o&J4BHHj;?k)TK}*B#wMsb}^IQS&@{Lh@eTCbnbw#KsL_E2Ae*N01 z&F1|OPIyiZaN^@D)K7x5}LKTVgPm3%KLl?k1^pBI&PJ8AzrXMBSjMx_n}xm%X~~^Y=5T)#ySj zmPx6br3s@1t(H#ysVLCPy)~4YeF|bAA_poGeKE?1&Gv*cV%UiJRoaRZ$5iV?1RqOP z?o`Cmo^aG=WnV-|)c3aMkAHPu2>*;8ut>;WK9XA%@nf-pv%8c~81{|F@BEohp%RYJ zq#L$7KU18+`W_Zc`AwDYwmSIj{#u~Q*{kJ!Zsb0ajaN_R8Lm&>O!OC@OzgeKAN~KO ziDEK6Or$Of2}eTmWqB*tk+SzlRBCWq(PeyZBiD9+GsR`QiCPGhRymCrTy={TAYU64YJM})cS8w8?2Jwe>WtDPk4~S ztn=BMXY(nA_3Mmq-8Grwbc#(f0KarB2}l$crf@;K$2bYT`O`qGh&rj-oct>Mm-zuV+yrc{n! zM{M0&8z|hHE%SRXGaG=dQ|NAbzuMauvG&?hdr7b8j#l6EK_CBq!;6u-^W^t?zt#Je zKZl}qL+43<7rC0?#EZeo$~c^9)T@bmt3I)2w z>wdxg_NI`@BUgW_KmJh=zWDn~f<@${;P*(yJ}p|oQ6ZO|m%5?TWiBVCHTEo+qn6CD z`4dfRW?&!hJ_hHugBapRb{s_IIwG9qOGT%;Q4Yx{U#2}!)!c7f%_WXbOgzByyUwU5 z<1z5GlDFt%ROjpbdSw$#9q#yNP!XUXZuk(eZ}G72J=S{iiL{xw>xGs>S|54*`v zD%>9(61wnV^IyvdH|}IY*?N5iQQbVnC2aP&Z{sq~wn?)KvlH2fDU9d~UkqVwV~rIC z7lP)AJ~m}ggX?1L4>Q?i1U;wAnAV#;fFu127#5V8eC!3yd8bme%FO2SR6;_6p%ox4 zeHPxV;YE<=aD%~C%4*tjDcFzYw6ngIM}AM)-`q=y{AI>v3bM0}%ac~L5mvV|cYTM# zbqj6=6>RmOSxZk9$xS+4m!ECzRhsNWsc??4uuwV( zeHbM9gyPA=2cS2(CD3?ifK=1U1n2Scyh|SnZ05X~PXebJ=dYjoJ>V3q;HoYq-tA$X zd2IMGqxu7Y-UYwwYRu^^f% zOoPCog{r~{N_|wdtFPrju#j*cHA>Ux0<_9QHS;cAj&|ikfU%9l{%{IyEy+(RKT7Ar zL9c~R2`6{fjC}W3wf2>fAVLtG1)sP%qeLQ6GKGhql)+eA&2mIq5Bg9pb^HkRObya;twe5~jc~Wz9g$ev`i~qjThQ=vl%qXAGPL*A(&_R4 zNO??UYtB}8{nY*x->Log@y$JPEw6~g=|@KmTnX_x0PLXNSD(5PZw8vTEnC)nHqO?C zmfgn{7HY)cQ>Y_m@;=*yiRGpo#%$gXARsgj?_oWs+9n zZ6(G)Nq{M>81PSW;=fVB%kAd$bPoj?$y8Ny&`mUKZ+A#~+VsGYLxGi!o+zUZJ9HfO zwol09ll`A~PDF2+b31A(4->BXi5*bl*7--;3A5u4@WzYWeogS<3*=U_2Y9pBx_K7*Z{a-G{_SGNf#~+he}gR$**Vw<2$t}f zL{d+d==S*Apb`b^f5nnO%S}DZ_qZ4}b=+mIG-&vf zD8HnDjFQ&=do<@hHpcS+)Ib^4ih>DI#5cUwW|ytbzRO;B zT+_P4)NbV2kM^eg2v@a-zZ$8GOP2x9MQ+%9JD~#Ik3t-Fttp{$euc0TAw13sfIb*{ z?rbi%r^dy7yY?q6ynbgeFw?_S0kC$u3I@p%&Y{y3-POwyv|k=pxgwW8xVO~NU49Rg z>aL`AF4lQn$=j-mhX6L`Kn|@Bnx_cM$QRexnA)SC$@gKx#TEZ<1jGMSl{LXEXU&r- zb>3L)%lK>(1pqnYL@bzHj*gFZY2xK93+{tS#(>iEDLWN#g=Ff#J-OKUyW@D_awIEj zJ*+K}qj%eSiX1VWqO(ycptF3?Arq?7Bf^WoYWPwgI3*B8QeOp@j(x7W55~zFMhN&v z(`Q&DE=R^-e=p6lkqg%3P;*W`CO~WwOtY8H3o@_HuZx0ysuf)3l<`RJ&eARPdA%~0 z+)TUMBu!XGuMG>_!=|Yw5$@GFK7|6x80y&Hsef7+(DR!ZMfUv42fP~|{E0`mPlFx{ zq%acY`PO&>kSgt#2x~@-%?8vU4Xv`}yQ+FLsGwnu<7^eMcb0?;G3|d_EjRVTd|Bil!h|e~R zkG3d14L7vn=jbE+SWM>VDBKlXssuf7sd{=fUI!A=|HQrV(t6Ml9j+s6UkC!bM!!BJlhA>eMnboBQn!D{6b%I!tQIA=X zL256dcjWqS@Y(f9bR3Gwwg&{?A!)u6%@LIl<~$Vc9*{{ILaQD@08lGPO!h3v!C}HT zD|#zpktXnpvdG<@U#};go0j5{j)eejz1xv)&L>ZbNW)1MrPR96xvvUUnK>} zxVqDpVe9;8fg)G&p3qR;YC5R|7lGwle`ar|T-%rq=S2QshD%uLI+2IgeTo|;jE%oC zdV>ns0^0(P_4UNu5}s7AGttOHdXO04gn?A&!leJDoOog^1e>UWxSRKs`JQ4JEuIR+ z8Y5~LaV@TaMe-2WVokh7W(j>aG76ypbcLT4NmcE>S#~Ao=6i2IwdeTp;}gz)I(dVP zOpjR**Nt36dWpA4=ln>ImVmTr8gpi5GUPt#NxptGEEO96!s94x>zg@&M;VhQOK%OO zT%a&qg?a$cGv$0A4i`p0gLD+xXL^l3YUN~K|7FG{?nI-j@m!cEbzWhS31!IwPL zRkgh6JLSj+wURR-$fGV~!M~@kFpVDF;5%$|x_JGrwr6pgs&$Wjrgisi>L(UIy_BP25d3;7Mupj%PUj4)9xK}(^e-;j)=9BudxihX&tZ-pC0;UqqF>I6MYeose+$_?5fCEHhnB|h( z2?f(6!*k}(2M_7xmb7`rL(3^W+Q)=S>9b)JBsdnvedFFJ90J@DR||4@;-O)*0;JES zoEH=zR%OA$NF@RMzK6XgN3!UQyp4U6i-SYP8APJ7nBiJM_r;4t^V9b`0-gf;3IM1N zQeg_2W>PW(_O%pRB$(==z`A*`5CEovk?KsMyvqdOrqxOuaJCDB5*R#Y!Lv2MvmR^@ z8#AQ(D`#>Nv=>WmAk>sD~W+zF<&|fC>lP@FY>QwEq(y#V_|+5l23Urxy{>5!zNLOF4a z(d?w8B!YZqw+Dm=fvd}tHK!}hjUr$?y;@{#MPD#Mwi&a)ZQXZ%+T25PzGz0@YKg&q zIiHsY9_K)*EMRXy7*Ax{` zcXcJ4+Xs-FYp^!C>6J;=rim(}%8(>X62@d;u||u&{9ef{%z@gC^2*CY+&OVF4XaY( zeT(Z;9mj~|NIx=p!$08#k!KWJT^pKN$9)W z&xs5f{xMZGe!%qYr2m`rV=0}?ZD|ohtEM4E9D#W5IwG3uoD4Rchy6@>AgJ50#$uh` z4cGoyYhJtJ9+*a~^cb54tTget_image()); + cv::Mat image = reusable.empty() ? m_inst_helper.ctrler()->get_image() : reusable; + MatchImageAnalyzer battle_flag_analyzer(image); battle_flag_analyzer.set_task_info("BattleOfficiallyBegin"); - return battle_flag_analyzer.analyze(); + bool ret = battle_flag_analyzer.analyze(); + m_in_battle = ret; + return ret; } bool asst::BattleHelper::wait_until_start() @@ -434,6 +439,7 @@ bool asst::BattleHelper::wait_until_end() bool asst::BattleHelper::do_strategic_action(const cv::Mat& reusable) { + check_pause_button(reusable); return use_all_ready_skill(reusable); } diff --git a/src/MaaCore/Task/BattleHelper.h b/src/MaaCore/Task/BattleHelper.h index 715c93d2fc..b65a18c74e 100644 --- a/src/MaaCore/Task/BattleHelper.h +++ b/src/MaaCore/Task/BattleHelper.h @@ -48,7 +48,7 @@ namespace asst bool retreat_oper(const Point& loc, bool manually = true); bool use_skill(const std::string& name, bool keep_waiting = true); bool use_skill(const Point& loc, bool keep_waiting = true); - bool check_pause_button(); + bool check_pause_button(const cv::Mat& reusable = cv::Mat()); virtual bool wait_until_start(); bool wait_until_end(); bool use_all_ready_skill(const cv::Mat& reusable = cv::Mat()); @@ -74,6 +74,7 @@ namespace asst std::unordered_map m_skill_usage; /* 实时更新的数据 */ + bool m_in_battle = false; int m_kills = 0; int m_total_kills = 0; int m_cost = 0; diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp index 2b2a3a1b6d..5ba077d465 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.cpp @@ -41,7 +41,7 @@ bool asst::BattleProcessTask::_run() update_deployment(true); to_group(); - for (size_t i = 0; i < get_combat_data().actions.size() && !need_exit(); ++i) { + for (size_t i = 0; i < get_combat_data().actions.size() && !need_exit() && m_in_battle; ++i) { do_action(i); } @@ -159,7 +159,7 @@ bool asst::BattleProcessTask::do_action(size_t action_index) } bool ret = false; - const std::string& name = m_oper_in_group[action.name]; + const std::string& name = get_name_from_group(action.name); const auto& location = action.location; switch (action.type) { @@ -210,6 +210,16 @@ bool asst::BattleProcessTask::do_action(size_t action_index) return ret; } +const std::string& asst::BattleProcessTask::get_name_from_group(const std::string& action_name) +{ + auto iter = m_oper_in_group.find(action_name); + if (iter != m_oper_in_group.cend()) { + return iter->second; + } + m_oper_in_group.emplace(action_name, action_name); + return m_oper_in_group.at(action_name); +} + void asst::BattleProcessTask::notify_action(const battle::copilot::Action& action) { const static std::unordered_map ActionNames = { @@ -245,7 +255,7 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) update_cost(image); int pre_cost = m_cost; - do { + while (!need_exit() && m_in_battle) { update_cost(image); if (action.cost_changes != 0) { if ((pre_cost + action.cost_changes < 0) ? (m_cost <= pre_cost + action.cost_changes) @@ -254,7 +264,7 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) } } do_strategy_and_update_image(); - } while (!need_exit()); + } } if (m_kills < action.kills) { @@ -270,7 +280,7 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) if (action.costs) { update_image_if_empty(); - while (!need_exit()) { + while (!need_exit() && m_in_battle) { update_cost(image); if (m_cost >= action.costs) { break; @@ -282,7 +292,7 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) // 计算有几个干员在cd if (action.cooling >= 0) { update_image_if_empty(); - while (!need_exit()) { + while (!need_exit() && m_in_battle) { update_deployment(false, image); size_t cooling_count = ranges::count_if(m_cur_deployment_opers | views::values, [](const auto& oper) -> bool { return oper.cooling; }); @@ -295,9 +305,9 @@ bool asst::BattleProcessTask::wait_condition(const Action& action) // 部署干员还有额外等待费用够或 CD 转好 if (!m_in_bullet_time && action.type == ActionType::Deploy) { - const std::string& name = m_oper_in_group[action.name]; + const std::string& name = get_name_from_group(action.name); update_image_if_empty(); - while (!need_exit()) { + while (!need_exit() && m_in_battle) { update_deployment(false, image); if (auto iter = m_cur_deployment_opers.find(name); iter != m_cur_deployment_opers.cend() && iter->second.available) { diff --git a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h index d79ae23701..f54cd82464 100644 --- a/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h +++ b/src/MaaCore/Task/Miscellaneous/BattleProcessTask.h @@ -30,6 +30,7 @@ namespace asst bool to_group(); bool do_action(size_t action_index); + const std::string& get_name_from_group(const std::string& action_name); void notify_action(const battle::copilot::Action& action); bool wait_condition(const battle::copilot::Action& action); bool enter_bullet_time_for_next_action(size_t next_index, const Point& location, const std::string& name); diff --git a/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.cpp b/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.cpp index 5a196a70d0..52fcaba16e 100644 --- a/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.cpp @@ -19,6 +19,11 @@ bool asst::SSSBattleProcessTask::set_stage_index(size_t index) m_sss_combat_data = SSSCopilot.get_data(index); ranges::transform(m_sss_combat_data.strategies, std::inserter(m_all_cores, m_all_cores.begin()), [](const auto& strategy) { return strategy.core; }); + for (const auto& action : m_sss_combat_data.actions) { + if (action.type == battle::copilot::ActionType::Deploy) { + m_all_action_opers.emplace(action.name); + } + } if (!BattleHelper::set_stage_name(m_sss_combat_data.info.stage_name)) { json::value info = basic_info_with_what("UnsupportedLevel"); @@ -39,7 +44,7 @@ bool asst::SSSBattleProcessTask::do_derived_action(size_t action_index) switch (action.type) { case battle::copilot::ActionType::DrawCard: - return draw_card(true); + return draw_card(); case battle::copilot::ActionType::CheckIfStartOver: return check_if_start_over(action); default: @@ -54,6 +59,9 @@ bool asst::SSSBattleProcessTask::do_strategic_action(const cv::Mat& reusable) cv::Mat image = reusable.empty() ? ctrler()->get_image() : reusable; update_deployment(false, image); + if (!m_in_battle) { + return false; + } std::unordered_map exist_core; std::unordered_map available_tool_men; @@ -91,8 +99,9 @@ bool asst::SSSBattleProcessTask::do_strategic_action(const cv::Mat& reusable) } // for apple-clang build error Role role_for_lambda = role; - auto iter = ranges::find_if(available_tool_men, - [role_for_lambda](const auto& pair) { return pair.first == role_for_lambda; }); + auto iter = ranges::find_if(available_tool_men, [&](const auto& pair) { + return pair.first == role_for_lambda && !m_all_action_opers.contains(pair.second.name); + }); if (iter == available_tool_men.end()) { continue; } @@ -104,7 +113,7 @@ bool asst::SSSBattleProcessTask::do_strategic_action(const cv::Mat& reusable) } if (m_sss_combat_data.draw_as_possible) { - draw_card(); + draw_card(false); } use_all_ready_skill(image); diff --git a/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.h b/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.h index ee990c6419..105004435b 100644 --- a/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.h +++ b/src/MaaCore/Task/Miscellaneous/SSSBattleProcessTask.h @@ -24,6 +24,7 @@ namespace asst battle::sss::CombatData m_sss_combat_data; std::unordered_set m_all_cores; + std::unordered_set m_all_action_opers; private: using BattleProcessTask::set_stage_name; diff --git a/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.cpp b/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.cpp index 79bb46d128..08f86a91c1 100644 --- a/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.cpp +++ b/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.cpp @@ -1,10 +1,12 @@ #include "SSSStageManagerTask.h" +#include "Config/Miscellaneous/BattleDataConfig.h" #include "Config/Miscellaneous/SSSCopilotConfig.h" #include "Controller.h" #include "Task/Miscellaneous/SSSBattleProcessTask.h" #include "Task/ProcessTask.h" #include "Utils/Logger.hpp" +#include "Vision/OcrImageAnalyzer.h" #include "Vision/OcrWithPreprocessImageAnalyzer.h" bool asst::SSSStageManagerTask::_run() @@ -23,9 +25,6 @@ bool asst::SSSStageManagerTask::_run() return false; } - if (!click_start_button()) { - return false; - } const auto& [stage_name, stage_index] = stage_opt.value(); int times = m_remaining_times[stage_name] + 1; @@ -33,12 +32,16 @@ bool asst::SSSStageManagerTask::_run() battle_task.set_stage_index(stage_index); for (int i = 0; i < times; ++i) { - if (battle_task.run()) { + if (click_start_button() && battle_task.run() && !need_exit()) { break; } } + + do { + } while (!comfirm_battle_complete() && !need_exit()); + if (stage_index >= stage_count) { - // TODO: 任务结束 + settlement(); break; } } @@ -74,7 +77,70 @@ std::optional asst::SSSStageManagerTask::a return std::nullopt; } +bool asst::SSSStageManagerTask::comfirm_battle_complete() +{ + ProcessTask task(*this, { "SSSComfirmBattleComplete" }); + task.set_times_limit("SSSStartFighting", 0); + if (!task.run()) { + return false; + } + + if (const std::string& last = task.get_last_task_name(); last == "SSSStartFighting") { + return true; + } + else if (last == "SSSDropRecruitmentFlag") { + get_drop_rewards(); + return false; + } + return false; +} + +bool asst::SSSStageManagerTask::get_drop_rewards() +{ + using namespace battle; + LogTraceFunction; + + OcrImageAnalyzer analyzer(ctrler()->get_image()); + analyzer.set_task_info("SSSDropRecruitmentOCR"); + if (!analyzer.analyze()) { + Log.error(__FUNCTION__, "OCR failed to analyze"); + return false; + } + + struct DropRecruitment + { + TextRect ocr_res; + std::optional role; + }; + + std::vector opers; + for (const auto& result : analyzer.get_result()) { + auto role = BattleData.get_role(result.text); + opers.emplace_back(DropRecruitment { + .ocr_res = result, .role = role == Role::Unknown ? std::nullopt : std::optional(role) }); + } + + for (const std::string& name : SSSCopilot.get_data().drop_tool_men) { + auto role = get_role_type(name); + bool is_role = role != Role::Unknown; + auto iter = ranges::find_if(opers, [&](const DropRecruitment& props) { + return (is_role && props.role) ? *props.role == role : props.ocr_res.text == name; + }); + if (iter != opers.cend()) { + ctrler()->click(iter->ocr_res.rect); + break; + } + } + + return ProcessTask(*this, { "SSSDropRecruitmentConfrim" }).run(); +} + bool asst::SSSStageManagerTask::click_start_button() { return ProcessTask(*this, { "SSSStartFighting", "SSSCloseTip" }).run(); } + +bool asst::SSSStageManagerTask::settlement() +{ + return ProcessTask(*this, { "SSSSettlement" }).run(); +} diff --git a/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.h b/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.h index d321109025..9cbfa438bb 100644 --- a/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.h +++ b/src/MaaCore/Task/Miscellaneous/SSSStageManagerTask.h @@ -22,7 +22,10 @@ namespace asst int index = 0; }; std::optional analyze_stage(); + bool comfirm_battle_complete(); + bool get_drop_rewards(); bool click_start_button(); + bool settlement(); // 结算奖励(退出整局保全战斗) std::unordered_map m_remaining_times; }; diff --git a/src/MaaCore/Task/ProcessTask.cpp b/src/MaaCore/Task/ProcessTask.cpp index 8936f9ce66..6cd6cef9ba 100644 --- a/src/MaaCore/Task/ProcessTask.cpp +++ b/src/MaaCore/Task/ProcessTask.cpp @@ -16,14 +16,14 @@ using namespace asst; asst::ProcessTask::ProcessTask(const AbstractTask& abs, std::vector tasks_name) - : AbstractTask(abs), m_raw_tasks_name(std::move(tasks_name)) + : AbstractTask(abs), m_raw_task_name_list(std::move(tasks_name)) { m_task_delay = Config.get_options().task_delay; m_basic_info_cache = json::value(); } asst::ProcessTask::ProcessTask(AbstractTask&& abs, std::vector tasks_name) noexcept - : AbstractTask(std::move(abs)), m_raw_tasks_name(std::move(tasks_name)) + : AbstractTask(std::move(abs)), m_raw_task_name_list(std::move(tasks_name)) { m_task_delay = Config.get_options().task_delay; m_basic_info_cache = json::value(); @@ -39,7 +39,7 @@ bool asst::ProcessTask::run() m_task_delay = Config.get_options().task_delay; } - m_cur_tasks_name = m_raw_tasks_name; + m_cur_task_name_list = m_raw_task_name_list; for (m_cur_retry = 0; m_cur_retry <= m_retry_times; ++m_cur_retry) { if (_run()) { return true; @@ -62,7 +62,7 @@ ProcessTask& asst::ProcessTask::set_task_delay(int delay) noexcept asst::ProcessTask& asst::ProcessTask::set_tasks(std::vector tasks_name) noexcept { m_cur_retry = 0; - m_raw_tasks_name = std::move(tasks_name); + m_raw_task_name_list = std::move(tasks_name); m_pre_task_name.clear(); return *this; } @@ -83,7 +83,7 @@ bool ProcessTask::_run() { LogTraceFunction; - while (!m_cur_tasks_name.empty()) { + while (!m_cur_task_name_list.empty()) { if (need_exit()) { return false; } @@ -93,16 +93,16 @@ bool ProcessTask::_run() json::value info = basic_info(); info["details"] = json::object { - { "to_be_recognized", json::array(m_cur_tasks_name) }, + { "to_be_recognized", json::array(m_cur_task_name_list) }, { "cur_retry", m_cur_retry }, { "retry_times", m_retry_times }, }; Log.info(info.to_string()); - auto front_task_ptr = Task.get(m_cur_tasks_name.front()); + auto front_task_ptr = Task.get(m_cur_task_name_list.front()); // 可能有配置错误,导致不存在对应的任务 if (front_task_ptr == nullptr) { - Log.error("Invalid task", m_cur_tasks_name.front()); + Log.error("Invalid task", m_cur_task_name_list.front()); return false; } @@ -113,7 +113,7 @@ bool ProcessTask::_run() } else { const auto image = ctrler()->get_image(); - ProcessTaskImageAnalyzer analyzer(image, m_cur_tasks_name, m_inst); + ProcessTaskImageAnalyzer analyzer(image, m_cur_task_name_list, m_inst); if (!analyzer.analyze()) { return false; @@ -124,28 +124,28 @@ bool ProcessTask::_run() if (need_exit()) { return false; } - std::string cur_name = m_cur_task_ptr->name; + m_last_task_name = m_cur_task_ptr->name; const auto& res_move = m_cur_task_ptr->rect_move; if (!res_move.empty()) { rect = rect.move(res_move); } - int& exec_times = m_exec_times[cur_name]; + int& exec_times = m_exec_times[m_last_task_name]; auto [max_times, limit_type] = calc_time_limit(); if (limit_type == TimesLimitType::Pre && exec_times >= max_times) { info["what"] = "ExceededLimit"; info["details"] = json::object { - { "task", cur_name }, + { "task", m_last_task_name }, { "exec_times", exec_times }, { "max_times", max_times }, { "limit_type", "pre" }, }; Log.info("exec times exceeded the limit", info.to_string()); callback(AsstMsg::SubTaskExtraInfo, info); - m_cur_tasks_name = m_cur_task_ptr->exceeded_next; + m_cur_task_name_list = m_cur_task_ptr->exceeded_next; sleep(m_task_delay); continue; } @@ -154,7 +154,7 @@ bool ProcessTask::_run() ++exec_times; info["details"] = json::object { - { "task", cur_name }, + { "task", m_last_task_name }, { "action", enum_to_string(m_cur_task_ptr->action) }, { "exec_times", exec_times }, { "max_times", max_times }, @@ -198,7 +198,7 @@ bool ProcessTask::_run() break; } - status()->set_number(Status::ProcessTaskLastTimePrefix + cur_name, time(nullptr)); + status()->set_number(Status::ProcessTaskLastTimePrefix + m_last_task_name, time(nullptr)); // 减少其他任务的执行次数 // 例如,进入吃理智药的界面了,相当于上一次点蓝色开始行动没生效 @@ -237,14 +237,14 @@ bool ProcessTask::_run() if (limit_type == TimesLimitType::Post && exec_times >= max_times) { info["what"] = "ExceededLimit"; info["details"] = json::object { - { "task", cur_name }, + { "task", m_last_task_name }, { "exec_times", exec_times }, { "max_times", max_times }, { "limit_type", "post" }, }; Log.info("exec times exceeded the limit", info.to_string()); callback(AsstMsg::SubTaskExtraInfo, info); - m_cur_tasks_name = m_cur_task_ptr->exceeded_next; + m_cur_task_name_list = m_cur_task_ptr->exceeded_next; sleep(m_task_delay); continue; } @@ -256,7 +256,7 @@ bool ProcessTask::_run() if (need_stop) { return true; } - m_cur_tasks_name = m_cur_task_ptr->next; + m_cur_task_name_list = m_cur_task_ptr->next; sleep(m_task_delay); } @@ -308,7 +308,7 @@ int asst::ProcessTask::calc_post_delay() const json::value asst::ProcessTask::basic_info() const { return AbstractTask::basic_info() | - json::object { { "first", json::array(m_raw_tasks_name) }, { "pre_task", m_pre_task_name } }; + json::object { { "first", json::array(m_raw_task_name_list) }, { "pre_task", m_pre_task_name } }; } void ProcessTask::exec_click_task(const Rect& matched_rect) diff --git a/src/MaaCore/Task/ProcessTask.h b/src/MaaCore/Task/ProcessTask.h index 7816305ba2..18e4406b6e 100644 --- a/src/MaaCore/Task/ProcessTask.h +++ b/src/MaaCore/Task/ProcessTask.h @@ -35,6 +35,8 @@ namespace asst ProcessTask& set_times_limit(std::string name, int limit, TimesLimitType type = TimesLimitType::Pre); ProcessTask& set_post_delay(std::string name, int delay); + const std::string& get_last_task_name() const noexcept { return m_last_task_name; } + protected: virtual bool _run() override; virtual bool on_run_fails() override; @@ -48,9 +50,10 @@ namespace asst double slope_out); std::shared_ptr m_cur_task_ptr = nullptr; - std::vector m_raw_tasks_name; - std::vector m_cur_tasks_name; + std::vector m_raw_task_name_list; + std::vector m_cur_task_name_list; std::string m_pre_task_name; + std::string m_last_task_name; std::unordered_map m_post_delay; std::unordered_map m_times_limit; std::unordered_map m_exec_times;