From 2478e5c1228347f59e250b8d32f65d2eb14764ce Mon Sep 17 00:00:00 2001 From: kaedelcb <57870068+kaedelcb@users.noreply.github.com> Date: Sat, 5 Jul 2025 00:27:26 +0800 Subject: [PATCH] =?UTF-8?q?v.3.2=E7=89=88=E6=9C=AC=20=E5=85=A8=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9E=AB=E4=B8=B9=E5=9C=B0=E8=84=89=E8=8A=B1=20202507?= =?UTF-8?q?05=20(#1275)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### v.3.2版本:20250705 - **新功能**: 1. 新增默认使用开冒险之证寻找地脉花,比之前更稳定。 2. 新增识别同一线路上的两种地脉花,绕过执行非目标地脉花。 3. 新增死亡检测,死亡后自动恢复后继续执行。 - **优化**: 4. 优化JS配置显示。 5. 优化线路2第五朵花的特殊处理,解决开花和战斗区域太远的问题。 6. 优化设定默认使用异步战斗。 7. 优化领奖速度。 --- repo/js/AutoFontaineLeyLine/README.md | 13 + .../assets/model/DIMAIHUA-da.bmp | Bin 0 -> 19650 bytes .../assets/model/DIMAIHUA-da2.bmp | Bin 0 -> 8934 bytes .../assets/model/DIMAIHUA-lank.bmp | Bin 3382 -> 2934 bytes ...地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json | 19 + repo/js/AutoFontaineLeyLine/main.js | 483 ++++++++++++++---- repo/js/AutoFontaineLeyLine/manifest.json | 2 +- repo/js/AutoFontaineLeyLine/settings.json | 33 +- 8 files changed, 431 insertions(+), 119 deletions(-) create mode 100644 repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da.bmp create mode 100644 repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da2.bmp create mode 100644 repo/js/AutoFontaineLeyLine/assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json diff --git a/repo/js/AutoFontaineLeyLine/README.md b/repo/js/AutoFontaineLeyLine/README.md index fee7279e..b8875106 100644 --- a/repo/js/AutoFontaineLeyLine/README.md +++ b/repo/js/AutoFontaineLeyLine/README.md @@ -111,3 +111,16 @@ 1. 优化树脂识别OCR区域。 2. log显示优化。 3. 修复图像识别构造函数错误。 + +### v.3.2版本:20250705 + +- **新功能**: +1. 新增默认使用开冒险之证寻找地脉花,比之前更稳定。 +2. 新增识别同一线路上的两种地脉花,绕过执行非目标地脉花。 +3. 新增死亡检测,死亡后自动恢复后继续执行。 + +- **优化**: +4. 优化JS配置显示。 +5. 优化线路2第五朵花的特殊处理,解决开花和战斗区域太远的问题。 +6. 优化设定默认使用异步战斗。 +7. 优化领奖速度。 \ No newline at end of file diff --git a/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da.bmp b/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc9467fc84db48cf906e2bf16a036117d91fafaa GIT binary patch literal 19650 zcmYhjWl&sQyZ3qK<5bOunVNa$ocDb!H$l1^*B08{1$TG%;O+$C1PLLyyE`=Q?(QCl zk_6eaI(h2Uq!zn2yZ4v%>r4OFB4nPJ`yapmX@M&Y{Fs3s2Kf2k{^P&E^*{dO>Aye! z{mZ{E&4cqz19Of2v-RSc($ps&$Z8 z-A*fSQ%iWOp7xHAU(2X!r&Wtt4a3yRZdUWC&cLev@TUIIhUMa!+3cCo*n!F9iP`*x z{^)_;$brS;rTNO0?%=NB;EvBx?teU{lUVbHxutsUhzj&U2t1uawL$^lyS zAhT|mSwF4kEpRr)Y!wXY!cP9`gIJJO{_GIZ00sj<~2<>j%eFQrl zTsbXl9Z$<|$|&n-9GGhm&(`!z0U+;ddS4Z{q?dR0Egt;=0^T23IqR7}YMb1xo8Iv% zYsI8yQ){|W>BVZP?=+t067y@ht;599c1pFF(L65fUDg>`6ZS0|PwX0v@9By+Os9`c zr%v=o_C)OorV5VvuJSu57-o-yv8GU^;RA6zsWT+nYF(rq6$pIkTS7}jqU>oxY84ln6< zjPj~mbQ`;MTe|cbyLe^w{PG6<`Zk@WZee4epuARC-6*W6aj2=wA6o!BD(hNo8r}Nu zZ+~RtqM~>9RdHK`cm@C|Ya7X_>3LP$nwH<#I=%hhuK^~5tLH;&7j?7Sj`>v@u`h6$ z1;qSn^|bfu&)x$pthydneILHKm0CN%?V4q`&IrXTMw7du{xxRPwBEp$>C};7{}#Am zHqYsg?wc=Nm`olBx|VpYv(6)%x*hXoBb$H;u@Y>5M6Yumm)wTg9 zywV1v_CZlYyP&>HR9>x9RnIFfS5^Ise_SS~ zy5~hf^Yen{oVtGS>BP?U#P-$b=H<}Z8MxL=Z(8M*t41ZN$G@Ofw4l-p)ShOmKg-d4 zozH6?AQUzd$~q}E{iMoXZs$C&bB^CR!)Tn~cFdVh9dMgxjQcnA2R1lu^T2ULy{o3v zhy0FtUelD_z?yOAyy3u#ux*x5){iUgGwfdAHBS)A`*ho9^jjzB)nam`Sf_o0Q8OTF z8P@BWG3cBy>7CYT9MEYRH0T($m|6o&gbh9VZT$vaV+K7F{E9}s<{nOQHLt9WS6ag> zsWoaJ;#4&V8oG7MtA&--f{JQ(UM?d$-KwGS?cikp%1OiUdRf;(|MJNnEWlcT%lxsB zceUcGzPZ8G(|;4&`Us2!0I8kc06^3do~uSDqhIF`iyAc2GSr`Et3A)r$|zzt_G5DE z@TDE(YB9ZWl-W2=sp!$^UnW=f>J6+Kk8W{WrVWR;b$XTz2iDCd4_VDq=Cg;4#&KcO zxNYB(dC#Iw*PLF@0->}ISKPy>9X9A$pw|wOD#d0!vpUVA_>yj6+XTCQP}n>yY#Gt- znl|d16xE4!+C~5Y%c(WP?r{(+02AFNF|ZR}WrJ>;m{U^CE3M;}RC5Z;O}d6T6%D|r z^vbIQ6_tXjI!10TE5AUes@y0)_ig`Z|MF?Ic(tTs9)t+6cK`C~^xB316Mj{rpuU4!R?jJ@h&sWc*Vt>;xcAl z5%a?bR@Q5N?pxi=SD8J-trI&{eaj$n0y6*`e_7a)S=~3Ve*WJ~0E&T?li~IAj)gt< zf)bVRNcD(V)tD5`a>sPb&i>i zF7s+TbpeppLA|zNzz3ulPEj?ttbv_h!7Zs{7ggvsbrQ4lIpwv$cQ}Q`)c5)9qB7dM z49cq%QDHXeS&ZJx#Dc*IfTf^i2IM2aA-kq;X#I3@SCV-FCGpZR@UPy51M%ufaCx0p zVvK57q;hDKQdE+9T%6|1EY-AE8ZYyek}?z%Gc?nSH8RR@`AwSH)#{nms_A9O56#TB zY1P*iN@<09gR8VEF$f*P-W6uG*mC*^m)DGXR}XR%vu?n+eTrJzVbL?kt{*WQS*HRf z`JLK%ZOm#APRES8rg;q`fC;6nm)|zduI<wx5 zZy(fc5$m>sYad84tb$5jRST!6hF{r2&&~lRLCE~TDz4N4c2ZJ7c%9A2Euds)kzObB za^Fy2#bY9z9Ns;xo?7TzJRDj*9b3Qn1LO}AU_900<(mGL{^jG;_I`YPf@);AYG}A} zc${)O7aWUw3n)BIqJ{zRKa>%qM1>F$*EIGFI9e1s`RXgP&0rl?}4X$K;_iy z4XshD#Jr9`|n$tKUXcz>ESg&)MUk76HxL)gkLHm%Pwq4ZJ ztJgjttnXkIR&pzv024rl^7*04Y~Z)aP0$amqoVih-d@AmcpE zP>zoK9ZAxZ64H?A1?q3|)zgbrUleI(6f3_fL?nOE$gHK*4XI~TBT@=LkYu$^f@I3; zTBgxT(N-Kd;KR^1@2YEUDm zP1rJ_-#$&N5Ywv%Sal=ZmPwtid2Z7{N*woUHjHBEvi4O8pJuQJqQW3*Bdm7avjheXMTM5@Fj zsl+6xJx^CjPEm?a)qI_+_A*;FIa5CFrAlh1e98yJ(*h7?vBe#VX$6YUil}wN8X1*@ z(r!-YBB8Vums`)S?A6Ms(0ExyDehvIwpsKopx@PL=QZiIP3gA|3!BGr1)a$E?acZS zYV`=ZWRTu4ZP2~MZ=L0IuILQ!=?-m+dX_;|!)_c00EMlS{KipMb)T?lz@TTGnperJ zXwhlvVHcKi%Nsc*wXFPdW^N%ZJsp=EO?dkj|0a`NT*)u3B%~%#GBe4qQt)AB*icJ+ zsxLOwlo)PAPj=FM?U&Wv(lWO7hY4_&!q(}+)~VL1t$^Z6xPP!(Oq^z7ib7DNd{~Tp zaJW)fghE(^Qf$1+(^Ob^jACMnd_tOhbgEMPOU2k1h?v*PugkEd-5}B`zbsaHS%Uu1 zpp{cksU4wI51`*wp);%KW!+kD%8+kLNG0v;icZs>Iqj@!?GH_WhM=Y!#9QrxE{*q{ z%$6Bi`wFFNgFkYlGkLBvajG+UX0Z6lZ2Onp$(`frFYDcJrt_x;!<+o32~I7@HIw}2 zL3(KuIj@Re)5iEv#0SBou!>z+P0z}vyn2C+3ngT{BD_iGl+^GmYDsBvw5&JOj5I>H zIWEePkminwvd2Z55u*+1Pi<{711m?y0h7_qi^h@lf|kk3-o>o$Ayilx%s)suI$kT~ zsX}lh0x)?JsvH@m7!sx!5up$pFB=@85EUmI6oH6HQix2Ek4i;EKi9}AL*}(8y)0LI zQ>OBwSmjj-Dz}N&IEnetgn3`9om)>W>r#7FruDj*Sk%U@?ltM2(axwuW>kTigi+Q* zENsIRbgAcb(OMSp^>eh|9lgab#+$cB8@HxA_hx(d=KBw}XOR0B$m=^4@B<3`1$kWF zn9l6!_0BSCdMG6gq`XRyZm91|xfRVI>9C7x81M6F8JXA^KVn8IA^oj{Nof`3WfDE} zHRD}6G0vWl?17KeMMc}=qC|uz6jGFknq(YY{A^<9WADNt@EQQ5eqz<+Wjfr?8!&+d zhHJ#e%0CGPHwYhp<)~=+CxHr~A+mv?GQgpN!es(N0vnmx{ zl&hwfE2ieFzA3}xw^AC$ky$m^yhhB2210HF@@5y<983icr)g zXqqIJicy7qn)!W{<^}EQX>!{-f8s)a`NnYlm&x{n**;{jac8#sV7_;6xN>8@^V9Y6 zKIkVDaR>Qc-55`9lZxv}1vQ+KI#PB4yR?CsQvjk0BR8M%?t^xWFX2@J@Et}$6|c0C zm>R*%cty#0NlEo2B-&#`1*m8nTo{q)qe%$k(w>@819`*iXH|Vmz;W6px8v)Y<^7+) zeZA%U{AIlSl>(p0`TM{)&ymBT_|-rfq~AyV#MQoe!mVNvjqNadKP3gJockT{hW z*&6RkRi0)mCcjgDTdka0pqWvL&Tqw64IM~F zo!M)__=Um3XS3BWprdp={O*2rYqxvNX&s@z%OhsKXBO4b-)1uN%E@ovlHa_-M!Jxb zees#OG~iZcRn!-W^tUf5S?PoXdu*@>6Kkm*F2aXu6Z|pw5E?zjOxqRRGk2KVFkaR* zS2MB5N=}pW3xxZ+!M)sN+}#j>yqfj9{St&9_<#n0LvtrHcT2x*$wxkF3z5!R#rSZBPtEX0r6jVDdzF^nlkkqc^-}fB4;McAHsJ&&V$)K6}o1UyM(C zO3%*L4z(mkT9dLrkl$wVO3PU}>9iLK)Qp$JWDjhpu6B%xb`TjCh$RMSqy5N~cq5WO zx4Lf$H_tMgW;EY-qlyPK@_I4V)42M1^}=C%>oTEZ4cD}y-MogWTcY;t z6FYWTW9P#8FTANw2CF|!c5Y2}@2n2*ZB8KTlLw3KAI1xp?1lmD^be%`8okzGgMoEn z%Md;#p7J&u6Cc6I$-%`qXvg`I-{p~BK4a(SG2gu=ML1Gk#F0`1v0*|?1PAkkg7w9c z18L|d0(_J){)rxlB&D5ml_PWX$Z&c8Kslc$a4$CnPe+)i72Mka;p!;s>;(64fqQ$v zJzW)__&xUYk_!rx^6^&)kCP7wRE|nkdzOv}iIa~`kq=E&dHG&3B~vLaSM7b1=KChC z53T6JPJlu^t4S@pMXRt^HMdK%Xo%9hOsbz#D;Pmm&S;iTA?ud0Z5tZZbNJ2;T-zG9 zc@@*Rf~sA_cWfbR7D?TEH1QFsW1HH&OKMtSw6C$+mU+EfAVC|>oa>Dr@w*p@`3=}N zAE>WiQQqg1Gjk|!UlLwDM<)bP(w~!_MW7R+sae_hr*VvTS9h5pnWQLX=}t<)e~ie8b@3i3-tas_8`v$(gEe z%hf-$t7O${J@b7A$j7OyZnQ*@{7CtOR(~bGV_Hx z^@%p|5#M*H-MLHXJ0uSrr`d<;6;8J`q}OA1HD_!3hBvFVwl%nW=&DCuPi zH7yY5&BpnY$f=>k1RqR{CoSHGln_Ep3@0Xd;Ug??L3;IrD^IH{6&$!QD<0fNAZw$i z;AJoG?}qU8M7X=c+*}{KxWc`>VD7+uJQV{1KpKMi_{#Z*$cIGBhs7$#q{+u;D5ie+ zXF!5VW|dZ%ShI8p*D$MDIi*}Qs8utkS~8(hI;~u>px(5L9sI~#{K4P2GuVT4wju7y zopAM@I(tK#|IS_hNu9VtcO4K%&KQ#)i37*ju3g|$nC3O=z!A1}16{w2tX{x3uj1<$ zv`Yq&AKD2OgXG##bbgywb~XBa4K}MpGdhA?P=!g1!bG_d5(0545txKvOsoes^Bp1m zH8DPr@HB!D?~V6iVT1Vilt|*UL}YRzIW?Y~96?OR87K-$#7=gj{6R2(Ebv-@b-xT~#R?S1q4JHm|8StgAO|BfF0Aqu1=!ThR`ry9*iY zLV}G4*5WOD@s=|Eoj!NNTe+o9eMa@45T~xFlb85`V_f&HM&*Kb+a_)37~8RhZrMQ9 zEaKZXagEEEx;b>^1gUvmt3-^g9@Z=tqktq;+Jk=m4wvlf5QKjkfsORg_Ge?lEz!yG#FwdBNlApKiIn7E36N+ZDNKM3ViooFqh0yZ z#yB~10?dYhu*Sn}SO`x;kbfmi{6l2C{1Cpra33FpyN9BWH*hXl?w5X`$?MkMjHFVUid*AyF!hg6KAe5;$uwT5w`b0y=oEFw1)56!L)3kn}0`` z)=gaJHnH!3BtD=F9&^PzqUL$yzIAHXI<|2hli!AVTZl`J$3-|1qTTUnk+>JJn1oQw ziyU-njCNuWDmDNeYKIEuXvg_rl9O<$aj5uEY+?j6)*K%#phO92kpf(}Zdl$M8B@HJ z5l+Se54Xk3+hAo)2?$rAoShNE!&&Z0q+DP)sAds<0Wc3gd2b(CPaip-V7Si{7_gI= zXKHV&HA@E6s;AMdYuL6mjp`ZYk}<7@HH`R_I`@sYdB@v*FgS%w&LD#$$lwGrIED-k zA){kRZy(}sK&<6E;?#HI#24z!SIy2t_VgGP`!H}*|DQhx1v$I1h60*R*?0} zAnK}D%%U2Wu^l_4fg{4evChl|FHijcT4%>>T@sq-(FI-T+y>06EJ{)+F2)O=5=?lL zh)GRCr@g@@MPd@4AY;AJq1NayJ$zCWJ}wj!>w`>)Ku5U{BMnKhI+Q3QMvS?3l$%kE zo3t6>FB7b^H4birm9xM}o0H{j7;+YLxU;!jKm;gL5y27gfDl>F5V&_B+%H7V>j~U1 zOx77Xb@~$Hqot{=&n6v_rB4>mE-t6YxDrqw1_P1M!s)Azsc8r{tA;6 zjZ2NdzfQ)yN=H6@jgJXNrUap)Jy4-Gs3<#PVkjZX10DB7JK7l=WsQw8XC;`EVr>}- zZqzt$O&7htOvzG~I2ju}!d6?_f-Gx6k+-19S}@^ud|5X~cwi(VI2s-tEfWw83y75U zkNT%qlw1(#0pk>&m#LSHYF5v{bNduaMi{fFR$m_MZy=Xj$oUp>zk_&t5(u{6Ae*m{ z^*6}$8Z!O}nSX|?zCniPklqm_*oSBv5Od>!x_pZnyVmME)#^OZ?A%lC+SeLBMGv16 zhffIoN2u0KRNIzT!z#LY9RuQR%Z6sds#eP;5}<3_Vh-#ho0iellgPpzt*lzqn?m%f zOmtcr{#A#b+%SmvNHm6IO6CYa>V0L5>Paa#c;8s+GB}>MF2eZ?KJDJEiS|9?$7PM>lKl_J z;TE#`E}>!f19G~BOs*jPb4ceDV(mecZHT!3fE@pf8n{$#*->lSR&C$a8adY(zW`|n z)3c}DwTJ24)oNNtfk@lDrct|~UOlH-x1`yy0z8W|xX&NjLzRyp3%azj>XGTis5jZ@ zmv3;do}*IYP-$;5iQ$9@H%xL6CfW%T>!leLqMee2e)a;B7)gzPLQf8(CkBvWJ@CP% z#1LJb1S^;&Ny-c>V~a=F5oD|xvW_M&TRz-|_t;7x>!2s+Y$0P~4EJyVh9MmoFBA3@ z9{o}(>jKgq4hEsot}+(@k%Q( z37Py7gjQ0N8!^#`5a)zViP4Np1o1>WC7GBKO^B_g9Pkki_)vYkAB7jmMgZHe z(3Z0!BW#Iswj61DW4OI8%)wCFRu?dlu``x+vO>7q$+|d82d78}C(1^?mX0le#eR4k z^+By@gtzk5{<~z4PIr*|1LO)p9>2Hj13|VwA;XW5-A~8`k}U8XT%EwDzwa%+L#AIL zy=%zh>jSyx40LuzClGStt7_+wYRj&2{RX^ZNwsYU)qSAUu%_0qu3R~%R6M3wHY%Uj zqg>c8pWCfcG^kcGqFFw!S~#FlJcKMA)GX{l=Cx{MRcpN|M81BHe)dW;=@~NdsaBX9 zIl`F|;|3}g^ouOb=ukqUKQGGp|q5r()B4k?654J5#<@zNG}S$hV; zhAe9*cx)+z+X>_V4SS)Slc9{g84OhTUM@23escbia^b1cVK1bkbLEptRX_CWZr?b3 zhn#*&{K5_d5a{0v7y~dB3lK(rK#sQ(8sH-@2=ay?$KTu}#C}0mKOmE@kmr~C|2tz{ zd-Nk^>j5);quzU}*0!%yzbRKdr&zTpU%8-MwV>6og2)??&+CO3_MxiBMB~TE%5nMJ z9wkY?FsM~Jf~^`;&+AgpYuEhH1ej=MlxTpFTVwwv46Wps7*P4g$KnzaFv-vGDaj;I-$psoV=S>zR+MN{VwACd zl9?dEh!(*khI6>_d`=uk+KM1!MR{yPhuKo4ZMcukIS41doRf}>qn?z5!6OHAxQ{c; z)!~u5znpKVj8CX^aGGpNm1gBUdFX<_@>95ZYYDQ+<%7d7$u>c(07e3Ufbe4TO9CMP zf}Z@g5P-t(Hx2OQ4k4gO`T|4%0ekd9@Y?H+jq$az13dHKuv zM93u+tC!B;x(?`5UpOnb+>Lw2`YlMcAe#UV_IDB=`C|_NLg4QOZU6^BBN&20e}@!c zOW-wNRN#FOSU{wugIZ^M=mZht~QUI?Edl$dhFpZ>jgxoP}%TIRQ)Pt^a?j{$yvU| zjenyq{xtn4Nw^?HfQSJIfc*mV01$$HGXXciX26qh2#SCt(FPy_9t2W0@F|-cNrvL? zLB!b`#^O)P%vVt7 zX5;YK#ZKDUO3KyopPu2e?p`w9p|ZXavf)|Swr$qjH|FeD(bfZD;yYvIUgrq1`XaFt zuwOs`Y!;9KS70Y#?|{Z1n~8#;nBSlPtFYgoJRc-gobV9h?LdU7ub|E+j$Px2E^q_q ztnn-6_?2+stIpC_LeIW>?TT{w44|PSFJ6)of@#Si#FtO$?=q>yW!(A}c4Z|s`;Ebe zMBy7h?PxPbijiKLzN{4!b^?SWAEX|bqoI_uv$TYXwVa2mv}b^v zyW3-rAQ|s)`IItp{|SHfr{VsCU;`3tLBaz`feJD&$gp6KfCIP!O8_wz&;VpYe!~GA zB7ZLc4J_b9;2pPn$l?>Edk6`3Aky@A%-}~5Ptbj**uG=h&;@(^iZXJ}oVcWpoGVo= zD^)H?Xq3&WR4*z4L=7AG-UINFX4fHp_?$fc5$G_i$xF)63AO)-+P6pV++eiKgR!;b zkW6+y^?5QiEee}O`2NG{wGEpLxTSdnBb zKuBT8IEdtI`3MIcX?rsn7kepJXDJtZIZqF1cXwG&Pbv2&QtsgjZ<<(BpY-?cO^zjv zzuCE@PzT?&{Z9!B;5EP`K$MVFBM%ZFVB>%ixcOs3f07Q!QOR7XPf25!K(%8}e_~HvQ%25Mqi4+FWA@-7r)P`aFhQ^EA>~z2(=!P#Q!sB{U<-=_ z7gu|J+~%EM8P?UZ-oMhxi6AB0a??y{K}>mTq`Wms)*KJBAj;UVq;2`KHhhGm(PMi{ zX*c`7dHVj#)AKJkH)#(K8Bf2z+(M-SpQ)8j(8sS#PbE#RDWCzGyGzL83*>PRd4uu; z6mP#R1TX;*03QGWEb!3bcS>@;lLQdMOG!{=Z9edJ9;i#V_^I!hp=$yt@B7ZQI*+tK zkKA*N0%3OWf;{yFJ#vK}x+F|}LiL}iwe6`lZ7J8SX*6zVHgBTacQ75hxb6c|{|R;Y zoHcpP0c-jbXY!Ica>5=u;`DAa8mAdmVp?Gx^=%Gt9L)0+!n<5zak=yG7^|#On3u!M ze5(IGjFez4NHQjeun|_8@|GyLIUZq61W8BAh6}eB$vByTNb;A5%YVB2J@WJfy0om1 z-(#;JDfckxs7$reDdNy2X#Wk*AT!Y6o=P0Y>{>zt)bk+Yfcnk#UJ`79g@DlN^*c37 zinJTZ@*8Ay1?iqZw6%NG;FrhWhu*&k$Ud}s7dA~ zsbuRlsEU${0u@r;^ z*xL|u{Q*1u13mT)J@yqp`x7_&gD`u8o%n*E_)M7ijO;s8?>W)vJ3|g%VP%2mv;c^0@dgmvilC%ewP%qAh0<6ge<;7#@CSO1mYh+y!{9I8W02? zNDKGm`8&qaJ$ddIb?J^ge@j|<&|ZNU>-V&kTk`x3Y5EIh=n^SDLk(SGCO%;of1&4Y z{?E+CH{b8d?jRE&zZ^ggr;x?YExBWh(!OCdb*5E1fvT9s)h**2R&n*~yxzm~pHTSq zExmP<*1X1US)$cWaw_|2`Ay8M0_uw-Zn6h0&YPAJKuPsyC3-XB9CefJ_-|}E$%aO$ z#_R~Tq74dWia}Tb;gN>0=g8WNr0n$nvNQRov;E&)ogaI7KJxaF@_r)oB=oPq=*NMv zvMI$H^((Zw?}jH2Korq!=e=k|QI=h8AU^pJ>5=>0`KOEHV=wpr^6>l1+g~;~>|a4~QlQ^? zRsqBuAioRtAYC8|9YCT(NdE*f0m1f45?+iiAW*CDc7aj^zI}+g3Q?9I+A>60e4sAg z6K8*sW_~i39vCYR>~)B-2J!bGa{r-l_!x-!l%-#!>2LUvYn1pLHSm$PaO3s`^7{s{ zC$2z=SaAoHfbR18-tq7!b?8j1b_rdxV7~H&(z}mq-=Pg(a%aDZR(|QM+zJ-Q));%@#Fl?Ym_vxa3-PugmPA04T(V`S?v^(H zi@ox|T9q&X3%me4OSpGWT)e|ge8r7@MvE_zy=U0rYvKBx{?3Ed8RYQ=in@d1ZysDf zK9DEApu3LMYF0I>7PV@Y3GI8>jy=lI1q(D9GvD;r9}G4j!!5{Q^TA-_L4V~|cj3lh z;hWLYH>1VRhLh*|;w@2mtxl>xDZ-o{X~v5)qetm6!*zHmM!Xb#gA`rESgxEUTGkvV zXMvZuBFbA)VYX~pYp$%F-oNb4rCe?Q<>LH*IeSa{`~IhY)IS0fWFylMSuNP1Gt%lU zcOTL_l{g4s0^A$`F$UQgJlThYyAU5}t(y?*_m&wO5NA{JD-+np>H}*Ttb1_7SiT1Z zFk|(ewE^PHFWlre%+M8nek}&J%_cx!YM7lA<-_x0f<&1_VPV#{s(>W7kTD8Ve%_>>@&DxMn0hjuaM#k zWZwm8{IlN19ew&MfAN=a?UuXp%jNtYOw4sRZh;4BcO79`cC>0%K_9AFzJRPc(`4GA_OA)v7d@wO!K1Q?6}klBK`YxmfRZ(9AA zntkUg?T4D}2gvpVOxLmX#&`FFTf>#_ys6JRi#J}EQ1DkM<_Glp0eW@=1%HP8F7KGY zkEXvEt^YJyy&-k(suWEs7fwj*q-q(}vV-qECJ%pPO@HOh--wp)jkh7=J;?kBvOI=t z&mo(0$ns3W$9(s}Wc9{i>_}AGD|i#ljI-eygH{SnA zUcTjk{q9Kuh-mi#Sb_w_I>g<8*dT!XUd%N~hX`g{+|>u#^mpxnkLq2=3Oz^g&I3@3 zYPIbV`cD~Sm+Yxe);m8b1Lq*Wm~H(uUj31G2l-vyl|4Yc5L67rhmW_E;g5ppFNRAu zz(~mL+ejctmd_!pmx1nt?>-_9oG~ZAaA&^@7Vivzod70>5D3n8K*6|zY%V1R1L6sY zwE9B_qRLL*i!g4CH8;VMnP|d_)E6e}Fx8^lK`2Jh<}79OGRg>WHzd{Zed2QKrSSA72^y5~f_ZBL=&00xxj_C2lMBQ$7gx{uJk zCzzgN&9;3kC`)=zjhDYhe0tz7|FGEm_3q}O1~l5AA9&NB==~=Q@iDb?4^u0tSLxlm zS{3uCT5zaoo6vPc9sbCk`X*ew1x!r#B`#xq0oh+ePG2C$FOcmOWO)J^ul>*;-WL^C zF%!Lnu{OM9OHPt0J6d0qWhH^=|om`q{3}kvNmjKYc9-A z2kvYFceR9jJO9JeOUmCzDj?*4`o+kGCm|9tCXWdx4swmoUu!C*8zX@0u7qtf^oH?NsHMt zySXz|^@4W&Dy~_Ag+BU;zwi?z8nAtv-$0zdLhj!o_Z!IRE9CeIn97~u)Tur=QJmr} zim~G+S#slzg~^7zBz;;WPn0Yq$Fhx5craTm+@7rFL{@jAD7!Gh0A1FOC1=Y;IEdg5 zMhb2g(r%9b@b-M<xpg7K|7pVS=GBPLC7A*Gm=A;yEVC+{c!9Icuu214Y@1F7E_nCBTG@um?k=RIOZ5s{n)VRj@Q`!Kimlt!71~Y84D?G~0GHyY^MO58wkQ8Uv?))DoZ! zAVDwOeFS6^?cNhy&oQp&$YSdkck+rccxt_UOYPiMEf`0Y&k`C|!Bwkln$)^(yLH16 zA7blP@lBhgu0z(uXPwnM5K)0u0Q2y<|F^;kumC3JTR%;v&rSQ5`I*mIp_aOdR`eKS zUbH?xUY{AsGk7ZGC2@@s*>ZMtc?X)36HU>DrQ}FQ*fC)C90fa$ygg6FO;6s{>@N?; z|K;QRkAUF6`vic%^2pmy#y?mFgxt_Xx%e!(rzHw+8x^zL<+D2E-}fox0u_DCXX{F} zY)+$WL8D>;Sp&`*ts(2zQ9uG}SXTwQN7DwXQ!@V6>^@ZNKT#8(VERwd;uA1K#}1sK zyN@UXXF#3CwC!S=w=7mZS#5kbn!U2$`NinmRx2D=FPYXXo5j>DYn9D1JGP(xfb7;j zg9w9bSR=OXPfbbJ=n;WlIMPZ#$&wXs zDvZ)+M+(4XM<&wOh9_ZQJP99SMr|U1a-?cJ~3Qdmqzt^v5>-*a;BUz?mGC?nBz( zsbK1g49+Q)&tdDA8C_d$`?qd;KWvsiYL-qTD;GgrwORjazHmkF*!Dd5$rbMcxd2zY zNN8Fowe8S*kA;gj=BJSBH^>JZDh9gNgM>*4kaSM(Oh)$g3QD+O;1yz_pJ2|70!^PT zFIvcq;)r6o+$ff10>?Zh5N<_Kaw03(Q(-QAxC0wu#{`j9#f7irtSjwd|39Au{?G83 ze}#ridAmz_xjypnfO&a>qe{}AUT{BuL}-G1T!zYva+S;`MQUXRNtv)@2N)5F*wX) zvHHdR;JaGhuwrJfLV7!+b=7R{%4F&URWb9&@SL{4+pd4%^dB(*x{^sk!xFt?lTg1* zY+5I`ZL>!%^|$Xqne77f;a`y3H^}`P^yC+4sPDiZCko#@XGPePg3U!SCfqQ6L6}G< zR>+Lxa3fjzQB1RFR#IiYqAdyGK$3T)z-%cBPE43B1L43?asx88NXo_RZywH%0-rn% z4wCkEeGHZd5N198^7N7M_L24vk_(HMPs#?v6l769s(b=dw}@@oAoUzj`;I9<3>-P9 zjb6}3F36)7cx9=+TebeP^hiQ)KrEvilg-a}3%ULdTxf z+BbUVCOo}M{!NEMdWUBIkVf7hx^f;1;zsuYW8jR~xkqT-)~;L889BCDzV=-EL~L9k zwXBmnb{Ty~ys0bw^`91}4|bqFIl8ynxwYN?VYTvEzr2ML~4t_){iiVK1(34%fIyY~7&t9ObO*orBZqCad2~7C-4vpBoJA=r@lEpCz!u9q8d!|q!%gB zjp4Dwm^v{mVI}$l2zv_Lo+@WcgWI!YZ8-=Ro@8q5W(N1Nk@0kZ zdAdk>c_IS*5g{Ru{ez_gf?&a6vQOWuysp5M43Jt^NnKlvzJ1Q}DHxnNwQU<_ZofUa63G;fl-kMw3f)A|9E15(>Isdbaox&=xUVk5AS zZF=uMQ+&woKVpHac%LWU(;qo9961#BZRykx2w$afqn#pOCxusbB$Jx^th@u}AMaWDcEhM$b8; z7wnNU+l7xFixBcG^4AAx$NJNK2`d&1~DV+~%ghcCFJSG>t_Ec3jhO#S5!GovbtFPc^qU2+(({F@U8>) zJeWsFBo}8;Yy)BcC*%l*%ixd(IN9}kIscLzgaga%7V-p@=P$_dJ7jnY^r(C0$}MO0 zj{${78`8oB0Af74z1X}Ea@{=f$;!>xOrrElhIUqg;=WYUJTs#ctj zep=3d6tzvzQxgcG&VqP*L5vkQ(u5mnzz^4D1oCvEc)HOXRw&&dmZ=*~p$FlCos_ms zSNANmO)u%hx*}{ys!mizN2-Q11?9<9_h74e^3>dgD*lFwUgj#^_G;k)T5$=K*Y9y} zvy~E))Z$|0Lt{~y75Jhqa?Kd6VH%wJM(1~-K6Ii!bZ8fekwrtSu60`P9=ZP%FcED* zU{dDzO)?q-brcwwf&~Vq|2-E215+?d1t0x;@($G3I|!U_vH1A=G$~Mkw;`QPNN4>) zw0f_%ac{i)0CWWRF~Vycejgsi}79V+c&f*Z*sU3 zH`baPWx|gum#V5eKkVEgzxjc2jN;+#JjYfjs~ee@+^JD_{a3{8<16_$c=GA%s7y z02xqyfyUn!3{6fYov%bgJA#b2A;Yx?ptzcD-03fTF&;lNp1rg^y?4L9x0pE*%&#%i2DU(21O;Ym|>p{cquRGirAZX8W_t|~AUPknViYh@oN^+12p(-f1k zGMN7p<=`L%KObgYuj9qN`QA_7*a>G~k0ahxT;BTLY~;U&zb*bd<@xq zg1qh|Up?>+U?%_tFcq+Ou>P3Jp93o3{=c7tcfgyz_mB%XAa@Cw9!ex5V_+V~5;(wd zY{1RIgVDk_o&Fu8j(Ma0Rh!k1w)3aL{BriwC_!onJ=R?m=g5q(=ERyB#u*#N7_cIR z!WbbdgsmIFHICv6B55X(G~-03D4r&YAuk<$ncTbpOltb(#S7cM?_!ajBoz;`mNQkt z#Fd5g5aw7doC9wK#LQx#7uRewj-C+=Ni3jnE}T71Bak_q4gbcm%dwENTMrX^2c%h(D-u&dj}{06L1A*RQ^x` z1_S7U_SX3Za`+5cfa%HFooL~Q!RDR)N6702^8E?=a;uHX098TewPA@5E){)!KtUCvw zvEZtMx&j3F@aXG+7f6gFEJsg(29gUdJPW`eZB==}K~)8$*1(G;Ev>jzGm-fyM)L*}kVQ#Xr&^%-|k-EW&Cb~HlaF$) z#WhW8GOAZKDJ@Zry+h^bEGIh4hrSvHCJ^_sFXrxUrEhJ1zxJ?i>a2{{9Ir2x@akf} zR_@ald37=#6>_MEH_93bY0xJ0*$TZ53C|RGDoX;)F?VI2yGrmbBVcRt{A}T=7Fl<9 z>FG~YXTMgAP0CZ}o#BldtWbeVgf<|C}M9gIZ6+J1H?dtVNei!=iFT7 zi(C<>w+?jIe$idoGGw0CJbA_K9(wn3c9<)>Z=G8u$A;I*>}nu; z>kKicF~V4Ts;GDc7PH`8BoQanZ73PR^eq}&7p@8^s5oMesF}DXG!~p+UB8$81DM=@ z^ylKnlbOu=)!Uob?r-v`b_u7D_{vK{h}5SM@`%K%6>~ZfkCrwX#9mD7#l;@8lp`fP zRqUk&4Hl8lE?{j!zA}$z@_9zuTqAE~GHt1h9ezALdmW4h~`d7V@h0_rr>xCR5^q?}2;W%rMdvFUqn$Ks|7Z&uh8;d3IZ}9CLkb?BoI)WSQy5J{W0)* z=CkPedHv{weta66%$UEqV@boEIm?c#cj+%CiGi?nu$egHCsUkhpn>XfQL$=UkCRS1 zbul{;udw#nZN0Rum$1ZWDuGiyn6}-Dhc%T+BNkIRdUaI^Y%KlRcgx!s(#!t=zESIJ literal 0 HcmV?d00001 diff --git a/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da2.bmp b/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-da2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..39c054b47729a860795116f976e899de825e052f GIT binary patch literal 8934 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 bd|9?J6iu(ci7h+<&oD{JJQAOM9N_(5MqdiC literal 0 HcmV?d00001 diff --git a/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-lank.bmp b/repo/js/AutoFontaineLeyLine/assets/model/DIMAIHUA-lank.bmp index 152c192acb61042c7d162497cf980bede88a08f2..3ba14ee75b5b0e48ac97ef59a1932823522230ea 100644 GIT binary patch delta 177 zcmXBJp$`FZ7{>A6aUAZVncd8U3xa5u1T&E)3QzDSm?VnI?G;5)G)WZw38El~CJDYf z@AmnI=RL=tMmn0VLYH4kyXc?|&o!xYL;la?FCR!YP6X0jO@NLh8YOjWh?nljJO`$z@=UOR+W(O}+-^*yn44IA)w6We!=|o@F|dr-3;hNd~^v zhLgX6InEA-KIMj!!?-}oVuJkKf`H)$=4@HN*3SiK4|hU61H;=lZzlD0x;dNqWSNF` zT8DMn1hkm=)EkDhnT54m08x0mMQEE@V!LTUuWjQL=gvv))jhU#lkBI?^;)wc?Bd?c zlbhprE%H0HA^qIe+{Lrp%Numl%GFYc8ks>p1s;665PjkO|y!G?bm8Xw3woY})?=>mt vHK}aZt7zA)>@sZWHmd0|%&yVSYS7PY(2uLtk8d_gXg12Kv@R-gU|;|MAD`3w diff --git a/repo/js/AutoFontaineLeyLine/assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json b/repo/js/AutoFontaineLeyLine/assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json new file mode 100644 index 00000000..b0a86cfb --- /dev/null +++ b/repo/js/AutoFontaineLeyLine/assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json @@ -0,0 +1,19 @@ +{ + "info": { + "name": "枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理", + "type": "collect", + "author": "平面镜&LCB茶包", + "version": "1.0", + "description": "", + "bgi_version": "0.44.3" + }, + "positions": [ + { + "id": 1, + "x": 4393.71826171875, + "y": 2265.736083984375, + "move_mode": "walk", + "type": "path" + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoFontaineLeyLine/main.js b/repo/js/AutoFontaineLeyLine/main.js index 191f8e54..6f7a43bc 100644 --- a/repo/js/AutoFontaineLeyLine/main.js +++ b/repo/js/AutoFontaineLeyLine/main.js @@ -17,7 +17,7 @@ } else { if (afterBehavior===1){if (xa===0 & ya===0){log.info("点击模式:开");}await sleep(1000);click(res.x+xa, res.y+ya);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} if (afterBehavior===2){if (xa===0 & ya===0){log.info("F模式:开");}await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} - if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{ log.info("识别到图片");} + if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{if(ii<=1) log.info("识别到元素");} return result = { x: res.x+xa, y: res.y+ya, w:res.width,h:res.Height,found: true } } const NowTime = new Date(); @@ -27,34 +27,55 @@ await sleep(1200); } + //ocr封装函数 async function Textocr(wenzi="空参数",chaotime=10,clickocr=0,debugcode=0,x=0,y=0,w=1920,h=1080) { const startTime = new Date(); for (let ii = 0; ii < 10; ii++) { - // 获取一张截图 let captureRegion = captureGameRegion(); let res1 - // 对整个区域进行 OCR let resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); - //log.info("OCR 全区域识别结果数量 {len}", resList.count); - for (let i = 0; i < resList.count; i++) - { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length - let res = resList[i]; - res1=res.text - if (res.text===wenzi) { - log.info(`·${res1}·识别到`); - if (debugcode===1){if (x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);return result = { text: res.text, x: res.x, y: res.y, found: true }}}else{if (x===0 & y===0){log.info("文本OCR完成'{text}'", res.text);}} + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + res1=res.text + if (res.text === wenzi) { + if(ii<=1)log.info(`·${res1}·识别到`) + if (debugcode === 1){ + if (x === 0 & y === 0){ + log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10); + return result = { text: res.text, x: res.x, y: res.y, found: true }} + } + else{if (x === 0 & y === 0){log.info("文本OCR完成'{text}'", res.text);} + } if (clickocr===1){await sleep(1000);click(res.x, res.y);} if (clickocr===2){await sleep(100);keyPress("F");} - return result = { text: res.text, x: res.x, y: res.y, found: true } - } - if (debugcode===2 && !res.isEmpty()){ - // log.info("({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10); + if (debugcode===3){ + break; + } + return result = { text: res.text, x: res.x, y: res.y, found: true } + } + if (debugcode===2 && !res.isEmpty()){ return result = { text: res.text, x: res.x, y: res.y, found: true } } } + + if (debugcode===3 && (resList.count <=0 || res1!=wenzi) ){ + return result = { found: true } + } + const NowTime = new Date(); - if (Math.abs(NowTime - startTime)>chaotime*1000){if (x===0 & y===0){log.info(`${chaotime}秒超时退出,·${wenzi}·未找到`);}return result = {found: false };}else{ii=8;log.info(`·${wenzi}·识别中……`); if(x !== 840 && x !== 1188){keyPress("w")}; } + if (Math.abs(NowTime - startTime)>chaotime*1000){ + if (x===0 & y===0){ + log.info(`${chaotime}秒超时退出,·${wenzi}·未找到`); + } + return result = {found: false}; + } + else{ + ii=8; + if(x !== 840 && x !== 1188){ + keyPress("w") + }; + } await sleep(100); } } @@ -63,18 +84,22 @@ var SMODEL = settings.SMODEL ? settings.SMODEL : false; // false 公版BETTERGI,true 自编译版本LCB var SHUOVER=0 //0初始状态,1队伍配置标志,2结束线路,3线路出错 var haoganq=0 //0初始状态,1好感队伍配置标志 - var SHUV = settings.shuv ? settings.shuv : 1; // 1 单线路,2 树脂耗尽 var Rewards = settings.Rewards ? settings.Rewards : false; // ture 领取冒险点奖励,false 不领取冒险点奖励 var Fligtin = false; //领取冒险点奖励标志。 var tolerance = 30; var position ={}; + var position_another ={}; + var repeatRoute = false;//线路重复标志 var Lastexecution = false;//线路执行标志,用于判断上一线路是否执行。 - var Fightquick = settings.Fightquick ? settings.Fightquick : false; - var Fighttimeout = settings.timeout * 1000 ? settings.timeout * 1000 : 240000;//战斗超时时间,默认为240秒 + var Fightquick = settings.Fightquick ? settings.Fightquick : true; + var Fighttimeout = settings.timeout * 1000 ? settings.timeout * 1000 : 180000;//战斗超时时间,默认为240秒 const ocrRegion2 = { x: 0, y: 200, width: 300, height: 300 }; // 追踪任务区域 const ocrRo2 = RecognitionObject.ocr(ocrRegion2.x, ocrRegion2.y, ocrRegion2.width, ocrRegion2.height); const ocrRegion1 = { x: 800, y: 200, width: 300, height: 100 }; // 中心区域 const ocrRo1 = RecognitionObject.ocr(ocrRegion1.x, ocrRegion1.y, ocrRegion1.width, ocrRegion1.height); + const ocrRegion3 = { x: 906, y: 928, width: 161, height: 100 }; // 下方区域 + const ocrRo3 = RecognitionObject.ocr(ocrRegion3.x, ocrRegion3.y, ocrRegion3.width, ocrRegion3.height); + var method= settings.method ? settings.method : "冒险之证"; var Rewardsuse = settings.Rewardsuse ? settings.Rewardsuse : "1/2"; var resinTypes = Rewardsuse.split("/"); var rewards = []; @@ -86,49 +111,61 @@ } rewards.push(resinType); } + const resinTypeMap = ["","使用1个浓缩树脂,获取2倍产出", "使用20个原粹树脂", "使用1个脆弱树脂,获取3倍产出", "使用1个须臾树脂,获取3倍产出"]; + const golbalRewards = ["","浓缩树脂","原粹树脂","脆弱树脂","须臾树脂"]; // 对应四种树脂 // 根据 rewards 数组长度,依次赋值给对应的变量 - if (rewards.length > 0) onerewards = resinTypeMap[rewards[0]]; - if (rewards.length > 1) secendrewards = resinTypeMap[rewards[1]]; - if (rewards.length > 2) threendrewards = resinTypeMap[rewards[2]]; - if (rewards.length > 3) fourdrewards = resinTypeMap[rewards[3]]; - - log.info(`使用树脂类型数量:${rewards.length}`); - log.info(`优先使用的树脂类型:${onerewards} --> ${secendrewards} --> ${threendrewards} --> ${fourdrewards}`); - - // return + if (rewards.length > 0) onerewards = golbalRewards[rewards[0]]; + if (rewards.length > 1) secendrewards = golbalRewards[rewards[1]]; + if (rewards.length > 2) threendrewards = golbalRewards[rewards[2]]; + if (rewards.length > 3) fourdrewards = golbalRewards[rewards[3]]; + const golbalRewardText = [onerewards, secendrewards, threendrewards, fourdrewards].filter(Boolean);//过滤树脂使用类型 + var doneCount = 0; filePath = "" // 读取原始次数配置 var rawTimes = settings.times*2 ? settings.times : "6"; - var color = settings.color ? settings.color : 1; - var BIAOZZ = "assets/model/BIAOZ.bmp" + const colorMap = { + "1-蓝花(经验花)": 1, + "2-黄花(摩拉花)": 2 + }; + var color = colorMap[settings.color] || 1; + const modelMap = { + "1-次数刷取": 1, + "2-树脂耗尽": 2 + }; + var SHUV = modelMap[settings.shuv] || 1; + var BIAOZZ = "assets/model/BIAOZ.bmp" var timesValue = 12; // 设置默认值 var num = parseFloat(rawTimes) * 2; // 直接计算乘以2后的值,并尝试转换为浮点数 - // 如果输入是有效的数字,并且在合理范围内,则更新timesValue if (/^-?\d+\.?\d*$/.test(rawTimes) && num >= 1 && num <= 198) { timesValue = Math.max(1, Math.min(198, Math.floor(num))); // 确保timesValue为整数,并且不超过上限 } var timesConfig = { value: timesValue }; - if (color == 2){ var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";} - else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} - else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";} + log.warn(`全自动枫丹地脉花: v3.2 - ${SHUV}.${color}.${rawTimes}`);//调试LOG + log.warn(`使用树脂类型数量:${rewards.length}`); + log.warn(`使用树脂顺序:${golbalRewardText.join(" ->")}`); + + if (color == 2){ var DIMAIHUA = "assets/model/DIMAIHUA-huank.bmp";var DIMAIHUA2 = "assets/model/DIMAIHUA-lank.bmp";} + else if (color == 1){var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";var DIMAIHUA2 = "assets/model/DIMAIHUA-huank.bmp";} + else{var DIMAIHUA = "assets/model/DIMAIHUA-lank.bmp";;var DIMAIHUA2 = "assets/model/DIMAIHUA-huank.bmp";} + var DIMAIHUA3 = "assets/model/DIMAIHUA-da.bmp" + var DIMAIHUA4 = "assets/model/DIMAIHUA-da2.bmp" var condensedResin = "assets/model/condensed_resin_count.png"; var originalResin = "assets/model/original_resin_count.png"; var fragileResin = "assets/model/fragile_resin_count.png"; var momentResin = "assets/model/moment_resin_count.png"; var oneResin = "assets/model/one.png"; - - log.debug(`DEBUG:${SHUV}.${color}.${rawTimes}`);//调试LOG - if (Rewards){log.warn("结束后领励练点和提交每日!");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍")}} - if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用!");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍!")}} - if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍!");SHUOVER=1;} - if (SHUV == 1) {log.warn(`线路模式 :' 按次数刷取 ${timesConfig.value/2} 次' `);}else{log.warn("线路模式 :' 设定使用的树脂类型耗尽模式(最多99次) '");timesConfig.value = 198;} - if (color == 1) {log.warn("地脉类型 :' 蓝色-经验书花!'");}else{log.warn("地脉类型 :' 黄色-摩拉花!'")} + + if (Rewards){log.warn("结束后领励练点和提交每日...");if(settings.nh === undefined || settings.nh === "") {log.warn("好感队未配置,领奖励时不切换队伍..")}} + if (SHUV == 1) {log.warn(`线路模式 : <<按次数刷取>> ${timesConfig.value/2} 次 `);}else{log.warn("线路模式 : 设定使用的树脂类型<<耗尽模式>>(最多99次)... '");timesConfig.value = 198;} + if (color == 1) {log.warn("地脉类型 : <<蓝色-经验花>>...");}else{log.warn("地脉类型 : '<<黄色-摩拉花>>...")} + if (settings.n === undefined || settings.n === "") { log.warn("队伍名称未配置,不更换队伍...");SHUOVER=1;} + if (settings.nh === undefined || settings.nh === "") { log.warn("好感队禁用...");haoganq=0}else{var haogandui = settings.nh;haoganq=1;if(settings.n === undefined ) {throw new Error("好感队已经设置,请填战斗队伍...")}} let nowuidString = settings.nowuid ? settings.nowuid : ""; setGameMetrics(1920, 1080, 1); @@ -235,43 +272,188 @@ const allFlowerCoords = [ // 线路1 - { line: 1, flower: 1, x: 773, y: 669 }, - { line: 1, flower: 2, x: 846, y: 696 }, - { line: 1, flower: 3, x: 902, y: 762 }, - { line: 1, flower: 4, x: 912, y: 812 }, - { line: 1, flower: 5, x: 876, y: 840 }, - { line: 1, flower: 6, x: 815, y: 788 }, + { line: 1, flower: 1, x: 773, y: 669 , xR: 4760.80029296875 , yR: 2574.517578125 }, + { line: 1, flower: 2, x: 846, y: 696 , xR: 4653.67138671875 , yR: 2531.894287109375 }, + { line: 1, flower: 3, x: 902, y: 762 , xR: 4568.48828125 , yR: 2433.225341796875 }, + { line: 1, flower: 4, x: 912, y: 812 , xR: 4553.5107421875 , yR: 2358.491943359375 }, + { line: 1, flower: 5, x: 876, y: 840 , xR: 4607.455078125 , yR: 2316.584716796875 }, + { line: 1, flower: 6, x: 815, y: 788 , xR: 4700.13818359375 , yR: 2393.348876953125 }, // 线路2 - { line: 2, flower: 1, x: 1160, y: 716 }, - { line: 2, flower: 2, x: 1155, y: 766 }, - { line: 2, flower: 3, x: 1117, y: 801 }, - { line: 2, flower: 4, x: 1082, y: 896 }, - { line: 2, flower: 5, x: 1013, y: 883 }, + { line: 2, flower: 1, x: 1160, y: 716 , xR: 4183.26953125 , yR: 2502.36962890625 }, + { line: 2, flower: 2, x: 1155, y: 766 , xR: 4190.03271484375 , yR: 2426.40625 }, + { line: 2, flower: 3, x: 1117, y: 801 , xR: 4246.28271484375 , yR: 2374.04833984375 }, + { line: 2, flower: 4, x: 1082, y: 896 , xR: 4299.75146484375 , yR: 2232.588134765625 }, + { line: 2, flower: 5, x: 1013, y: 883 , xR: 4402.5263671875 , yR: 2253.2724609375 }, // 线路3√ - { line: 3, flower: 1, x: 1216, y: 661 }, - { line: 3, flower: 2, x: 1230, y: 685 }, - { line: 3, flower: 3, x: 1282, y: 642 }, - { line: 3, flower: 4, x: 1335, y: 639 }, + { line: 3, flower: 1, x: 1216, y: 661 , xR: 4098.6328125 , yR: 2584.1611328125 }, + { line: 3, flower: 2, x: 1230, y: 685 , xR: 4063.5205078125 , yR: 2564.291259765625 }, + { line: 3, flower: 3, x: 1282, y: 642 , xR: 3999.6552734375 , yR: 2613.181640625 }, + { line: 3, flower: 4, x: 1335, y: 639 , xR: 3921.345703125 , yR: 2617.813232421875 }, // 线路4 - { line: 4, flower: 1, x: 965, y: 672 }, - { line: 4, flower: 2, x: 921, y: 660 }, - { line: 4, flower: 3, x: 886, y: 660 }, - { line: 4, flower: 4, x: 876, y: 625 }, + { line: 4, flower: 1, x: 965, y: 672 , xR: 2932.47265625 , yR: 3583.896728515625 }, + { line: 4, flower: 2, x: 921, y: 660 , xR: 3008.40234375 , yR: 3602.593017578125 }, + { line: 4, flower: 3, x: 886, y: 660 , xR: 3077.185546875 , yR: 3602.835693359375 }, + { line: 4, flower: 4, x: 876, y: 625 , xR: 3091.7978515625 , yR: 3654.750732421875 }, // 线路5 - { line: 5, flower: 1, x: 727, y: 153 }, - { line: 5, flower: 2, x: 752, y: 78 }, - { line: 5, flower: 3, x: 712, y: 47 }, - { line: 5, flower: 4, x: 643, y: 4 }, + { line: 5, flower: 1, x: 727, y: 153 , xR: 4556.0986328125 , yR: 4762.41748046875 }, + { line: 5, flower: 2, x: 752, y: 78 , xR: 4517.81201171875 , yR: 4866.47802734375 }, + { line: 5, flower: 3, x: 712, y: 47 , xR: 4578.63134765625 , yR: 4913.2822265625 }, + { line: 5, flower: 4, x: 643, y: 4 , xR: 4679.46875 , yR: 4977.8310546875 }, // 线路6 - { line: 6, flower: 1, x: 0, y: 0 },//开始已经检测,不用复检 - { line: 6, flower: 2, x: 469, y: 369 },//315 54 - { line: 6, flower: 3, x: 400, y: 343 },//289 - { line: 6, flower: 4, x: 371, y: 281 },//227 379 290 - ]; + { line: 6, flower: 1, x: 0, y: 0 , xR: 4962.818359375 , yR: 4395.8056640625 }, + { line: 6, flower: 2, x: 469, y: 369 , xR: 4952.037109375 , yR: 4468.8408203125 }, + { line: 6, flower: 3, x: 400, y: 343 , xR: 5043.3564453125 , yR: 4479.98974609375 }, + { line: 6, flower: 4, x: 371, y: 281 , xR: 5087.0234375 , yR: 4573.26708984375 }, + ]; + async function PathCheak(findFlower=0) { + + if (method=="拖动地图"){findFlower = findFlower === 0 ? 1 : 0;} + + if (findFlower == 0){ + return await PathCheak0(); + }else + if (findFlower == 1){ + return await PathCheak1(); + } + } + + async function PathCheak0() { + + repeatRoute = false; + var bigMapPosition={x:0,y:0}; + + await genshin.returnMainUi(); + log.info("重置地图中,打开冒险之证寻找地脉花..."); + await genshin.tp(2297.60, -824.45); + await genshin.returnMainUi(); + + for(let i = 0;i<5;i++){ + await sleep(700); + await keyPress("VK_ESCAPE"); + await sleep(300); + + for(let j=0;j<5;j++){ + let book = await Textocr("冒险之证",3,0,0,113,626,630,430); + if (book.found){ + await click(book.x+40,book.y+10); + await sleep(500); + } + let bookconfirm = await Textocr("冒险之证",0.1,0,3,113,626,630,430); + if (bookconfirm.found){ + break + }else{ + continue + } + } + + let crusade = await await Textocr("讨伐",5,1,0,127,98,437,900); + if (!crusade.found){ + log.info("冒险之证打开错误T..."); + continue; + } + + await sleep(500); + await click(860,683); + + let dimai = await imageRecognition(DIMAIHUA3,2,0,0,400,248,550,370); + if (!dimai.found){ + await sleep(500); + await click(956,288); + await sleep(500); + await moveMouseTo(956,282); + await sleep(100); + await leftButtonDown(); + await sleep(100); + await moveMouseTo(956,275); + await sleep(100); + await moveMouseTo(956,273); + await sleep(100); + await leftButtonUp(); + let dimai2 = await imageRecognition(DIMAIHUA3,1,0,0,400,248,550,370); + if (!dimai2.found){continue} + } + + await sleep(200); + if (color==1){ + await imageRecognition(DIMAIHUA4,2,1,0,400,248,550,370); + }else{ + await imageRecognition(DIMAIHUA3,2,1,0,400,248,550,370); + } + + let fontaine = await Textocr("枫丹",1,0,0,1031,641,250,240); + if (!fontaine.found){ + await sleep(1000); + await click(1562,787); + await sleep(1000); + let fontaine1 = await Textocr("枫丹",1,1,0,1031,641,250,240); + if(!fontaine1.found){await click(1524,670);} + await sleep(1000); + let fontaine2 = await Textocr("枫丹",1,0,0,1031,641,250,240); + if (!fontaine2.found){continue} + } + + for(let i=0;i<5;i++){ + await sleep(500); + await click(1529,846); + await sleep(500); + await click(1529,846); + await sleep(1500); + let crusade = await await Textocr("讨伐",0,1,0,127,98,437,900); + if (crusade.found){ + continue + }else{ + break + } + } + + try{ + bigMapPosition = genshin.getPositionFromBigMap(); + if (bigMapPosition.x >= 2900 && bigMapPosition.y <= 5100 ){ + log.info("区域正确..."); + break; + }else{ + log.info("区域错误..."); + } + } + catch(error){ + log.info("冒险之证打开错误G...", error); + continue; + } + } + + const bigMapZoomLevel = genshin.getBigMapZoomLevel(); + // log.info(`当前大地图坐标: X:${Math.floor(bigMapPosition.X)} / Y:${Math.floor(bigMapPosition.Y)}`); + // log.info(`当前大地图缩放:${bigMapZoomLevel}`); + const RealPosition ={x: bigMapPosition.X,y: bigMapPosition.Y} + position = await findFlowerPositionWithTolerance(RealPosition,10,allFlowerCoords); + if (position){ + log.info(`找到地脉花的线路:|X:${Math.floor(bigMapPosition.X)}|Y:${Math.floor(bigMapPosition.Y)}|线路:${position.line}|序号:${position.flower}|`); + let XIAN_another = await imageRecognition(DIMAIHUA2,1,0,0,0); + if (XIAN_another.found){ + if (XIAN_another.found){ + let recognizedCoord_another = { x: ( bigMapPosition.X+((960-(XIAN_another.x+XIAN_another.w/2))*(5-bigMapZoomLevel))), y: ( bigMapPosition.Y+((540-(XIAN_another.y+XIAN_another.h/2)))*(5-bigMapZoomLevel))}; + position_another = await findFlowerPositionWithTolerance(recognizedCoord_another, 10,allFlowerCoords); + log.info(`找到另一个线路:|X:${Math.floor( bigMapPosition.X+((960-(XIAN_another.x+XIAN_another.w/2))*(5-bigMapZoomLevel)))}|Y:${Math.floor( bigMapPosition.Y+((540-(XIAN_another.y+XIAN_another.h/2)))*(5-bigMapZoomLevel))}|线路:${position_another.line}|序号:${position_another.flower}|`); + } + } + + if (position_another.line == position.line){ + log.info("线路重合,绕过模式打开...");repeatRoute = true; + }else{ + log.info("线路正常...");repeatRoute = false; + } + + return true + } + else{ + return false + } + } // 输出选择的线路 async function PathCheak1() { + repeatRoute = false; await genshin.returnMainUi(); log.info("重置地图中,关闭自定义标记,快速拖动模式寻找地脉花……"); await genshin.tp(2297.60, -824.45); @@ -294,7 +476,7 @@ await sleep(500); await click(1446,350); await sleep(500); - let XIAN6 = await imageRecognition(DIMAIHUA,1,0,0,387,0,700,200);if (XIAN6.found){ + let XIAN6 = await imageRecognition(DIMAIHUA,0.5,0,0,387,0,700,200);if (XIAN6.found){ log.info("地脉花位置: X:"+XIAN6.x+" Y:"+XIAN6.y); position = {line:6,flower:1}; return true }//return true @@ -310,11 +492,24 @@ await sleep(500); let XIAN123 = await imageRecognition(DIMAIHUA,1,0,0,0,0,1720,1080); if (XIAN123.found){ + + let XIAN123_another = await imageRecognition(DIMAIHUA2,0.5,0,0,0,0,1720,1080); + if (XIAN123_another.found){ + log.info("地脉花位置_another: X:"+XIAN123_another.x+" Y:"+XIAN123_another.y); + const recognizedCoord_another = { x: XIAN123_another.x, y: XIAN123_another.y }; + position_another = await findFlowerPositionWithTolerance(recognizedCoord_another, tolerance,allFlowerCoords); + } + log.info("地脉花位置: X:"+XIAN123.x+" Y:"+XIAN123.y); const recognizedCoord = { x: XIAN123.x, y: XIAN123.y }; - position = findFlowerPositionWithTolerance(recognizedCoord, tolerance); - if (position.line==3){position = findFlowerPositionWithTolerance(recognizedCoord, tolerance);} + position = await findFlowerPositionWithTolerance(recognizedCoord, tolerance,allFlowerCoords); + + if (position.line == 3){position = await findFlowerPositionWithTolerance(recognizedCoord, tolerance,allFlowerCoords);} + if (position) { + + if (position_another.line == position.line){log.info("线路重合,谨慎模式打开...");repeatRoute = true;} + return true; } else { log.info(`无法找到花朵位置(在容错范围内)。`);return false; @@ -325,10 +520,22 @@ await sleep(800); let XIAN4 = await imageRecognition(DIMAIHUA,1,0,0); if (XIAN4.found){ + + let XIAN4_another = await imageRecognition(DIMAIHUA2,0.5,0,0); + if (XIAN4_another.found){ + log.info("地脉花位置_another: X:"+XIAN4_another.x+" Y:"+XIAN4_another.y); + const recognizedCoord_another = { x: XIAN4_another.x, y: XIAN4_another.y }; + position_another = await findFlowerPositionWithTolerance(recognizedCoord_another, tolerance,allFlowerCoords); + } + log.info("地脉花位置: X:"+XIAN4.x+" Y:"+XIAN4.y); const recognizedCoord = { x: XIAN4.x, y: XIAN4.y }; - position = findFlowerPositionWithTolerance(recognizedCoord, tolerance); + position = await findFlowerPositionWithTolerance(recognizedCoord, tolerance,allFlowerCoords); + if (position) { + + if (position_another.line == position.line){log.info("线路重合,谨慎模式打开...");repeatRoute = true;} + return true; } else { log.info(`无法找到花朵位置(在容错范围内)。`);return false; @@ -337,28 +544,47 @@ await sleep(500); await moveMouseTo(1064,1079); await sleep(200); - let XIAN66 = await imageRecognition(DIMAIHUA,1,0,0); - if (XIAN66.found){ - log.info("地脉花位置: X:"+XIAN66.x+" Y:"+XIAN66.y); - const recognizedCoord = { x: XIAN66.x, y: XIAN66.y }; - position = findFlowerPositionWithTolerance(recognizedCoord, tolerance); + let XIAN56 = await imageRecognition(DIMAIHUA,1,0,0); + if (XIAN56.found){ + + let XIAN56_another = await imageRecognition(DIMAIHUA2,0.5,0,0); + if (XIAN56_another.found){ + log.info("地脉花位置_another: X:"+XIAN56_another.x+" Y:"+XIAN56_another.y); + const recognizedCoord_another = { x: XIAN56_another.x, y: XIAN56_another.y }; + position_another = await findFlowerPositionWithTolerance(recognizedCoord_another, tolerance,allFlowerCoords); + } + + log.info("地脉花位置: X:"+XIAN56.x+" Y:"+XIAN56.y); + const recognizedCoord = { x: XIAN56.x, y: XIAN56.y }; + position = await findFlowerPositionWithTolerance(recognizedCoord, tolerance,allFlowerCoords); + if (position) { + + if (position_another.line == position.line){log.info("线路重合,谨慎模式打开...");repeatRoute = true;} + return true; } else { log.info(`无法找到花朵位置(在容错范围内)。`);return false; - } + } + }else{throw new Error("线路出错,退出!")} } - function findFlowerPositionWithTolerance(coord, tolerance) { + function findFlowerPositionWithTolerance(coord, tolerance,allFlowerCoordsIn) { + let closestFlower = null; // 用于记录最近的花朵 let closestDistance = Infinity; // 初始化最近距离为无穷大 let matches = []; // 用于存储所有匹配的花朵 // 遍历所有花朵坐标,检查是否在容错范围内 - for (let i = 0; i < allFlowerCoords.length; i++) { - const flower = allFlowerCoords[i]; - const distance = Math.sqrt(Math.pow(flower.x - coord.x, 2) + Math.pow(flower.y - coord.y, 2)); + for (let i = 0; i < allFlowerCoordsIn.length; i++) { + const flower = allFlowerCoordsIn[i]; + + if (tolerance == 10){ + var distance = Math.sqrt(Math.pow(flower.xR - coord.x, 2) + Math.pow(flower.yR - coord.y, 2)); + }else{ + var distance = Math.sqrt(Math.pow(flower.x - coord.x, 2) + Math.pow(flower.y - coord.y, 2)); + } if (distance <= tolerance) { matches.push(flower); // 在容错范围内,添加到匹配列表 @@ -487,11 +713,11 @@ for (let j = 0;j < 2;j++) { for (let i = 0;i < rewards.length;i++) { - let SHU = await Textocr(resinTypeMap[rewards[i]],0.3,0,0,510,380,640,600); + let SHU = await Textocr(resinTypeMap[rewards[i]],0.1,0,0,510,380,640,600); if (SHU.found){ if (resinTypeMap[rewards[i]] == "使用20个原粹树脂") { - let BUC = await Textocr("补充",0.2,0,0,1150,440,210,130); + let BUC = await Textocr("补充",0.1,0,0,1150,440,210,130); if (BUC.found) {continue;} } @@ -564,7 +790,7 @@ log.info("未检测到浓缩树脂图标"); } - var originalResinCountRa = await imageRecognition(originalResin,0.1, 0, 0,1555,0,75,80); + var originalResinCountRa = await imageRecognition(originalResin,0.1, 0, 0,1555,0,90,80); if (originalResinCountRa.found) { // await moveMouseTo(originalResinCountRa.x,originalResinCountRa.y); let countArea = await Textocr("",0.5, 0, 2,originalResinCountRa.x+originalResinCountRa.w,originalResinCountRa.y,originalResinCountRa.w*3,originalResinCountRa.h);// @@ -675,6 +901,13 @@ logFightResult = fightResult ? "成功" : "失败"; log.info(`战斗结束,战斗结果:${logFightResult}`); cts.cancel(); + if(!fightResult){ + Lastexecution = false; + await genshin.returnMainUi(); + await sleep(1000); + await genshin.tp(2297.60, -824.45); + await genshin.returnMainUi(); + } return fightResult; } @@ -702,13 +935,16 @@ let noTextCount = 0; const successKeywords = ["挑战达成", "战斗胜利", "挑战成功"]; const failureKeywords = ["挑战失败"]; + const recovery = ["复苏"]; // 循环检测直到超时 while (Date.now() - startTime < Fighttimeout) { try { let captureRegion = captureGameRegion(); let result = captureRegion.find(ocrRo1); + let result3 = captureRegion.find(ocrRo3); let text = result.text; + let text3 = result3.text; // 检查成功关键词 for (let keyword of successKeywords) { @@ -727,6 +963,17 @@ return; } } + + // 检查复苏关键词 + for (let keyword of recovery) { + if (text3.includes(keyword)) { + log.warn("检测到战斗失败关键词: {0}", keyword); + await sleep(1000); + result3.click(); + resolve(false); + return; + } + } //战斗区域 let foundText = recognizeFightText(captureRegion); @@ -758,50 +1005,58 @@ } })(); }); - } - + } + //重新战斗次数 var retryCount = 0; var executedCount = 0; async function Veinfligt() { - // 定义路线常量 + // 定义路线常量 var selectedPath = pathingMap[`路线${position.line} ${['厄里那斯', '秋分山西侧锚点左下', '秋分山西侧锚点右', '柔灯港上锚点', '新枫丹科学院左锚点', '芒索斯山东麓'][position.line - 1]}`] var selectedFolder = folderMap[`路线${position.line} ${['厄里那斯', '秋分山西侧锚点左下', '秋分山西侧锚点右', '柔灯港上锚点', '新枫丹科学院左锚点', '芒索斯山东麓'][position.line - 1]}`] - + executedCount = (position.flower-1)*2+0; Lastexecution = false; - log.info(`开始执行第 ${position.line} 线路的第 ${executedCount/2 + 1}/${selectedPath.length/2} 朵地脉花...`); + log.info(`开始执行第 ${position.line} 线路的第 ${executedCount/2 + 1}/${selectedPath.length/2} 朵地脉花...`); for (let i = 0; i < selectedPath.length; i += 2){ if (executedCount/2 + 1 > selectedPath.length/2) { - // if (executedCount>99) {log.info("未找到地脉花,重新尝试..."); return true;} - log.info("本线路执行完毕..."); - break;} + break; + } if (doneCount >= timesConfig.value/2){ SHUOVER=2;log.info(`地脉花执行完成 ${timesConfig.value/2} 次,结束执行...`); return true; - } + } const jsonFile1 = selectedPath[i+position.flower*2-2]; if (jsonFile1 == undefined) { log.info(`本线路完结,未达设定执行次数 ${timesConfig.value/2} ,继续执行...`); return true; } + + if (repeatRoute && (executedCount/2 + 1 + i) == position_another.flower) { + log.info(`线路混合其他类型地脉花,跳过...`); + SMODEL = false; + continue; + }else{ + log.info(`线路正常,继续...`); + SMODEL = settings.SMODEL ? settings.SMODEL : false; + } + const jsonFile2 = selectedPath[i+position.flower*2-1]; // 执行单个到达地脉花路径文件1 - const choicePath = `${selectedFolder}${jsonFile1}` + const choicePath = `${selectedFolder}${jsonFile1}` log.info(`开始执行前往都地脉花:${jsonFile1}`); if(SMODEL){ if (!Lastexecution || (position.line==1 && (i+position.flower*2-2)==8)) { if(position.line==2 && (i+position.flower*2-2)==8 && Lastexecution){ await pathingScript.runFile("assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下1-线路修复.json");} - else - { + else{ if(position.line==2 && (i+position.flower*2-2)==8)//特殊处理 { let pathDic = JSON.parse(file.readTextSync(choicePath)); @@ -810,7 +1065,9 @@ await genshin.returnMainUi(); pathDic["positions"].splice(0, 1); await pathingScript.run(JSON.stringify(pathDic)); - }else{await pathingScript.runFile(`${selectedFolder}${jsonFile1}`);} + }else{ + await pathingScript.runFile(`${selectedFolder}${jsonFile1}`); + } } } else @@ -841,10 +1098,16 @@ }else{await pathingScript.runFile(`${selectedFolder}${jsonFile1}`);} } - } + } // 寻找地脉溢口,找到地脉花就领奖,没有找到就直接战斗,再尝试领奖 - if (await VeinEntrance()){ + if (await VeinEntrance()){ + + if(position.line==2 && (i+position.flower*2-2)==8){ + + await pathingScript.runFile("assets/枫丹地脉花-路线2 秋分山西侧锚点左下/线路修复/枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下_特殊处理.json"); + } + await sleep(1000); await dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false})); await keyPress("F"); log.warn("开始战斗..."); @@ -852,7 +1115,6 @@ shouldContinueChecking = true; checkRewardPage();// 执行自动战斗并同步检测领奖页面 - if (!Fightquick){ await dispatcher.runTask(new SoloTask("AutoFight")); //固定执行两次战斗,执行自动战斗,配置器中的设置建议填你的队伍打一次大概得时间 await sleep(1000); @@ -869,8 +1131,9 @@ //退出执行 SHUOVER=2; return false; - } + } } + await keyPress("1");//防止战斗后处于特殊状态寻路异常,例如火神上摩托车,1号位不要放类似角色 } shouldContinueChecking = true; @@ -878,7 +1141,7 @@ log.info(`开始执行寻找地脉花奖励:${jsonFile2}`); await dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false})); await pathingScript.runFile(`${selectedFolder}${jsonFile2}`); - await sleep(3000); + await sleep(2000); // 领取奖励,开始找地脉口 log.info(`开始本线路第 ${executedCount/2+1} 朵花的奖励领取`); if (haoganq==1){log.info(`切换好感队伍:'${haogandui}'`);await genshin.returnMainUi(); await sleep(1000);await genshin.SwitchParty(haogandui);} @@ -921,13 +1184,21 @@ } } } - }else{log.warn("未配置禁用UID,继续进行!");} + } try { //根据SHUOVER决定模式 while (SHUOVER<=1){ Fligtin = true ; //领取冒险点奖励标志。 - if (!(await PathCheak1())){;await leftButtonUp();throw new Error("未找到地脉花,退出!")}else{await leftButtonUp();await genshin.returnMainUi();} + if (!(await PathCheak(0))){ + await leftButtonUp(); + log.info("未找到地脉花,更换寻找方式,重试...") + if (!(await PathCheak(1))) + { + await leftButtonUp();await genshin.returnMainUi(); + throw new Error("未找到地脉花,退出!") + } + } //第一次执行选择队伍 if (SHUOVER == 0){await genshin.returnMainUi(); await sleep(1000);await genshin.SwitchParty(settings.n);await sleep(500);} diff --git a/repo/js/AutoFontaineLeyLine/manifest.json b/repo/js/AutoFontaineLeyLine/manifest.json index b1c31c2e..294cd4ad 100644 --- a/repo/js/AutoFontaineLeyLine/manifest.json +++ b/repo/js/AutoFontaineLeyLine/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "全自动枫丹地脉花", - "version": "3.1", + "version": "3.2", "bgi_version": "0.44.8", "description": "枫丹地脉花,蓝花金花通用。生存压力大,请带盾奶;避免纯水输出,请注意说明文件。如有BUG请联系作者QQ:119996800", "tags": [ diff --git a/repo/js/AutoFontaineLeyLine/settings.json b/repo/js/AutoFontaineLeyLine/settings.json index 31e6530b..441e877c 100644 --- a/repo/js/AutoFontaineLeyLine/settings.json +++ b/repo/js/AutoFontaineLeyLine/settings.json @@ -1,41 +1,50 @@ [ +{ + "name": "method", + "type": "select", + "label": "默认:通过 <冒险之证> 寻找地脉花,一般不用改\n可选:通过 <拖动地图> 为原始方法,按需要选择", + "options": [ + "冒险之证", + "拖动地图" + ] +}, { "name": "n", "type": "input-text", - "label": "选填,战斗队伍,默认不更换队伍,如需好感队则必填" + "label": "选填:战斗队伍,默认不更换队伍,如需好感队则必填" }, { "name": "nh", "type": "input-text", - "label": "选填,好感队伍,如设定领奖前切换,同时战斗队伍必填" + "label": "选填:好感队伍,如设定领奖前切换,同时战斗队伍必填" }, { "name": "times", "type": "input-text", - "label": "选填,按刷取次数,默认6次,最多99次,树脂耗尽模式下无效" + "label": "选填:按刷取次数,默认6次,最多99次,树脂耗尽模式下无效" }, { "name": "shuv", "type": "select", - "label": "默认:“1”为按上面的次数刷取,选“2”为耗尽树脂模式", + "label": "默认:<1> 为按上面的次数刷取,可选 <2> 为耗尽树脂模式", "options": [ - "1", - "2" + "1-次数刷取", + "2-树脂耗尽" ] }, { "name": "color", "type": "select", - "label": "默认:蓝花(经验花)选“1” / 黄花(摩拉花)选“2”", + "label": "默认:<1-蓝花(经验花)>,可选<2-黄花(摩拉花)>", "options": [ - "1", - "2" + "1-蓝花(经验花)", + "2-黄花(摩拉花)" ] }, { "name": "Rewardsuse", "type": "input-text", - "label": "树脂顺序,1=浓缩树脂/2=原粹树脂/3=脆弱树脂/4=须臾树脂\n用`/`隔开,填写对应的树脂数字即可,默认:1/2\n表示先使用浓缩树脂,再使用原粹树脂,不填的不使用" + "label": "树脂设定:1=浓缩/2=原粹/3=脆弱/4=须臾\n用`/`隔开:填写对应的树脂<数字>即可\n默认:1/2 (表示先用浓缩后原粹,直至用完,不填的不使用)" }, { "name": "nowuid", @@ -55,11 +64,11 @@ { "name": "Fightquick", "type": "checkbox", - "label": "开启:异步检测战斗结束,即地脉花长出后马上停止战斗\n开启后,下方的超时时间才有效\n开启后,建议关闭配置组中的“自动检测战斗结束”选项\n关闭:使用传统打开队伍界面进行判断战斗结束" + "label": "默认开启:异步检测战斗结束,即地脉花长出后马上停止战斗\n开启后,建议关闭配置组中的<自动检测战斗结束>选项\n不启用:使用传统<打开队伍界面>进行判断战斗结束" }, { "name": "timeout", "type": "input-text", - "label": "最长战斗超时时间,单位秒,默认240秒" + "label": "启用<异步检测战斗结束>开启后,下方填写的超时时间才有效\n默认180秒,建议和配置组的战斗超时一致" } ] \ No newline at end of file