From 6d941c3ecce91c26904f0bf73ddb040a702750fd Mon Sep 17 00:00:00 2001 From: mno <718135749@qq.com> Date: Sat, 27 Sep 2025 00:27:41 +0800 Subject: [PATCH] =?UTF-8?q?js=EF=BC=9A=E9=94=84=E5=9C=B0=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E9=BE=991.7.0=20(#2006)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repo/js/AutoHoeingOneDragon/README.md | 5 +- .../assets/targetItems/镇压沙暴.png | Bin 0 -> 7117 bytes repo/js/AutoHoeingOneDragon/main.js | 198 +++++++++--------- repo/js/AutoHoeingOneDragon/manifest.json | 2 +- 4 files changed, 102 insertions(+), 103 deletions(-) create mode 100644 repo/js/AutoHoeingOneDragon/assets/targetItems/镇压沙暴.png diff --git a/repo/js/AutoHoeingOneDragon/README.md b/repo/js/AutoHoeingOneDragon/README.md index 24d8b1868..134b3acf8 100644 --- a/repo/js/AutoHoeingOneDragon/README.md +++ b/repo/js/AutoHoeingOneDragon/README.md @@ -94,7 +94,10 @@ --- ### 更新日志 -### 1.6.3(2025.09.17) +### 1.7.0(2025.09.26) +1.优化路线选择逻辑 +2.等待时传送到七天神像,防止在奇怪的地方等待导致趋势 +### 1.6.4(2025.09.17) 1.修正莫佬乱填的路线信息 2.修点小怪路线6504,6508 ### 1.6.3(2025.09.17) diff --git a/repo/js/AutoHoeingOneDragon/assets/targetItems/镇压沙暴.png b/repo/js/AutoHoeingOneDragon/assets/targetItems/镇压沙暴.png new file mode 100644 index 0000000000000000000000000000000000000000..38d8c1bede3ff4c511312978e7bc1adf0c18f7cf GIT binary patch literal 7117 zcmWkzcRbW@97pzyu8_^q*)t?N>*B1OO=O;Z$;ckrMNalUbtIINEkfoMp(4ajc30Mw zQJml7k9*yC-S_VEJkRGnKJRauxv3!w<7Gw)3JMmuk)9=Z4g?QgdfKyB!Aor5i89#I zP?w@%jCT{fq4v^2=ul8JW-%SR(t!62K}L4L6cnueXAjDuz#4Z73Z6S~Jsm6W8;^>< z215?o547HlW3!dKIcIfvY`M~+bL58%&<}-HnoDPpjTg#GYL6+~;j3ac?F4<9C`%ce zk_g$7ww=Zc4=pH~lIXd4M0mI#KUAjXu>Yv0SX5ZHu#mBZ@_jH~td4Yg_T}C|;Qf|u zQgn>2Z)CL_m$(u_M2n-cu`%03tbcTrF*rE*-5q&%op&w%x|QmFbAw6-8Ip8Uv8f(*s+r5D()3%M6xl}9PSd^ece`cjsqj*X z{!Jl7YlT9k&3i?ws~%!vV)WEh*T(6Z&BqRtT?NyH3r%Q|Ncb~LauMH9uhNH-gC1j0 zBL)h}IRBtT;|VlO>%o_OQ@VM?e7hUn%O0{CD7UR`xSag^%HYsYb`WRINC7NeSFKcx ziy0#@wmjWKzIt=!WTriM{ct76?D)e-x`!PsJpqSuSK!`(TxO=VfF!xA$D;~u7b5Yn z2&QIAdYJv#fhBG!Ye|(=$8M~hElHP*ZQ^-GRLeGckeSJf!{G`_N}#znUF|MaR$xfc zQ%cz$g~=Ui&XK>a3TMkbw@R0^Y1ldFIpsqTO0$d_(AP2(J?xZ}ly-hknN`*LjBV$6 ztj-hgCBfxL>n~hjvoX*+ja(`L^Dg1xTtjHbRXFB`9M{Tv;PI80U4Iqu%;(Nk9sjWD zx#Q_ctN-LNG;MP7uDhK9<|*&$DrZWgRPokUz*xz(8^YPcg%5G4hnbne^i&vV_K5pO zrAG}7GCn>&=AztlE%JU$1pH$fcEr>xzo}-WyBc=pPE7A3kTG%vXNT8*caMCo4l8wCGPv{#D299w;5RrOHaj6uu4fu?R{|wME{z-I{kL14qscF z9{uk?2wp*y)6hVu^5PmB+4Y~$C+T(_?`45L0_UUUN1Lbv;nsF1eyO*zwq7%#c5!u$ zzi`D=PDyD+VnhxmCFQ<8R(kK=y^5O(SlHju3w-p+N>YSDyp)yrw4xt_6rnkQfQK>r z+Fl})K+jcH3K5Vk%WnxTbbgG37MzVL%0{Xj>f% z6V9!Fd5W+odmlW`|9vJnrB`mk=1v`fttr}u4lykV;M?L4y7q97 zAX`{kN)sp|O%Rrq&B9>r?(OZtBqW~VaG6-F@L+QC#FSbQ7JWQ}X5~}Y^UxO+eigeI zqo?z>k&kw3-c>aFzn!L(`}>7nT>O`X`7?wF=>j+!ot<2B8=Il-lSp>x!O6sgMP6Rs z$B?c~IV5q7;Sc6z+7b^mauvQx$aGBVCa`gF_8 zb&j=G>;jT8&4B57U7g-}m*WLhH#fKAt*{=>|NO${ zl|2&{u9f7aZbo1U)V9KJ-OTiYi<-l1b;WDH+Q;-sfd zG%+)qiu_ZailI&@t|F00*J6%U&D3|PC%m7eunFwt_Z*9c?QEYPN^nutHZ-KGudh$V zZb)7$Ui^}dLxFveV)ZhDBJIrLDP)vM*@^ZjOiR7sLAbc#O?*I|KjnfLrLz9!3p4b=JEB1EvU44C2vHTe5(SIg+(6oH# z2nHmwu%u+AG;CpM@|iIZ2rO(%J3%`*Sn*}o9%HiWdB!A1wvUd(QgD}|kCU^y{{GTf z7zZ;AT=bTdluQtLRO=X8M~pD_rj$dd$Zm9)O5_UjvaTQVr|EeI2Ci>bA5gw(YwOb@ z@3Mh5SBLxyXJx032My>y_n_Z(k3?#e%1BD0Nlr=O=HYP*3VQ4!m+Izzo;v;<9VehqW77%868}2`U{=7!En4ACiCGhJbh(0?K8SQ&PpS}M< zh1g@Gwz9JP{DXqKO?jKD4cT1DOCm;LWm^e&m@E)E)9P#}17Zp$BeV8MWkHZXi!@;< zAg`vz_;zLGDN}_ds;H=FraStI>ekw~j*t`}yLeF?v^_NvtbmX&8@%(M4ppyUXV~`Y z@eyIZCw5UKT>V{5tpo<@vZ0)gotVU@&CW(>ReNZ_{*3_}5wHDrQ4ujUk2g#(nZ1J& zA3Q!5#;h1X>?|Ps>fv!v`0M6oi`%!&1kVc=nqczthrl%|-G>R02U|zhHAJ-lcQq91waNfYmi-H$@B*BJal@sl7oF6-Cpaj4qhm|f`ux0_Y~-^k z)M=@<;9KI$p0P5G&TNlVgQ^nE=%Vg!&BY3LJJ7p)b1f4gDY>~9Wo~yr^q-r-CBoJ( z-wF#;K_C!T)7I>1df{8`>*2)uR>vFDAzFs#OiWEHQI~6LEgc+6%r zfk;7nVXSO*l)4B^zo&)a?G|DTBzbF@XVX9Ga%Cu7%Yq|N(fM8qo#T~ zg|f<$wv&G08ma6_({`z7yxJpdSus*^hRV{XihNk=8!c z-R@bqaa(2?(>zR^e)(@9-?aK#L(-UBFAKfN=ra=3Ftu-zRwjQzOTm zVJkIwL|RW9xU)60XfX-Ly!%6(eqLX{MyGX1IWS-W7TFFMQBqQp0>a5jdapPhZt<=j z&cw(_Pi>{pp$~%q`M-ojS|C5OkwQX3QiW}4S5}jrzj#4fTg%fOamOs4k`Effij}!= z{ngVAw=C^@$%$r^E~-=lCF%q3-!o&N6SK4F;&D*zK{OY?z?E#Hw&FY@%n0+q)sI#X z!suH4jar%zARpkt3?<+Mxpb9u9#anKaqwmKgqI{ICzotr%e)a2qlq>lx)Wm=;R zPIK*{{!BnEw5OC3baLw*=H!?;Ic@V+*CHA82-1OA3!6eA>9}PJpUh=JBNs0PSkWjh zPt2O5LC0O6gI5n8#GNPQB$_Ua+q4f-4s%~_g~DSrE~a_k3k|&!q2Jg<`=h}iqoZN{ zc;5+Q%43^H9H=x;1qZZ#ytTG?zJ;amA(J)0MRRjAES=t2#jRV7iq_Wrm)(CEH43TN zklQnjiKU&PSZXAOAlY@QwXG;GpRFih0RjEru(!YU&G^=>obuOK5ogv(#4z)*i5R?k z%EZLv@W>M-J~BBu+4HO`)^MJh&m|(F2-KhnG^AwlDq{I#<&96%(;{#V(9KiTW{Qf6 zH!LjJ4Q4&0^s+|E%gV@K(rtw1e%i0Ct#NU2RdjWglpn8L+2|Pi+T?W&*qDrr49%IH zAvSNWWF3XV-%Llq(zgUInwpuh0Zw3MWmQmDH-SO0;KKE?NLIkjC%at|Otw3F;b^ox zfYX(V8qEY5X-R!^y;nLG7bPSm#id~H3(Wwjc#&fUkqfZ36*=vn$ckn!-*Bf!-BFFK{BR?YqAJPCQypr5cXMkEsXx~1jrkCh?EHxUTLr_n;>31f+VD^ZZB>`zfOm7v!JL&rFfUCe5>wRf z0B6G0%;h}0e*4*Acby-`&Ljkx)SUQx0;UzgiTl*;%n>sdTYK0WNl)-Kud=cWr z`G-D$iLzBL%$Gmy-t4avU=!eI2K>)Un}AC7gqNmOUx*f(L=>-MKlJtK0%Dr!43nK} zZB_iI$CKxQ{{D`^-A;^`^#W@O+PcyjjxmCAJbChDhg5#b3&(5_iB+AQ#lGc#;yC5O zEQoY63*t=)S2tBCTmc8*T{OrO*rfvwG65zR6IcQot2}t1YR_+OZ8=M8pCCZM*VNSP zm_IdAEAvF5(tM{I+6{0uF;Brh1AB8mb0yv@)oZ-uPh8=g2fPlNI&jBm;9^LR{1h5+ zJD~ivH8DMQjx@*_Le8k>t=X`rkG7AfR!rR}Ulmuc9g*as#wH?pF-5R+Lw!STom0s7(XhJU= z{2&rvnG^$c__y6N4u=1l=g(bW5i=}n_+v==?+IY{-&?h)pe;6B^1ctV{JZAI* zx%gpLRwp7bZfVIiA~Lc)@}Qx7T8i-f?;m0m`Dh*31yFT5EFCZzgH40uS+|y456e{a z8eef-US4)rs6YkmIyyNa;P5noX;JtYBDJ;mw2hL1Oxq6Nj!*S0AX|$)+x`n4?)qTr zO18NjoqHpNRS1sR{uW>%1+XM4D$1)7@rmZz!ethb){L=QPak#u^|cShWfm&8EG#JB z?oBEPME_>zly#1hdbcbu+Gxu>*YdSBP~c3dP`pp+C9C)k(~NDvUU4Y7?O1RyH=bZr>gsWZ?;J_=6;hOG&+Lae9fGpD}{N8CtjJ z#rU&C=&6cT0@vQgn`Ut~Z)|QZZGG$HO5Wviu_fMr{$wnPiL)()cxh^C>H(EdZEYvDGJu{9ga12PVv8LH2EV4E!4rfAU@XN>z?Omv06-IZ z1qTKOls-+1NHV5{m)w*1kRjV`1l8*Mek|M?@J*OEl=!COuNr6}K$ChHQI&P>5Fn**himX?kYzsO8`k}QwSXtS}l{z!HC zGxGBjNWPqkieYT57PuzrXf+?~-stG)E9p6;vof2$Fgx#1JsF971~wnWNnl?KN=u*B z)jh0tXq^Ph_wWz}hsTxNdt|0r+16I@tuySFrKPUhEfL@p|Dj}W$DUl>4dGNmTBANRRR#xwTAio15?PP`OXg5Aj z4LbM?VBnJyRWua=Pfy!_ykV#%d|8@8uvDQvd=~_%gC5@Qg}^np_|F;m`bzry`*&Yq zWnr0^o*v@79o0KLOuyfQX8yi1l9P%xva{m`F6>@N$kA0N807mzmEjq&k;yTkTk{OK zbNDzctN=ICcTAO=o6D;a`UKErQDdV#zlr*PVB4ck{!GtzhwxZHoL0rt6KZRLo9FMR zK!)5vfo;5ER!05baJI-#V6fKKJi%VtIy>Wfddf#e;0lGzKtiv#ZkyZLjkNd&oJ>y6 z_JPvQd<`30;t*@s?>%GH%>Ltf_1J&JMJ|4R&r|XVuX^}fSvucge0#bDkcPQS)W0Rr5< zo7v)k|Hjurh&^5EL3w+-+#-qr%0S)6<`#~i_J1z)zyHY`OD2^U78eKSuB);Znk2`^ zQ-VyUpg1FVb@ZZXsoJU;7K=^5U^sx9_a!j_Uy}>I0%Gy=)V-qjWJ{{I37V|@>cba` z%PZR33kL@cii(TdcL!J&j;5}w|NGfwg+$70sf?!`m<0_G@v<^9cMrBw*+@17d+Lr$ zOAMh6`+jqtetr)V5~%Juc>#EUnXD}I#tN93vY}~iLz#_%i<%PC`ND7xK*!9WJwU7m zLPXHQQZh1qJ%T)6*1X{uaA349XmmDkbPv+f7`7JP7)#`SPrFj~-%O($h*)mkys1qg z>87Bd(D$id9E3?+yj)LTzRc?CQU?W#56ilo{QYBPg9Nu2vIObrKm4LArPz92^PyOU zbW9q*kTujEv_u6mHK2S?&Wgh0`v9EU!nXOr003n7@B8>4?VTG}MMSdcKY#uVY@j7b z81(PcFl8`xo$Sw@UFSt!=GHviIoIIW-uLsTROMp>eSMl|&z{AQoun(xW%?gG2h)1i z?*YjJ1PHVSqF?#^c@hpMcKPz<%=__i(o{M5i9d+SV`3kGyo{EPuCTn^%g>KF z@^kx0^R@7L_kSfX23q_>w-+9vI&Myc%e{76AXkxuZ`L)A zqB%CTqMUcX)n@QgA_RPFk?QpzWs8@rC_5R8ovs@ekn#~5ea2bMvoa>gtgEFIa`Z)GM(%)^8h9i`dOH2UwNhJ6I${*oAh#I6deYv0wFA zB)BV(W5gF+YwoE%k|K1wG9<+P)UOLXSav{nU2v=WZhKCrmEq)+LY^obD{@EmD!2tl N0oOOxYtVH`_#bV0w7CEP literal 0 HcmV?d00001 diff --git a/repo/js/AutoHoeingOneDragon/main.js b/repo/js/AutoHoeingOneDragon/main.js index 65d9fce11..f3d474ed8 100644 --- a/repo/js/AutoHoeingOneDragon/main.js +++ b/repo/js/AutoHoeingOneDragon/main.js @@ -321,147 +321,142 @@ async function markPathings(pathings, groupTags, priorityTags, excludeTags) { } async function findBestRouteGroups(pathings, k, targetEliteNum, targetMonsterNum) { - // 初始化变量 - let nextTargetEliteNum = targetEliteNum; // 当前目标精英怪数量 - let iterationCount = 0; // 循环次数 + /* ========== 0. 原初始化不动 ========== */ + let nextTargetEliteNum = targetEliteNum; + let iterationCount = 0; - // 初始化统计变量 - let totalSelectedElites = 0; // 总精英怪数量 - let totalSelectedMonsters = 0; // 总普通怪数量 - let totalGainCombined = 0; // 总收益 - let totalTimeCombined = 0; // 总耗时 + let totalSelectedElites = 0; + let totalSelectedMonsters = 0; + let totalGainCombined = 0; + let totalTimeCombined = 0; let monsterRouteElite = 0; - let maxE1 = 0; - let maxE2 = 0; - - const ratio = targetEliteNum / targetMonsterNum; + let maxE1 = 0, maxE2 = 0; + const ratio = targetEliteNum / Math.max(targetMonsterNum, 1); // 防 0 const f = (Number((1 - Math.exp(-ratio * ratio)).toFixed(3)) + 1) / 2; - // 遍历 pathings,计算并添加 G1、G2、E1 和 E2 属性 - pathings.forEach(pathing => { - pathing.selected = false; // 初始化 selected 属性为 false - const G1 = pathing.mora_e + pathing.mora_m; // 进入一组的收益 - pathing.G1 = G1; - const G2 = pathing.mora_m; // 进入二组的收益 - pathing.G2 = G2; - pathing.E1 = pathing.e === 0 ? 0 : ((G1 - G2 * f) / pathing.e) ** k * (G1 / pathing.t); // 进入一组的效率 - pathing.E2 = pathing.m === 0 ? 0 : (G2 / pathing.m) ** k * (G2 / pathing.t); // 进入二组的效率 - - if (maxE1 < pathing.E1) { - maxE1 = pathing.E1; - } - if (maxE2 < pathing.E2) { - maxE2 = pathing.E2; - } - + pathings.forEach(p => { + p.selected = false; + const G1 = p.mora_e + p.mora_m, G2 = p.mora_m; + p.G1 = G1; p.G2 = G2; + p.E1 = p.e === 0 ? 0 : ((G1 - G2 * f) / p.e) ** k * (G1 / p.t); + p.E2 = p.m === 0 ? 0 : (G2 / p.m) ** k * (G2 / p.t); + maxE1 = Math.max(maxE1, p.E1); + maxE2 = Math.max(maxE2, p.E2); + }); + pathings.forEach(p => { + if (p.prioritized) { p.E1 += maxE1; p.E2 += maxE2; } }); - pathings.forEach(pathing => { - if (pathing.prioritized) { - pathing.E1 += maxE1; - pathing.E2 += maxE2; - } - - }); - - // 封装第一轮选择逻辑 + /* ========== 1. 原两轮选择逻辑照搬,只是去掉“提前 break” ========== */ function selectRoutesByEliteTarget(targetEliteNum) { - // 重置选中状态和统计变量 - pathings.forEach(pathing => pathing.selected = false); // 每轮循环前重置选中状态 - totalSelectedElites = 0; // 重置总精英怪数量 - totalSelectedMonsters = 0; // 重置总普通怪数量 - totalGainCombined = 0; // 重置总收益 - totalTimeCombined = 0; // 重置总耗时 + pathings.forEach(p => p.selected = false); + totalSelectedElites = 0; totalSelectedMonsters = 0; + totalGainCombined = 0; totalTimeCombined = 0; - - // 按 E1 从高到低排序 pathings.sort((a, b) => b.E1 - a.E1); - - // 第一轮选择:根据当前目标精英怪数量选择路径 - for (const pathing of pathings) { - if (pathing.E1 > 0 && pathing.available && ((totalSelectedElites + pathing.e) <= targetEliteNum - monsterRouteElite + 2)) { - pathing.selected = true; - totalSelectedElites += pathing.e; - totalSelectedMonsters += pathing.m; - totalGainCombined += pathing.G1; - totalTimeCombined += pathing.t; + for (const p of pathings) { + if (p.E1 > 0 && p.available && + (totalSelectedElites + p.e <= targetEliteNum + 2)) { // 留一点余量 + p.selected = true; + totalSelectedElites += p.e; + totalSelectedMonsters += p.m; + totalGainCombined += p.G1; + totalTimeCombined += p.t; } } } - // 封装第二轮选择逻辑 function selectRoutesByMonsterTarget(targetMonsterNum) { monsterRouteElite = 0; - // 按 E2 从高到低排序 pathings.sort((a, b) => b.E2 - a.E2); - - // 第二轮选择:根据剩余的普通怪数量目标选择路径 - for (const pathing of pathings) { - if (pathing.E2 > 0 && pathing.available && !pathing.selected && (totalSelectedMonsters + pathing.m) < targetMonsterNum + 5) { - pathing.selected = true; - totalSelectedElites += pathing.e; // 第二轮选择中也可能包含精英怪 - monsterRouteElite += pathing.e; - totalSelectedMonsters += pathing.m; - totalGainCombined += pathing.G2; - totalTimeCombined += pathing.t; + for (const p of pathings) { + if (p.E2 > 0 && p.available && !p.selected && + (totalSelectedMonsters + p.m < targetMonsterNum + 5)) { + p.selected = true; + totalSelectedElites += p.e; monsterRouteElite += p.e; + totalSelectedMonsters += p.m; + totalGainCombined += p.G2; + totalTimeCombined += p.t; } } } - // 循环调整目标精英怪数量 + /* ========== 2. 迭代:直到“双达标”才停 ========== */ while (iterationCount < 100) { - // 第一轮选择 selectRoutesByEliteTarget(nextTargetEliteNum); - - // 第二轮选择:直接传入剩余的小怪数量目标 selectRoutesByMonsterTarget(targetMonsterNum); - // 检查精英怪总数是否满足条件 - const diff = totalSelectedElites - targetEliteNum; - if ((totalSelectedElites >= targetEliteNum - 3) && (totalSelectedElites <= targetEliteNum)) { + // 新收敛条件:必须同时大于等于双目标 + if (totalSelectedElites >= targetEliteNum && + totalSelectedMonsters >= targetMonsterNum) { break; } - nextTargetEliteNum -= Math.round(0.1 * diff); // 调整目标精英怪数量,乘以系数并取整 - //log.info(`该轮循环目标${nextTargetEliteNum},实际选出${totalSelectedElites}`); - iterationCount++; // 增加循环序号 + // 只要没达标,就加压:把精英目标向上推 + const eliteShort = targetEliteNum - totalSelectedElites; + nextTargetEliteNum += Math.max(1, Math.round(0.1 * eliteShort)); + iterationCount++; } - // 为最终选中且精英怪数量为0的路线添加小怪标签 - pathings.forEach(pathing => { - // 检查是否包含 "传奇" 或 "高危" 标签 - const hasLegendOrHighRisk = pathing.tags.includes("传奇") || pathing.tags.includes("高危"); + /* ========== 3. 最小不可再减集合(贪心逆筛) ========== */ + // 3.1 【仅修改此处】排序依据改为约定的score:(怪均收益^k) × 秒均收益(精英权重=5) + // 怪均收益 = (总收益) / (精英数×5 + 普通怪数);秒均收益 = 总收益 / 时间;score小的优先删除 + const selectedList = pathings.filter(p => p.selected) + .sort((a, b) => { + // 计算a的score + const aTotalGain = a.G1 + a.G2; + const aDenominator = a.e * 5 + a.m; // 精英权重=5 + const aPerMobGain = aDenominator === 0 ? 0 : aTotalGain / aDenominator; + const aPerSecGain = a.t === 0 ? 0 : aTotalGain / a.t; + const aScore = (aPerMobGain ** k) * aPerSecGain; - // 如果路径被选中、没有精英怪物且不包含 "传奇" 或 "高危" 标签,则添加 "小怪" 标签 - if (pathing.selected && pathing.e === 0 && !hasLegendOrHighRisk) { - pathing.tags.push("小怪"); + // 计算b的score + const bTotalGain = b.G1 + b.G2; + const bDenominator = b.e * 5 + b.m; // 精英权重=5 + const bPerMobGain = bDenominator === 0 ? 0 : bTotalGain / bDenominator; + const bPerSecGain = b.t === 0 ? 0 : bTotalGain / b.t; + const bScore = (bPerMobGain ** k) * bPerSecGain; + + // 升序排序:score小的在前,优先删除 + return aScore - bScore; + }); + + for (const p of selectedList) { + // 试删 + const newE = totalSelectedElites - p.e; + const newM = totalSelectedMonsters - p.m; + if (newE >= targetEliteNum && newM >= targetMonsterNum) { + // 删了仍达标,真删 + p.selected = false; + totalSelectedElites = newE; + totalSelectedMonsters = newM; + totalGainCombined -= (p.selected ? p.G1 : p.G2); + totalTimeCombined -= p.t; + } + } + + /* ========== 4. 小怪标签 & 排序 & 日志,保持原样 ========== */ + pathings.forEach(p => { + if (p.selected && p.e === 0 && + !p.tags.includes("传奇") && !p.tags.includes("高危")) { + p.tags.push("小怪"); } }); if (settings.runByEfficiency) { log.info("使用效率降序运行"); - //按效率降序排序 - pathings.sort((a, b) => { - if (a.E1 !== b.E1) { - return b.E1 - a.E1; // 先按 E1 降序 - } - return b.E2 - a.E2; // 再按 E2 降序 - }); + pathings.sort((a, b) => b.E1 - a.E1 || b.E2 - a.E2); } else { log.info("使用默认顺序运行"); - // 按原始索引排序 pathings.sort((a, b) => a.index - b.index); } - // 输出日志信息 + log.info(`总精英怪数量: ${totalSelectedElites.toFixed(0)}`); log.info(`总普通怪数量: ${totalSelectedMonsters.toFixed(0)}`); log.info(`总收益: ${totalGainCombined.toFixed(0)} 摩拉`); - - // 将总用时转换为时、分、秒表示 - const hours = Math.floor(totalTimeCombined / 3600); - const minutes = Math.floor((totalTimeCombined % 3600) / 60); - const seconds = totalTimeCombined % 60; - - log.info(`预计总用时: ${hours} 时 ${minutes} 分 ${seconds.toFixed(0)} 秒`); + const h = Math.floor(totalTimeCombined / 3600); + const m = Math.floor((totalTimeCombined % 3600) / 60); + const s = totalTimeCombined % 60; + log.info(`预计总用时: ${h} 时 ${m} 分 ${s.toFixed(0)} 秒`); } async function assignGroups(pathings, groupTags) { @@ -1415,7 +1410,8 @@ async function isTimeRestricted(timeRule, threshold = 5) { const timeUntilNextHour = (nextHour - currentHour - 1) * 60 + (60 - currentMinute); if (timeUntilNextHour > 0 && timeUntilNextHour <= threshold) { // 如果距离下一个限制时间小于等于阈值,则等待到限制时间开始 - log.warn("接近限制时间,开始等待"); + log.warn("接近限制时间,开始等待至限制时间"); + await genshin.tpToStatueOfTheSeven(); await sleep(timeUntilNextHour * 60 * 1000); return true; } diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index 76cd4f7aa..b271192b4 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "1.6.4", + "version": "1.7.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ {