From 55ac84fe0df5c2e2b577dc30cc5e8b8b7796cdf6 Mon Sep 17 00:00:00 2001 From: yan Date: Sun, 11 Jan 2026 23:20:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(auto-tool):=20=E6=B7=BB=E5=8A=A0=E9=98=9F?= =?UTF-8?q?=E4=BC=8D=E5=88=87=E6=8D=A2=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=85=83=E7=B4=A0=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在SevenElement中新增矿物元素类型 - 实现基于路径的元素匹配和队伍切换逻辑 - 添加SwitchTeam工具模块实现队伍配置功能 - 集成OCR识别和图像匹配的队伍切换机制 - 支持自动翻页查找目标队伍功能 - 实现七天神像传送和队伍缓存清理功能 --- .../assets/Configure Team Button.png | Bin 0 -> 1211 bytes .../assets/Confirm Deploy Button.png | Bin 0 -> 2010 bytes .../assets/Leave Button.png | Bin 0 -> 2090 bytes .../assets/Quick Setup Button.png | Bin 0 -> 2499 bytes .../assets/Slider Bottom.png | Bin 0 -> 307 bytes .../assets/Slider Top.png | Bin 0 -> 517 bytes repo/js/FullyAutoAndSemiAutoTools/main.js | 30 ++- .../FullyAutoAndSemiAutoTools/settings.json | 6 +- .../utils/SwitchTeam.js | 210 ++++++++++++++++++ 9 files changed, 242 insertions(+), 4 deletions(-) create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Configure Team Button.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Confirm Deploy Button.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Leave Button.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Quick Setup Button.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Slider Bottom.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/assets/Slider Top.png create mode 100644 repo/js/FullyAutoAndSemiAutoTools/utils/SwitchTeam.js diff --git a/repo/js/FullyAutoAndSemiAutoTools/assets/Configure Team Button.png b/repo/js/FullyAutoAndSemiAutoTools/assets/Configure Team Button.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bdd02afbf3fa48bafe5e4a6d6440dc4222d41f GIT binary patch literal 1211 zcmV;s1VsCZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1W-vtK~z{ry_jum z6h#=v|Fd^3&^KCo1uaOl7DFHv@Pm;S5+ufe8d@P>RBF{i(E@^RsEHCxRf-9k7B%rD zLSl?j5=;|6nLvCY5U|01K%qb@lC-szCe*g1z1tU`XKuE)dpA(p-toI^_IYM^X8!Zc zv%51Vy4y}VnR$h<%^_G;1dapPjzCKBG%pZ@Ap&q#5W!}+Jb{kKS@6o zq^GB0*Q-^SmY1zcq8LUHqPO!bOY}`u#Zx;|9;NChS7OzQQsqSvLcrjDRx{uq5P?;1Q;3)*RItL zI$_F^MI>Ts#V|)toJRZKUCQ&L%^^4J6JcO*NLh(+`)z-9D$kELhxUE`Jr4i+yDAwQ zO<&c?^Oe2AUdLwWYcoIoTPi#81*+jE_9H7|%Yjf;x_l^}qhBIQ+{g zv|s8%L4GclFIk9Lg$44Oj-&~?>&{uIseBkk^hsb`K|Fn7dg9KvcVOnNA>`&{UiTfR zP3lHU>LWLpN8I?fO{=l2bb++FJ`*u5{P5#(oM=9S3l}?KlF!#?&zz2uc}1vrs0<;M zV_tz;LCp0=;U)fl%d)ZelY?k(X~l3jBFl7e1n16~joN2c`KC}iWfS4C4Run8D|9qi z*r5Y&D=!64S;Kpqm33om-T0`oqD*+oT)g%A2d-lM^Sh<5!)?2sRt0m5Z&y zzVc!S+QDig`3MI6D?@I3J*^tG(2R@Tj#fGGa&yLK8XYI&cTGP_ zf2^>8kLtIM4C>^mvv~Kzucgf_U%Cj}YE~=H19flEc3SlPd(p9J@y&lU$a0mK&`50Bu0*#f$%doEYwR=<6F*oX9Qk()=;-fh Z$N#3c*}3v~00009a7bBm000&x z000&x0ZCFM@Bjb+5p+dZbW?9;ba!ELWdKudX>eh4bY)!^&fNe22X9G4K~z|Uy_ow` z8`l-bzjs$pB!L7%LOhJIK)h^h2MWeE7#y3iYcd%-V~=Orv`N!W|D^uVNyqgx6Wh}y zO@`F2362Xf2FDM~8*IRU5C{pO7f4!Z_x1-V!UA-metm!1IeX68&)z-v-m{kkR_9{j zh$x9*ic%WCh(rX(l5=*}zT#PRuXsYCa4Z(%d0wSb84Ov*979n-enEboR;!8o6GGUT zlaj@Rh(vebh-=>N`1#S(fx!{4&+qg3L*Z~J6cNRkC`ug1$#`C=RH!r5nL4dLE3>Mi ztiJAWS!u~GIRFs1V*HQN)3DIgb*#>=i*}gMv zt^2FWlXf=BIMQeK2ZFb|{@dBrv$*ICMOaruZ}WrcYJx{ z+xz_w*VaS-FT}bTi8FgWtYIpUg~vv>UahiA`cwtn{%lu#(# zbML{A-S^%SM_fZAr1#?1@^TluD8`H8b0B^9MnQvU3qalyaE#FzBFGQl3Lh zL?jB|8gY5C9)TpWDm@m9-GA_?yv%yC^_W5~PtNd-vJHj8ckce=Sah;Ecn+lnsIj8X zhO#2$W)YQz3-?ovQOe#rO^k94r4mUy(s*n?t0p&#~Fyf#UB^F}R>= z8w{>J8W^fMP?={orJ$^@hwk>=XN(6=@Zs?|2f|TwK19zDrWW8_r4a#g88v2+5(|!0 z;&d&H2An@ZM2f%siwd!{IR~DOEVa4JrrdbBBv9t<4yV(_Ksji|#TJsS1Awcy(b0biqv~=3sZ>({nIp;d~Prn!=qYX+M%@)jMxrtSm28DwRl1=E31H28T+4 z3(cg!2tx2xH@$Wz!Ld~?A3FMQy^97z$kgBu=SYTvrD@J0p^z>NdREdvD`x8NOEi3rb&2N@oEq$ zXxas0+b~Hb2idaivz74HXfzBbw;%E4p*U~1d2XAZrNJ6jKh95E5y zgDg)|ZjM4OPeHLUe^|y|U~~r2C@cp2=^XSr)>5I%z(>s}v4A6(oJarI_KQ$lMTPk) zl`;jTW`89EB`o0EUM#JGQhd~m%O_D_+}<-+j}MNLOD)i<5e(tV?H#%W>%P6340Zfk zmZUSAa~a#v<4JtegHO*OQ-j~N!IF)hK};>c=|x0lO#una}B7oVQdzQ9)tua<;c|& zTOkT_sayvCI&Svi@3*KZu}}`yROOj-H+OL|8Grm}eP>rUqh$$%@I@DvylAV%dp1~d zV95ber<4%I;1s$ZW5?D>tJTyUt}z%kWZNt zJ=6*aF|7D8?MOD1lwBeK_E(kL%JwCv4_;nv)oRtrmgA2HhS}|{C}Gl$Stt5OVaSA9 zL1jEd31I==V6x5Lfg?Lxf3%^_VllsL+!z&}=dC5h?PpJ2`Ns`*(@!Z43z%ER-16o- zJ0Qd#DU&tU*Vfh6B)i(UQnm@TTGe!{zP0(-ZZf{I4pdj1Io)E+$=+m7K_P^gO}Xu7 z-#=7S{gyb2_Y}7O`czqI$=2m@^X5qiv6b!n&E@kIHtQSb$TOQRU1&dcq;6Ng?*KTC zJ5*Es=RbaYV1MQAPtw>TgcRiGefG)awo@mzsq(#BIJ^*8)yw0&; zjzMp;SIUPx1A|z zQGBjhQH)BlU;Zc41iphKWa3?ZL8-Lkz`Rb`?$VPRnF)vz;dmLx%LtdYM<=hU-9vM| sgU;b;zbFx2Cg*q=Aq0d~G;dG;1IL+=p{x6i*Z=?k07*qoM6N<$g64q1L;wH) literal 0 HcmV?d00001 diff --git a/repo/js/FullyAutoAndSemiAutoTools/assets/Leave Button.png b/repo/js/FullyAutoAndSemiAutoTools/assets/Leave Button.png new file mode 100644 index 0000000000000000000000000000000000000000..58c150b41d9146dd8aa68756046654be85989f14 GIT binary patch literal 2090 zcmV+_2-WwAP)eh4bY)!^&fNe22fs-~K~z|Uy_ow` z8`l-b&wXfD4m530Tf=wfH8gsYzL2>G?~_&jMJu_=@0p(zjda6Nq*^cI_+ep zld-3@UB42?5FBD--j5gz7;Lb>AoK!(p3Cmu{;;YHSQ7Gset(kgo;{zlckem(?m>(( z00;&A9@kS4(8Sg|?mSswbPRkRLaKc4V5(L5H zU7ehonV5XC@M3v+d1Yh6FKlkAd0wwiD=M_)Tk>kFZRPKk8T5LUiYD>4Rp{yDP?}Di z$T|{<_yfV-{^714d!}cehQpCW6RW%(olaX@ZEHPoq_*0o)oM6SwF`d5KCzV@d&iO_ zxjo*V-l5xfet2$QOyyBxqLfxv>_2<@Wc`6^qrpH3h6D=&xnE4Z`VfIYaQyM~zpmbT zG%+R1@@uhU(rPu$P4(y7+pN}7HP5Gtce*@3J?Oi3<2$Fz^I8l3RS`n0WhEbaO=APD_K zqn%w3*4EbFIa|@P!+HJY_p`HelJs&dNAb_*>~}l69V^Z~Vk??`Hh<&Wjy0ce8{X$z z?;RMKoSuE-97|D>B=rr943CZr!lp7p0l>bv^ssL*vi+^R4A5dDjTe}-DUaWg=ZBI5 zu&tF;wlbeX8otK7af($i82aw+y{3b8N&Up_2#E!4xnoUm4j6HgMw55>{f?aO!@aVWCNw3;5#u#JBUBKBSaDY{rtb}4E3 zEiSGHgaH6BB{gSB^F`p(qU`X7bpP-2%!A}^XJ(%P0NHQdm*mAOk{y$P2{!Koq5=S< z%S0I#*l@A%I?EafPc`rFz@k}XgKYfxWV($EE*s4jK9UY`a4*l5tFWUf+^ ziW8*%6O<8UGxu}(X&(!$MkB~AkJf|Kl$DtQ05~t#yt^$?k;+!m@Jp0oiRPI5xioxL zeDJmW=ne#ZzyJ{7Tq`~H`$ScFhf0bI0RZnSE7_f1{UK?(fQ&iHU*=tqhOSC851Gd< zjop@h{uaW~15&gqmp1O|v!<#70B}iB!7glD8*Taw=}l4g>XJD4Z)vs%gdixnFnU8C zy9Gitfsv_1b>s_NSex8!MY$CKaK0tCth6YJ9c{jdw9ykP^R0;em*gk+V=w?

=WS zia2sTx-TGvG7E{VEs4*Xs!CHYevjDqjXd2A;?9E!6M|Cz zWoh_2Vhk}RGZ}EQB>dn+3&(K?A)KCWXsEBvF`E*Zik)9Eznl3S(!IaP6P+N53G4*% z{y)T?uOZ@R?m21jN+O5FMFq`G^-2o?xnE4VJ>G9FU%PR;<1N2wQW3`Z%Rl_)Tzf0e z^Pn6xO<9>O&5fnSg?rsfK?qg9U(wQhP+>#tpj}yEJ$>r9A;l8(rZQ(|{p!5!6*JrjVtNqLejSY2s5rJNxcB=K*u_K3c zI_=i+ZQGr-tmML{=Kx?}a5NMSzbkfny5Z!p!ylhJW6sXnaf$r-Pk)3h=c=r%42va) zG1=jCzt&M8t}w=VxjF4;PM<%eUmlC^3Wh-3^!9)BT|DZb$dr^MyCgMxN&@%dMx| zjyD~wGaB{ryBp4h$9PMHiortR@Z{8NPwznAz{rZz{aRo`NKv8X@S%q0#sg)gMI6UL zqTbH@^oUl=;{-L*?eRXhzZe`I8yOpaHfP@v;x&c@5j-yE;0D!f%b*IbyV#zUYU!0q_udKM-9&a!d5=DvQR9dYj*PLz6Hd(EuMFkd1 zUT(H2Gc8S*92~{ZP7KMi%yCqs;gt?pTrtKZNeYF+!BAKb1VPx8BuQqBU`z<+IF92~ zTCG;2<}t>pS5LIO_$;u#8tbd7DEWW(bkXLfu)gNHq)$ literal 0 HcmV?d00001 diff --git a/repo/js/FullyAutoAndSemiAutoTools/assets/Quick Setup Button.png b/repo/js/FullyAutoAndSemiAutoTools/assets/Quick Setup Button.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7e37512f40bfd647f38ddab4bee296ab96b2d5 GIT binary patch literal 2499 zcmV;!2|V_RP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L30O%)K~!i%%~^MI zQ&%26&)r6H?*?~cV=#f376T!HWOjCEw*9yJ&Gw7zPBJ0XNfrVagA49eZn9*{U9x4r zJ?Ba?a(@qIXL82Z^K@T3_jiB&S$&WGWqV5-aHg;tX&E`NZ5ul~TiD&*0brZI-y>4; z%9`LUu0?8ECU&A*91++e%?12kNek9WV9bVPlx-JmwL2PHTie*&3?m$gU~79D z(d{UowacedGFA%G)6+Q8k(HH+?5r$voSK>vf6Ax9T3zzlJ6mC@2T4oH4k5BDE2~%x zh2UQZVs_4tU~mzk&kMh9T;7w=Byt3(3jJMtNxo+Ag-B{mV8q)Yl@{>p@CNOoepaNw5Ml{U@rm2x;4A zX8ri>&0GBUWhW*leOTYvH0t#^NF~Ya>?~AQpT(W8uH(kFtEeb1G3xW##5coX43CWC z$-2uRZ5a0I;{2JypBkJ0(I z8>`gg|0m8+|J$#$;g5g#7OfY~8xM4xmS5_etd-2o$no!)_YP?DaEwd z(D5m|z6aUME57UBKm3e73QW6wob4RxOtEdtKpve0tdLP?E<%rih{4hhu2%r#z*?S@px34(n0tIl`m z?(N6Q>e?Zx?;|ev=JUbBxl_=*Rf6 zM_gfhaA*|cjEeFqu0TO-EK@?8@!v-vOm7-qqYAi;T?r32G2x?&4##InT$0w|M)vDjP7tp*{(~--u&dItTd4y?Gc}unWJup;=kM@ zLW1L6Hr_w9G4x^=Q@yqsI_`dCW3t=E=89}7euGO$umQTrgr4saS23W%;8P*bBK=+Q z+nD}fWAsgIDENftY_KZiMX_r?1xu8+ij+eVmy_RMxOIyRCUFH7z}Z%ynStig0}E{r zQgHcu3tw=w-A}>Adls5*TIL#Eo36yq9{O*n|Xm#D1pi^2O6$hxb_zd zcmA1z_CJvze^)fc{CWY0@|NZf3pf61;r2gx&7UnaT(gj08heIQM96K6_LuPGd&K2- z+~nB`-);9TT>qPedgdp&#W6`H{CUEu=s1mYI+w?L8rm(~{JVu#?t-T<{xAoSyN;^F zJV;z6Q=)8g0_7oDUW-I6>bDq*DNh_X;@9Zf6yB4a$3i-r^A2J7$&e%s{WkvzwGPxq zaEiH6pzo=T*+EwPALGKQP>`Dbz zh=|-`?lk3n$jxM&hA)4WVm_>%gahp zQdD%P(r|*s8RaSQAae|qqbxC(QAOmoNuYLJX-SdMinO#i@r1H#8`M?OmbisN`8?h|cpt_N+GT2Otq(zUKjhvgpq<2+8%byf9p zeHsyUIh+gIaF8&i2?hCi`!r!6aWx~=Mg8J(D+&wp_qN3el>00*Go0$B5z=!=vKpZ| zE@(jK+!>|bT|_UUrf5CYWxBnNB*q*x`H_=GxE6h5DbX__=!J=VifD7PIa9X2| zyYVD?XJca>I&NJGLF$O+SwblTx^3K3I3yuP*u_rJMK6=^qyc@jvR zig<$6Nc#G|^RDLuo;`nITF*O&~c6BAiau$frZl_n`atI&k^Yg=5tt8IFhx zB04tVGtJQMo_^EUQ(H`*2NQLmQ^-TeZoD3k>BL@cYemP+b`v2J_H-)o;4J+YP5vb5 zC7%=7;gKu%WW4J8SCIV z^D$bVMq02!{xREpnB@!i2%dhQS-`~9wD}5WzHu&w5L#Zw+UmObl91@GN)@EPBBmHo zz`#~jS%!wX8so8~7M}tuG(SSR7NeZLb;h^c0dYYKm4syjf#8zqeP}^ybBMSeV?GTs zn0UP+o^Om!$D02fSpLzMc6xRpY;KQ;$E1F|+8ji(8o7ZJbvPct{{R5Wz^L~J0Eqwq N002ovPDHLkV1idH(&YdE literal 0 HcmV?d00001 diff --git a/repo/js/FullyAutoAndSemiAutoTools/assets/Slider Bottom.png b/repo/js/FullyAutoAndSemiAutoTools/assets/Slider Bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4af2e3cb2cbfae1e2b64dab230b8f1753fab2fbd GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BS!3HE91=ODbDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9E$svykh8Km+7D0srt#W6%9c zvKIZZNAqcu;7g^`mj4Vw7JX~8?b3Hkc5&@bE#7s}sJG)xz|Grt{^-RRa&25V;gP=9Lq-J>PB=pSVaTU~+}n;T;R@gFbLD zu^gPtuOD%;``MHqz7E%YzqDzwJ(ko97giLEGdUCS=E|v1J)oZ$JYD@<);T3K0RVgU Bbaem# literal 0 HcmV?d00001 diff --git a/repo/js/FullyAutoAndSemiAutoTools/assets/Slider Top.png b/repo/js/FullyAutoAndSemiAutoTools/assets/Slider Top.png new file mode 100644 index 0000000000000000000000000000000000000000..7334e462d3aaf4a0dcf36f6b50a4da22abfb8fc4 GIT binary patch literal 517 zcmV+g0{Z=lP)#2meK|Hies_SI zLX+l+xgzHDUlXw%yshMd@ZuNJ^SYw00000NkvXX Hu0mjf5ToL$ literal 0 HcmV?d00001 diff --git a/repo/js/FullyAutoAndSemiAutoTools/main.js b/repo/js/FullyAutoAndSemiAutoTools/main.js index 16c65a5d3..bce42d556 100644 --- a/repo/js/FullyAutoAndSemiAutoTools/main.js +++ b/repo/js/FullyAutoAndSemiAutoTools/main.js @@ -40,8 +40,9 @@ const config_list = { } const SevenElement = { - SevenElements: ['火', '水', '风', '雷', '草', '冰', '岩'], + SevenElements: ['矿物', '火', '水', '风', '雷', '草', '冰', '岩'], SevenElementsMap: new Map([ + ['矿物', []], ['火', []], ['水', ['海露花']], ['风', ['蒲公英籽']], @@ -51,6 +52,8 @@ const SevenElement = { ['岩', []], ]), } + + const team = { current: undefined, currentElementName: undefined, @@ -302,6 +305,7 @@ async function getValueByMultiCheckboxName(name) { async function init() { let settingsConfig = await initSettings(); let utils = [ + "SwitchTeam", "uid", ] for (let util of utils) { @@ -671,6 +675,30 @@ async function runPath(path, stopKey = AUTO_STOP) { log.info(`[{mode}] 路径已执行: {path},跳过执行`, settings.mode, path) return } + + const entry = [...SevenElement.SevenElementsMap.entries()].find(([key, val]) => { + return val.some(item => path.includes(`\\${item}\\`)); + }); + if (entry) { + const [key, val] = entry; + const index = SevenElement.SevenElements.indexOf(key); + const teamName = team.SevenElements.length > index && index >= 0 ? + team.SevenElements[index] : undefined; + + if (!teamName || teamName === "") { + log.debug(`[{mode}] 没有设置队伍: {teamName},跳过切换`, settings.mode, teamName); + } else if (team.current === teamName) { + log.debug(`[{mode}] 当前队伍为: {teamName},无需切换`, settings.mode, teamName); + } else { + log.info(`[{mode}] 检测到需要: {key},切换至{val}`, settings.mode, key, teamName); + const teamSwitch = await switchUtil.SwitchPartyMain(teamName); + if (teamSwitch) { + team.current = teamSwitch; + } + } + + } + try { const one = JSON.parse(file.readTextSync(path)) if (one.info && one.info.description.includes("请配置好战斗策略")) { diff --git a/repo/js/FullyAutoAndSemiAutoTools/settings.json b/repo/js/FullyAutoAndSemiAutoTools/settings.json index 2c7c90039..7c6654fbf 100644 --- a/repo/js/FullyAutoAndSemiAutoTools/settings.json +++ b/repo/js/FullyAutoAndSemiAutoTools/settings.json @@ -49,13 +49,13 @@ { "name": "teamSevenElements", "type": "input-text", - "label": "7元素队伍配置 按 火,水,风,雷,草,冰,岩 该顺序填写", + "label": "队伍配置 按 `矿物,火,水,风,雷,草,冰,岩` 该顺序填写", "default": "" }, { "name": "choose_best", "type": "checkbox", - "label": "择优模式", + "label": "择优模式(默认关闭 优先跑之前没跑过的)", "default": false }, { @@ -66,6 +66,6 @@ { "name": "autoSkip", "type": "input-text", - "label": "自动跳过运行快捷键(独立BGI的快捷键请勿冲突)" + "label": "【测试功能-无效配置】自动跳过运行快捷键(独立BGI的快捷键请勿冲突)" } ] \ No newline at end of file diff --git a/repo/js/FullyAutoAndSemiAutoTools/utils/SwitchTeam.js b/repo/js/FullyAutoAndSemiAutoTools/utils/SwitchTeam.js new file mode 100644 index 000000000..f5e6bb4cf --- /dev/null +++ b/repo/js/FullyAutoAndSemiAutoTools/utils/SwitchTeam.js @@ -0,0 +1,210 @@ +// Party Setup +const QuickSetupButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Quick Setup Button.png"), 1100, 900, 400, 180); +const ConfigureTeamButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Configure Team Button.png"), 0, 900, 200, 180); +const ConfirmDeployButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Confirm Deploy Button.png"), 0, 900, 1920, 180); +// Slider +const LeftSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Top.png"), 650, 50, 100, 100); +const LeftSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Bottom.png"), 650, 100, 100, 900); +const MiddleSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Top.png"), 1250, 50, 100, 200); +const MiddleSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Bottom.png"), 1250, 100, 100, 900); +const RightSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Top.png"), 1750, 100, 100, 100); +const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Slider Bottom.png"), 1750, 100, 100, 900); + +// 翻页 +async function pageDown(SliderBottomRo) { + let captureRegion = captureGameRegion(); + let SliderBottom = captureRegion.find(SliderBottomRo); + captureRegion.dispose(); + if (SliderBottom.isExist()) { + log.info("当前页面已识别&点击完毕,向下滑动"); + // log.info("滑块当前位置:({x},{y},{h},{w})", SliderBottom.x, SliderBottom.y, SliderBottom.Width, SliderBottom.Height); + click(Math.ceil(SliderBottom.x + SliderBottom.Width / 2), Math.ceil(SliderBottom.y + SliderBottom.Height * 2)); + await moveMouseTo(0, 0); + await sleep(100); + } +} + +// 滑条顶端 +async function pageTop(SliderTopRo) { + let captureRegion = captureGameRegion(); + let SliderTop = captureRegion.find(SliderTopRo); + captureRegion.dispose(); + if (SliderTop.isExist()) { + log.info("识别到滑条顶端位置:({x},{y},{h},{w})", SliderTop.x, SliderTop.y, SliderTop.Width, SliderTop.Height); + await moveMouseTo(Math.ceil(SliderTop.x + SliderTop.Width / 2), Math.ceil(SliderTop.y + SliderTop.Height * 1)); + leftButtonDown(); + await sleep(1000); + leftButtonUp(); + await moveMouseTo(0, 0); + await sleep(100); + } +} + +// 切换队伍 +async function SwitchParty(partyName) { + let ConfigureStatue = false; + + let foundQuickSetup = false; + for (let j = 0; j < 2; j++) { // 尝试两次 + keyPress("VK_L"); + await sleep(2000); + for (let i = 0; i < 2; i++) { + let captureRegion = captureGameRegion(); + let QuickSetupButton = captureRegion.find(QuickSetupButtonRo); + captureRegion.dispose(); + if (QuickSetupButton.isExist()) { + log.info("已进入队伍配置页面"); + foundQuickSetup = true; + break; + } else { + await sleep(1000); + } + } + if (foundQuickSetup) { + break; // 第一次找到就退出循环 + } + } + + if (!foundQuickSetup) { + log.error("两次尝试都未能进入队伍配置页面"); + return false; + } + // 识别当前队伍 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(100, 900, 300, 180)); + captureRegion.dispose(); + let currentPartyFound = false; + + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + log.info("当前队伍名称位置:({x},{y},{w},{h}), 识别结果:{text}", res.x, res.y, res.Width, res.Height, res.text); + if (res.text.includes(partyName)) { + log.info("当前队伍即为目标队伍,无需切换"); + notification.send(`当前队伍即为目标队伍:${partyName},无需切换`); + keyPress("VK_ESCAPE"); + await sleep(500); + currentPartyFound = true; + break; + } + } + if (!currentPartyFound) { + await sleep(1000); + let captureRegion = captureGameRegion(); + let ConfigureTeamButton = captureRegion.find(ConfigureTeamButtonRo); + captureRegion.dispose(); + if (ConfigureTeamButton.isExist()) { + log.info("识别到配置队伍按钮"); + ConfigureTeamButton.click(); + await sleep(500); + await pageTop(LeftSliderTopRo); + + for (let p = 0; p < 4; p++) { + // 识别当前页 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(0, 100, 400, 900)); + captureRegion.dispose(); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (settings.enableDebug) { + log.info("文本位置:({x},{y},{w},{h}), 识别内容:{text}", res.x, res.y, res.Width, res.Height, res.text); + } + if (res.text.includes(partyName)) { + log.info("目标队伍位置:({x},{y},{w},{h}), 识别结果:{text}", res.x, res.y, res.Width, res.Height, res.text); + click(Math.ceil(res.x + 360), res.y + Math.ceil(res.Height / 2)); + + // 找到目标队伍,点击确定、部署 + await sleep(1500); + let ConfirmButtonCaptureRegion = captureGameRegion(); + let ConfirmButton = ConfirmButtonCaptureRegion.find(ConfirmDeployButtonRo); + ConfirmButtonCaptureRegion.dispose(); + if (ConfirmButton.isExist()) { + log.info("识别到确定按钮:({x},{y},{w},{h})", ConfirmButton.x, ConfirmButton.y, ConfirmButton.Width, ConfirmButton.Height); + ConfirmButton.click(); + } + await sleep(1500); + let DeployButtonCaptureRegion = captureGameRegion(); + let DeployButton = DeployButtonCaptureRegion.find(ConfirmDeployButtonRo); + DeployButtonCaptureRegion.dispose(); + if (DeployButton.isExist()) { + log.info("识别到部署按钮:({x},{y},{w},{h})", DeployButton.x, DeployButton.y, DeployButton.Width, DeployButton.Height); + DeployButton.click(); + notification.send(`寻找到目标队伍:${partyName}`); + ConfigureStatue = true; + break; + } + } + } + if (ConfigureStatue) { + await genshin.returnMainUi(); + break; + } else { + await pageDown(LeftSliderBottomRo); + } + } + if (!ConfigureStatue) { + // 没找到指定队伍名称的队伍,抛出异常 + log.error(`没有找到指定队伍名称:${partyName}`); + notification.error(`没有找到指定队伍名称:${partyName}`); + await genshin.returnMainUi(); + throw new Error(`没有找到指定队伍名称:${partyName}`); + } + } else { + // 没找到配置队伍按钮,抛出异常 + log.error("没有找到配置队伍按钮"); + notification.error("没有找到配置队伍按钮"); + await genshin.returnMainUi(); + throw new Error("没有找到配置队伍按钮"); + } + } else { + // 当前队伍就是目标队伍,设置成功状态 + ConfigureStatue = true; + } + return ConfigureStatue; +} + +async function SwitchPartyMain(partyName, disableGoStatue) { + if (!!partyName) { + try { + if (!disableGoStatue) { + // 强制去七天神像换队 + log.info("强制传送到七天神像切换队伍"); + await genshin.TpToStatueOfTheSeven(); + log.info("正在尝试切换至" + partyName); + await SwitchParty(partyName); + } else { + // 先尝试在当前位置换队 + await genshin.returnMainUi(); + log.info("正在尝试切换至" + partyName); + let switchResult = await SwitchParty(partyName); + + if (!switchResult) { + // 如果当前位置换队失败,去七天神像再试一次 + log.info("当前位置换队失败,传送到七天神像重试"); + await genshin.TpToStatueOfTheSeven(); + log.info("正在七天神像重新尝试切换至" + partyName); + await SwitchParty(partyName); + } + } + genshin.clearPartyCache(); + return partyName + } catch (error) { + log.error("队伍切换失败:" + error.message); + notification.error("队伍切换失败:" + error.message); + await genshin.returnMainUi(); + } + } else { + log.error("没有设置切换队伍"); + notification.error("没有设置切换队伍"); + await genshin.returnMainUi(); + } +} +this.switchUtil={ + SwitchPartyMain +} +// /** +// * @returns {Promise} +// */ +// +// (async function () { +// await SwitchPartyMain(settings.partyName, settings.disableGoStatue); +// })(); \ No newline at end of file