From 6b17e4f07a0aa066326766c432c421317cb2be8e Mon Sep 17 00:00:00 2001 From: mno <718135749@qq.com> Date: Sat, 28 Jun 2025 05:55:26 +0800 Subject: [PATCH] =?UTF-8?q?js:=E6=B8=B8=E9=80=B8=E6=97=85=E9=97=BB=20(#122?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 终于改完了,再出bug就去踹秋云屁股 --- repo/js/TravelersTales/README.md | 48 ++ .../assets/avatars/八重神子.png | Bin 0 -> 1355 bytes .../TravelersTales/assets/avatars/夏洛蒂.png | Bin 0 -> 1462 bytes .../js/TravelersTales/assets/avatars/托马.png | Bin 0 -> 1166 bytes .../js/TravelersTales/assets/avatars/林尼.png | Bin 0 -> 1055 bytes .../js/TravelersTales/assets/avatars/柯莱.png | Bin 0 -> 1173 bytes .../assets/avatars/梦见月瑞希.png | Bin 0 -> 1668 bytes .../assets/avatars/神里绫人.png | Bin 0 -> 1199 bytes .../js/TravelersTales/assets/avatars/赛诺.png | Bin 0 -> 1524 bytes .../TravelersTales/assets/avatars/迪希雅.png | Bin 0 -> 957 bytes .../assets/avatars/那维莱特.png | Bin 0 -> 1136 bytes .../assets/avatars/鹿野院平藏.png | Bin 0 -> 1089 bytes .../assets/icon/paimon_menu.png | Bin 0 -> 2372 bytes repo/js/TravelersTales/assets/icon/三个点.png | Bin 0 -> 1054 bytes repo/js/TravelersTales/assets/icon/两个点.png | Bin 0 -> 648 bytes .../assets/keymouse/托马-2.json | 1 + .../assets/keymouse/柯莱-1.json | 1 + .../assets/keymouse/梦见月瑞希-1.json | 1 + .../assets/keymouse/梦见月瑞希-2.json | 1 + .../assets/keymouse/菲米尼-1.json | 1 + .../assets/pathing/八重神子-1.json | 51 ++ .../assets/pathing/夏沃蕾-1.json | 78 +++ .../assets/pathing/夏洛蒂-1.json | 60 +++ .../assets/pathing/夏洛蒂-2.json | 67 +++ .../assets/pathing/夏洛蒂-3.json | 67 +++ .../TravelersTales/assets/pathing/托马-1.json | 78 +++ .../TravelersTales/assets/pathing/托马-2.json | 159 ++++++ .../TravelersTales/assets/pathing/早柚-1.json | 94 ++++ .../TravelersTales/assets/pathing/林尼-1.json | 78 +++ .../TravelersTales/assets/pathing/柯莱-1.json | 105 ++++ .../assets/pathing/梦见月瑞希-1.json | 60 +++ .../assets/pathing/梦见月瑞希-2.json | 60 +++ .../assets/pathing/神里绫人-1.json | 60 +++ .../assets/pathing/绮良良-1.json | 51 ++ .../assets/pathing/绮良良-2.json | 51 ++ .../assets/pathing/绮良良-3.json | 112 ++++ .../assets/pathing/菲米尼-1.json | 24 + .../TravelersTales/assets/pathing/赛诺-1.json | 60 +++ .../TravelersTales/assets/pathing/赛诺-2.json | 78 +++ .../TravelersTales/assets/pathing/赛诺-3.json | 51 ++ .../assets/pathing/迪希雅-1.json | 69 +++ .../assets/pathing/迪希雅-2.json | 87 ++++ .../assets/pathing/那维莱特-1.json | 58 +++ .../assets/pathing/那维莱特-2.json | 69 +++ .../assets/pathing/那维莱特-3.json | 76 +++ .../assets/pathing/鹿野院平藏-1.json | 87 ++++ .../assets/pathing/鹿野院平藏-2.json | 78 +++ .../assets/pathing/鹿野院平藏-3.json | 51 ++ .../assets/pathing/鹿野院平藏-4.json | 49 ++ .../assets/pathing/鹿野院平藏-5.json | 67 +++ repo/js/TravelersTales/config.json | 2 + repo/js/TravelersTales/data.json | 79 +++ repo/js/TravelersTales/main.js | 477 ++++++++++++++++++ repo/js/TravelersTales/manifest.json | 21 + repo/js/TravelersTales/settings.json | 33 ++ 55 files changed, 2800 insertions(+) create mode 100644 repo/js/TravelersTales/README.md create mode 100644 repo/js/TravelersTales/assets/avatars/八重神子.png create mode 100644 repo/js/TravelersTales/assets/avatars/夏洛蒂.png create mode 100644 repo/js/TravelersTales/assets/avatars/托马.png create mode 100644 repo/js/TravelersTales/assets/avatars/林尼.png create mode 100644 repo/js/TravelersTales/assets/avatars/柯莱.png create mode 100644 repo/js/TravelersTales/assets/avatars/梦见月瑞希.png create mode 100644 repo/js/TravelersTales/assets/avatars/神里绫人.png create mode 100644 repo/js/TravelersTales/assets/avatars/赛诺.png create mode 100644 repo/js/TravelersTales/assets/avatars/迪希雅.png create mode 100644 repo/js/TravelersTales/assets/avatars/那维莱特.png create mode 100644 repo/js/TravelersTales/assets/avatars/鹿野院平藏.png create mode 100644 repo/js/TravelersTales/assets/icon/paimon_menu.png create mode 100644 repo/js/TravelersTales/assets/icon/三个点.png create mode 100644 repo/js/TravelersTales/assets/icon/两个点.png create mode 100644 repo/js/TravelersTales/assets/keymouse/托马-2.json create mode 100644 repo/js/TravelersTales/assets/keymouse/柯莱-1.json create mode 100644 repo/js/TravelersTales/assets/keymouse/梦见月瑞希-1.json create mode 100644 repo/js/TravelersTales/assets/keymouse/梦见月瑞希-2.json create mode 100644 repo/js/TravelersTales/assets/keymouse/菲米尼-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/八重神子-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/夏沃蕾-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/夏洛蒂-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/夏洛蒂-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/夏洛蒂-3.json create mode 100644 repo/js/TravelersTales/assets/pathing/托马-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/托马-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/早柚-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/林尼-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/柯莱-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/梦见月瑞希-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/梦见月瑞希-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/神里绫人-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/绮良良-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/绮良良-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/绮良良-3.json create mode 100644 repo/js/TravelersTales/assets/pathing/菲米尼-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/赛诺-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/赛诺-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/赛诺-3.json create mode 100644 repo/js/TravelersTales/assets/pathing/迪希雅-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/迪希雅-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/那维莱特-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/那维莱特-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/那维莱特-3.json create mode 100644 repo/js/TravelersTales/assets/pathing/鹿野院平藏-1.json create mode 100644 repo/js/TravelersTales/assets/pathing/鹿野院平藏-2.json create mode 100644 repo/js/TravelersTales/assets/pathing/鹿野院平藏-3.json create mode 100644 repo/js/TravelersTales/assets/pathing/鹿野院平藏-4.json create mode 100644 repo/js/TravelersTales/assets/pathing/鹿野院平藏-5.json create mode 100644 repo/js/TravelersTales/config.json create mode 100644 repo/js/TravelersTales/data.json create mode 100644 repo/js/TravelersTales/main.js create mode 100644 repo/js/TravelersTales/manifest.json create mode 100644 repo/js/TravelersTales/settings.json diff --git a/repo/js/TravelersTales/README.md b/repo/js/TravelersTales/README.md new file mode 100644 index 00000000..e2afc924 --- /dev/null +++ b/repo/js/TravelersTales/README.md @@ -0,0 +1,48 @@ +# 自动游逸旅闻 +自动完成游逸旅闻活动 +暂仅支持“鎏溢之章” +## 路线 + +|路径|支持情况|含有键鼠脚本| +|--|--|--| +|八重神子-1|✔️|| +|迪希雅-1|✔️|| +|迪希雅-2|✔️|| +|菲米尼-1|✔️|✔️| +|基尼奇-1|❌[^1]|| +|柯莱-1|✔️|✔️| +|林尼-1|✔️|| +|琳妮特-1|❌[^2]|| +|鹿野院平藏-1|✔️|| +|鹿野院平藏-2|✔️|| +|鹿野院平藏-3|✔️|| +|鹿野院平藏-4|✔️|| +|鹿野院平藏-5|✔️|| +|梦见月瑞希-1|✔️|✔️| +|梦见月瑞希-2|✔️|✔️| +|那维莱特-1|✔️|| +|那维莱特-2|✔️|| +|那维莱特-3|✔️|| +|绮良良-1|✔️|| +|绮良良-2|✔️|| +|绮良良-3|✔️|| +|赛诺-1|✔️|| +|赛诺-2|✔️|| +|赛诺-3|✔️|| +|神里绫人-1|✔️|| +|托马-1|✔️|| +|托马-2|✔️|| +|希诺宁-1|❌[^1]|| +|夏洛蒂-1|✔️|| +|夏洛蒂-2|✔️|| +|夏洛蒂-3|✔️|| +|夏沃蕾-1|✔️|| +|伊安珊-1|❌[^1]|| +|伊法-1|❌[^1]|| +|早柚-1|✔️|| + +[^1]: 角色所在位置(圣火竞技场)无法使用地图追踪功能前往,键鼠录制的效果也非常不稳定 +[^2]: 角色所在位置(灰河)无法使用地图追踪功能前往,键鼠录制的效果也非常不稳定 + +## 待完成功能 +- [x] 连续运行 \ No newline at end of file diff --git a/repo/js/TravelersTales/assets/avatars/八重神子.png b/repo/js/TravelersTales/assets/avatars/八重神子.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8bea6e689c2565470499848b0825c50b7125c4 GIT binary patch literal 1355 zcmV-R1+@B!P)Px)1xZ9fR5(vnlwE8b)ftALGqW>0`|Ir5YkTcDwo~kcq>x{`rJxW5iI5OQC{%?D zB#;miNT@;}A@u@5uiB~-SCtS^)hh@^K|-wvT$BWdM1m-W5XX)aCvos!)@!`R-u2G@ z%*KoGPpiU0E)1O$3h1hskgtcd4f=#2VM5MY=ljdB?sHytMgLSG7` z1*DmYgfUe*c~YX;YTJq1sTGSjxg4AG^Thl5kXj8vCkY7rCMr-Z26KP@i`ea1 z5<^3X?}J-Iv<8hP%hOZ1%gba(MzD0f8pQXplW7n?WTIA2oDjd+#GPLt+TDedZAZK& zxDA?{6*db68nr5sQi-Zz(0%AZ49u1|;-l6+{#Z+k=eiWnog=8#h}br%uCCCD`q~MZ^)YFL_^0#*wWEK_x`;kx_b#4 z&7U>Z?h9)5gAYVoXC@L9$Hr*izaPW0!}=^c%C)gGn3akqP0!Jz&}`YOpF?Q#+J_&C zuWfYV{Pf*8PG=`hM=k_F8BCw~0>gDlC(|Sb2S^Rwg;c93WrF9SmX046I~GG(Q7SXn ziDolcsdVVE23Wc}!N$#5vYlPwE6qK0n4nz7Fs&AYD{s6mTkqYgOQoW{Pq(2WdQ(CX zmnJ7zUs%A2$FS-??IQ%~<%b9tJzD%*}dN&Uv{7C`ZxcSJ=ZtQ87)O40R;;g(4H$tuOdmCKlQmsQ8*&dLlU zeGg$&Hc0I`Ku{{R0Q3dZjx0BsIgpWLad{cF{O)nt zT=;?XaI1DhOuS|TQTn&Gm^yuie_3sN_t=bccYA* zOkz1P%_Hnkwi#pW(@*JtdMBT~f0gQbokLIU;PdxCWAA+f z;UoABk9aJ}&BbZf8tZtS8LnTv%9iyP$rK*Obzx<-PU4xrQMxsTy7GrtB$`Z6U0bJT z-$4Q|;Cf*ax1&K@zMKF4<7Px)a7jc#R5(vXlxu8U#Tka5IhVb9*IC=FH+5{UN#a~^0%_~q>Vy_VORI)lfT{>o z(LyWKs739Mq)};$)C$oef<#5D3Ka=KQzaq=s(?g_L_!iGNJv7kWjk?Vd+oK?v3J*d z_Hw*?E>oR#O6SLXe@4%I^S5iIjNDbtR4jSGq_f8VUiQ535$iG|Q-}Mr27G z$F}H5u4doU`|0`e9ei;7BVK&=AOoLX#{?}I-9=?otZvT&^W!V^o zBG*Qzn9XEyJ&5bj5DF1%j*=dmK~oiUpT_Fd%PG3ol{^vC5$?3WbR<%~IuH{fDl!?cqcyd`)i$cy|_aooJuPglP z@JT{7*ceN2;_7vdUl^q=*~x+Do<sFv?D$OlX8iH_TV1$8>`_X1$bF2$J=tB+o8Jn2k-Jz@W-Kfs`Cc7^lnD+>6lkX zC|tVCxhwsM_y2G}eyM9cp_<95b7yF8O|rCgB~ueuN!RAFZHMW>VXRV#w#F9vwr{8P zp1YBnhHF+qQ;;>Qo+>2}q&PH8{~JdULx+z@b*Z1!+eb-F=Qw`qEQ!V_JsrzwjxC|N zYZWWE-OH6X4{__g_Yq3AB2H_+JA1GWE4P;b_QD@wge zMNrGhcVJh_jKBLH8WCE0x8w6G z*yaL42vl9CW)u;cuim}Tz&1)0$5V)dKfhBh>+ELFPoJm%)IT_R{!D6ZpBnwSPf10g`TNZY{}xsEvU%tNxJeI?tzw~yEN zf16-5$^*arJC(vT3N8qRQfi#?$Slq4HY1%{-7k;hi-a+6%;8urz9muAhA`&jB*w@X zB6IzmeCLHHxFxxsP-C1xKxfOYy;Smdc_TTsJcR3SL?)Kjee!4DDhlb=bU_)+~~-hO@$O)V>_<>%<$ zem`9s?!vAV5stG6E|@5x&|)OKk=8Uy!@~rVNra|R%Vaq5>tFG;-~68c0)0S){t4Lu Q7ytkO07*qoM6N<$g0|V!hyVZp literal 0 HcmV?d00001 diff --git a/repo/js/TravelersTales/assets/avatars/托马.png b/repo/js/TravelersTales/assets/avatars/托马.png new file mode 100644 index 0000000000000000000000000000000000000000..720a38f107e368a0fb96a619975d7826e77279e8 GIT binary patch literal 1166 zcmV;91abR`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1S3gAK~y+THI&J2 z8&?oT&wI`8X16GbY*LabTab+?RvaPlCN>acmv703ly$= z5bvobQ_QlY5r#B3TLf{0KD$g9pAOMQLDp`Pr9!h_qRSGcSI;Q0WrcSRlz@1=chvI& zvnUYfh|-uKiP5sY$GmDW9XZOWA=HAMPMClAj4cWTk3#UqBHkkiA|B@)#cWBvDDch^ zgbJlKdhdEh@8CO>-loXckRU~e0j?^kXY-XCz&VF_w~8wsSJh0<#?*@v@eU;p#G_kP z&PD*e8@FihAF{rGK=$ozI$!S*q!C^m-dSvIR*~_DvzYmk*~JWJ42Z>)CEf^nG+j{Y z1}+FtNy=ibFr^TL8XbUGhqo428@%&?;3~snIKx{(H#CSaALXdZqiY@V?rg}b_n$fa zaKY=BLoNq%ur)Y~IE$SxS7PE2S5fCv^79dOX+bNzHJF7#Nknke?fmlW#R*UU{*TFM z%DWdIXr+#RKS2RnD<OT1*f&u~p1kXP@@o0gbyq+-H5SO%*(1 ztJ~q`)?IenOI$rfi;!PTSd4PA8ymQCNjWu?xezoGTGzUSX_p|mMyy)IQG$B=@PVA2 z{6*P)O#Z3G;r>sg`6+hr2(g~?#7r)^m_DJkzQ<;^$Mo4BT>kq2v#6MTu9z=tc5k&#3(hqRlN73WWeGbSV_lh$vq^A^$Xi zwRINx043uWUj#wKt%R)uTO-z@oFLvI@&#qG!k5U(MDg;NdN!jj48sp^&?rCw2udkn z#Xod_3K}RKpmYPJ^wr^NiQw}w+8e^SL8srLb1g$(xw|R_sH>sW3im5}s4oo)@fJTD gf;hBZ-Rdynf0M^`s%7qV$p8QV07*qoM6N<$f|j2mp#T5? literal 0 HcmV?d00001 diff --git a/repo/js/TravelersTales/assets/avatars/林尼.png b/repo/js/TravelersTales/assets/avatars/林尼.png new file mode 100644 index 0000000000000000000000000000000000000000..436782d64eed89f334324cc89db61e25aab92b08 GIT binary patch literal 1055 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 amj42&uT-C$>KTmy0000smd?_ literal 0 HcmV?d00001 diff --git a/repo/js/TravelersTales/assets/avatars/迪希雅.png b/repo/js/TravelersTales/assets/avatars/迪希雅.png new file mode 100644 index 0000000000000000000000000000000000000000..5abb0642416a3e04645c6238b6a553359ba29fc8 GIT binary patch literal 957 zcmV;u148_XP)Px&cS%G+R5(vXlUr<)br^@A|M#_D+gTVLU9+t&t~kh1Ix3={3ef|13n-{*9 zzvO*>d6V}M!7sX`GJsNLE%>@Or&m9vUK@OtYcz4#JTr;_}f>8Jdd_PiJUr z@ZqrAn4DSQtQBu;Jabk@861H=&Y{B)t2*I^$6V%jH5e$wI3eDlLJ18nCVt313h(g68ovt!6x<;d~fIx7J zmf~tW&6RjO9u!3o2#nIvu>*ha1>#v9munM`Z1M8)bB`k4J@mPZIa)EZ5jv_hp5Fg3 z&+mMIlw%`>g)U}iXEAdokywHnx5nV#A-ts?x?kTzTILXc1t#Qpb`w)qCYd<1igXW^fles3>)j2R!bLSgk61cW+0i7Q|A|5oy(|7{Y?4DfIh?=?O+q zR0aR910+&e-rTo~^774i%iO%!b%ryCp2WVPh{?bxBJ|7g^-osv28ycE*?El3&20>i zj4(4D;?slsXt>*prm1wF9ptf{%~&lKuxbnsUil9ogo4v);oSM(85oT+zqG*I^$9-d ze1Qs|hj=21Py|+sN;aEY_d^I6`g05sI)7ZQ1!gwM$4C2FipN=5yupdXZ;(!=Fbo4} zn(Ma7d>+g^!d^gTJV0nQgIKtDLRzdU@4fvsu|$k*_g3-v6AzNrb#l6nX_!c9t}m|@ zAyo3q^Te0K=(QDyn?E0sKb-2LvbLQ1x^hZO-Grmjb*T(pC!aIds*!mUDO6-Kft;V= fdL+U3Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1O-V%K~y+TU6f02 z97Pm`zgsmu56^gBe%o;zVk;yBkYEMMpW_#>WQCMJfLI~eu>vWIkPsFzkc8O8cI@$t zduBY{J>AvSRV>=Uz%7+ZI;wkg&aI=8uO5Hl)69@ti!p{G&!|@GtZi;{>&`AB!u}86 zpt#mpisz9-+$wi`JCJsOm5LQ>Op|gHH-_ePM8c& zsQLke(<5wAPz^NUcuL|s)EB!v_~;S6{tDJ)$jQM|Z}S{$ExEN+M5tN0SeujOhScQbwg3^T zwK{tb-a~xKf-n{&U-4YCQ)+5@!=sS z$7ft62CoD()anbYEUywzBjVVhD>b6Qa~hmr<^v92?lVg){q73# z`HFBb#za?a-Pz^#-Cf$53>Gr#bsFF+xN-K1wLZCGZ3su^^MVj3{L2C;MIyCBagcNHd3MvdBH!RGF}EH160vB1IIZ7#wD1{CxXsry& zw@sxIP+i)fxpNOCTrW{5xrs@6{-3q9J&#i+!w{bvszE@|Y*Sy}q}J)*5F&!0uF2op z{a0N>CN)Ikh&;9QR(dG$XwgV+u;CC@UM%NQHkO_LC{@>LOO!OpFlol}YLE4;HB_Ep z!*jB;*QBRMsB&;ODsIG;pu8REwSBD>onD*G?KLPY#dw4rz9AovPXEK}vMDaJ{zc85mf&oYX0000H literal 0 HcmV?d00001 diff --git a/repo/js/TravelersTales/assets/avatars/鹿野院平藏.png b/repo/js/TravelersTales/assets/avatars/鹿野院平藏.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e16f6a49451d78a73dd90d9f08c82156bbd499 GIT binary patch literal 1089 zcmV-H1it%;P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1J+4IK~y+TJ(Jyz z8$}R>zpCnt`QumqJb%I_ZP2|s6DZ7hm0K>-n&ce-juT8txkE?S#x(r_ zht-6GYQnrXWEuzb#VAdPx&tW=I8l{o#;bJ2HYY>`&rZ%6$I*H@!~243#zY9BG)2Xv zs3^@a5mW>bL4Y7ap@CJp;;P#MAR@H6Be|oChi8m$A0Z`(I;uj?B2Dbmw@6UI-dx$e zL4{78wYPMhiDqQaoL^m{Hy@obS~hsE1M9E=En5aO`8+yYMGokf_s-RDw zJY{&WWcI-c<-A8MVK^?i_w8d&KmUl?w4qcbiV$?CQh@n<#{AlxUJ+58ZPyY-(CO{_ z-1+Ql&c6SS>ksczP6G4g5sUlp^Z3UfxbfZz{W1`A2Mh|9JDO&~sO}TR@pj9mT~nH& z$M;S-x^suyr;oY!#aB$0$DBO+kkRabYsU+w^C@K!3AS5C5YR3$8jq>Q6M`A*v}N11 ztaCzhY6(Ro#FE*`EpC4KIoBUOpg$f{jYd?1K1E?~fu=%07!E4NlbR5fSKXRTPCUE1 zL|5le>CzfiqpU|PKK+=Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2-!(QK~z{rt(SRF zR96@7{OrIrs3OB6ST- zP@DTTKA&cd-_x`4ifbQ;v^!UEWYd=r=ft5o>jaWdZ$#*F1Dp=`Lw#i>UdiRG$$NWQ zlS!qJbxWbLunJ)v#?D#+4Ko*L&U1#Kww~+hpIblw8}X6L@I3V>qTOd=&jwpmmE@tP zN6PlU71k%NS0-b{sVwYPN+w3?*E%@$g9jWc1ShNWOUqVas)}Z=D&g zor^(ddmGo&$7^Bli&I(H`jA5yHPeBFc|eOy)65lLn65z7v3Rt#cd}#T%%3oS_UaWY zP8XsoYg`}%_!_r5rlgw?!gfco5(B+3n1mL!af6==BzpXu8{&uT3qW6mS~El zkk8E=nsSFID@2ckOt;?zeTP8kFWU_L<(r{v?++`_P}J1FJ zrGzD=Wn-M71IC)Hz~luUn6cEC1O>prF&HzQw!v`aH!xiFElga#ftK|K6j!LeQ~fcd zu+pkpT)duyod@HvcufdKo4P~8+8;*FJ6JPb9Y(ejI`+W`*mDLlI_jSS1!4JxCG0UD zjGX)uI0x;=R2zR7yM)5TEgZ8vA~DL$8>v}OxltdFg0S1arJ|~;ihCNEj?QkRP&zVj z41%F+IE+Xf^I2P(TeuM)kAkquN&(Ks|A_jR&0Ndi6qZ$E%2INE=P)evj^tWD4GO}l zs|660<>Kz0L`bDQTlvJ_ zd*fhAC$o!g1)mB9VKP}S5-webP*{r6(tI2{eg@gOg$bAczCL=vv$<53XC zkeQu}q9VFy$(tdpeg^M=ojCvFHMF#d*ud8xObT(KlbXT*a1qj;9&~keb5F|ifiUJp zNhv9icK(5G$#b-d>yYrnMFa##prLW#L-Bw@#s88sxTm*NR@Wfn@W}xeH4txvNhA_- zcq#jW+`Iw^Y1d>OFVNK}fV`&#XU@hWEkpUF{2C@MnmesS7C)bBQI0pl_)qhZ`REaH zbDpBOT!@R8ZXho^3q6ur^t9F?BQ1rEbE?8D^!SPMuy^t0T9ku#bS|6c^{Bu}MgWpb_a$GGT7-OE0cORWTp;=~E8}W|#CW zR${z~Eqp`wL7jee<~rcixt~x{E}+8X!^F>HL`^VR!V1gg=di+jLJq*rB>)Q@{g7Lj zN99xl$_gIiNnRc|O*L9+cNVVl#e~`R*dBe9y@5R87vNS>8Xjb1<5}5<`I$FqjvfA{ zJ{#fD2dJ13WAB0QFoW(@F(=Q`N}ACvu7 z94CBkV1wTuWpOIxN6it998EI_F8V*b>3*K`Kbcg3(3`{ZXAAT4bR7q)3 zi8tS63pzXdYS4k;sTtc~=+|VZ=M}SYR<;_3-Qba3-?kI z@t^~J`z(Eg++aT0lFm2#AOF&x$eXiTPDp7 z;rzyS?wDrzH8d>N!Q5>Jw(UO$fv{#+$=c8<2qR6M$*06z3(!p0ZLKAKm_<8f>KcaW zD?;EHxOd1!^DJDqu(_;R)XLV2!$I8I4&R6q7;oW)^}CL8txPKF!PbNS!W0rV$88s8 zyGKB6kw0#xq;n$%hBwJN2#F7dP7#9<6del#`#`8ISPy>D+c2;{HUVl@8(`$M2PW>3 z7-Q~*9Wn7r`7O`VI~H~U2hk!@J|r+OaV_~#E-csV!lVV>RK9J;^`s2e1q2j4nK*SX zGZ)dZKfxvV0K9gdz}34C(5Yl$!kg!F3Wgp>VC)%%!qQ5vd2ljv^5GwL7@MQMN9={` zxc~SmS}1mjByBi&DgoNon-Ca%l1BE@0_1GH$rL%t!bsP000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1G7m)K~zXfot8mw z(?}G@e>0QBN$k`mQPng>qNNpwBB-E8#DP;!dj)c{7giecuQnkW!Lvg%HF__hT7jlGYf5)*7uf z#%KVh7gJiT7Vi%a5yRoo2q92P{Q#I1Jgw_MmoUTmWWwR$5n?i}6;R)ajb&LxQG~j8@7~UvH*YvQJ0qXZGdDL!KA%qjydwbP^nbN7xJhe2zFYn7N@7Dc%Db2(V$wb zBBjLhJYKze#qRDd&1RG1<6}O4{0PAE@-mL&AcWw{moMz?{l@#VG-P%IW{x7+OP?eXEm2S%e2VHooL`*+6UF{`Vq zEG;b|rR3n?fc^cKbUGa-lL?c_gnqw|l#;czwabl_;8QcC9M=P8v+S1L;>h2uDsN+qOi+vIXNY}@Ak{rhZgZZbDF2f&>>cX;&Z z5zEWV6pKaj`8>5+jjhLzSzlkrvMhuUY;0`s;K2iK-MU3Cm!nuLa{KmewzjrdTwFxG zc=2MVR;#hOxykeA&w2RpA*E6YfO5Ia!omXOa+zYWNTbo<$&)8+Z*Q}@x_V{B3kwSr z3I%N2=I-6QJbU(xr%#_!tJM&nK7BGl5a7CQ@+Mi0MkD(DK3Z$4)hdqTTpqNH27>{E z!2qQcwOWlrp@7yJ5r(0ObD2H$H&J{OXswB&2(2|TegCJgikoQGl>=NtvOnAel%1b` zmL~PFnPtDCwBM}xNxIUOcF0cp70b@M0?9hh8q3=M`Dm>Xp64ZN{n?+1xHU6U7>}g` z$M7hM5P$c&#wuK13E9tZx}?+nEa+ztqc!rh{U^iW@P~cTsXC8zL=^pJS-*7PBzVgH Y0SB%a)?@(yZvX%Q07*qoM6N<$f;XK3ZU6uP literal 0 HcmV?d00001 diff --git a/repo/js/TravelersTales/assets/icon/两个点.png b/repo/js/TravelersTales/assets/icon/两个点.png new file mode 100644 index 0000000000000000000000000000000000000000..17c54e8dab7a4bfe2f428ee653abe0bc049010ff GIT binary patch literal 648 zcmV;30(bq1P)Px%LP3B;iC{z2tiV*K@{VId+~Y0IoW%6b=}3?1H;_M%`yE*Gw^uip077LSj4t)Z98CASiV?DzW_`1<;acs!13 zwW>L$&>ap3QmGW|c00s$I#sAWTCEnc*(_?c8duO}vvE;Ep%CYWjJ}u4W#n=>hLcf# zZ*Fc72n1NQ);0v~_xorzn;4BoI6FJT`T04lR_oS5BWSzb#>>kK7sTuJvcjXIqpvDc zV>4L@_CP&($O$1B1Ad%!ZO_NY2RHWaS*HB)Vc*%XC3nvYD^zb9f~Z5iarUYB8&t@W iq|6tKy_duPTo9lBZ4RnM`aWI&0000 0) { + log.info(`未完成的角色: ${currentProgress.remainingCharacters.join(", ")}`); + } // 前往七天神像 + // await genshin.tpToStatueOfTheSeven(); + let runCount = 0; + const maxRuns = parseInt(settings.maxRuns) || 50; + + log.info(`最大运行次数: ${maxRuns}`); + showCurrentSettings(); + + let failCount = 0; + let lastProgress = -1; + + let skipList = []; + + while (runCount < maxRuns) { + log.info(`开始第${runCount + 1}次运行`); + + // 在每次运行前检查是否还有未完成的角色 + currentProgress = checkProgress(characterPositions); + + if (currentProgress.remaining === lastProgress) { + log.warn("与上轮循环剩余数量一致,可能所有点位都不可用或运行失败"); + failCount++; + } + else { + failCount = 0; + } + + lastProgress = currentProgress.remaining; + + if (failCount >= 4) { + log.error("连续五轮循环剩余数量没有变化,结束循环,请手动清理现在在地图上的旅闻后重新启动js") + break; + } + + if (currentProgress.remaining === 0) { + log.info("🎉 所有角色都已完成对话!任务结束。"); + break; + } + + log.info(`当前进度: ${currentProgress.completed}/${currentProgress.total} (剩余${currentProgress.remaining}个)`); + + const detectedCharacters = await find(); + let pathingName = null; + let hasKeyMouse = false; + let found = false; + let matchedNames = []; + for (const pos of characterPositions) { + //如果启用了跳过已完成角色的设置,则跳过已完成的角色 + if (settings.skipCompletedCharacters && config[pos.name]) { + skipList.push(pos.name); + } + + // 使用 Set 去除重复项 + skipList = [...new Set(skipList)]; + + if (isNearPosition(characterX, characterY, pos.x, pos.y)) { + matchedNames.push(pos.name); + /* + pathingName = pos.name; + hasKeyMouse = !!pos.hasKeyMouse; + found = true; + log.info(`找到角色,执行路线:${pathingName}`); + break; + */ + } + } + if (matchedNames.length === 1) { + pathingName = matchedNames[0]; + const pos = characterPositions.find(p => p.name === pathingName); + hasKeyMouse = !!(pos && pos.hasKeyMouse); + found = true; + log.info(`找到角色,执行路线:${pathingName}`); + } else if (matchedNames.length > 1) { + log.info(`找到多个路线:${matchedNames.join(", ")}`); + + // 首先尝试通过检测到的角色名字进行匹配 + let foundByName = false; + for (const name of matchedNames) { + if (skipList.includes(name)) { + continue; + } + const avatarName = name.split("-")[0]; + if (detectedCharacters.includes(avatarName)) { + pathingName = name; + const pos = characterPositions.find(p => p.name === pathingName); + hasKeyMouse = !!(pos && pos.hasKeyMouse); + found = true; + log.info(`通过角色名字匹配到路线:${pathingName} (角色:${avatarName})`); + foundByName = true; + break; + } + } + + // 如果通过角色名字没有找到,则回退到原来的图像识别方法 + if (!foundByName) { + for (const name of matchedNames) { + if (skipList.includes(name)) { + continue; + } + const avatarName = name.split("-")[0]; + const isChar = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync(`assets/avatars/${avatarName}.png`))); + if (isChar && isChar.count > 0) { + pathingName = name; + const pos = characterPositions.find(p => p.name === pathingName); + hasKeyMouse = !!(pos && pos.hasKeyMouse); + found = true; + log.info(`通过图像识别匹配到路线:${pathingName}`); + break; + } + } + } + } + if (!found) { + currentProgress = checkProgress(characterPositions); + log.error("未找到角色,或者角色未被收录"); + log.error(`当前位置可能没有未完成的角色对话`); + log.error(`剩余未完成角色: ${currentProgress.remainingCharacters.join(", ")}`); + log.info("继续寻找下一个角色..."); + continue; // 继续下一次循环而不是直接返回 + } + log.info(`正在前往 ${pathingName} 所在位置...`); + if (pathingName == "赛诺-3") { // 特殊处理 + await genshin.moveMapTo(2871, -377, "须弥"); + await genshin.setBigMapZoomLevel(1.0); + await genshin.tp(2871, -377); + } + await pathingScript.runFile(`assets/pathing/${pathingName}.json`) + keyPress("F"); + if (!hasKeyMouse) { + log.info("开始对话..."); + } + await sleep(3000); + await waitToMain(hasKeyMouse); + if (hasKeyMouse) { + log.info("执行对应键鼠脚本"); + await keyMouseScript.runFile(`assets/keymouse/${pathingName}.json`) + keyPress("F"); + log.info("开始对话..."); + await sleep(3000); + await waitToMain(hasKeyMouse); + } + if (failed) { + log.info("本次运行结果不会被保存"); + // 将 pathingName 加入 skipList + skipList.push(pathingName); + } else { + config[pathingName] = true; + await file.writeText("config.json", JSON.stringify(config, null, 4)); + log.info(`对话完成,已保存本次运行结果`); + } + runCount++; + if (runCount < maxRuns) { + log.info(`第${runCount}次运行完成`); + // 根据设置决定进度更新间隔 + const updateInterval = parseInt(settings.progressUpdateInterval) || 3; + if (runCount % updateInterval === 0) { + currentProgress = checkProgress(characterPositions); + log.info(`=== 进度更新 (第${runCount}次运行后) ===`); + log.info(`完成进度: ${currentProgress.completed}/${currentProgress.total} (${currentProgress.completionRate}%)`); + if (currentProgress.remaining > 0) { + log.info(`剩余角色: ${currentProgress.remainingCharacters.slice(0, 5).join(", ")}${currentProgress.remaining > 5 ? '...' : ''}`); + } + } + } + } + + // 最终统计 + const finalProgress = checkProgress(characterPositions); + log.info(`=== 任务完成统计 ===`); + log.info(`总运行次数: ${runCount}`); + log.info(`最终完成进度: ${finalProgress.completed}/${finalProgress.total} (${finalProgress.completionRate}%)`); + + if (finalProgress.remaining === 0) { + log.info("🎉 恭喜!所有角色对话已完成!"); + } else { + log.info(`还有 ${finalProgress.remaining} 个角色未完成:`); + log.info(finalProgress.remainingCharacters.join(", ")); + } + log.info(`程序结束`); +})(); + +/** + * 加载数据 + * @returns {Promise} + */ +async function loadData() { + try { + data = JSON.parse(await file.readText("data.json")); + config = JSON.parse(await file.readText("config.json")); + } catch (error) { + log.error(`加载配置文件失败: ${error.message}`); + } +} +/** + * 寻找角色 + * @async + * @returns {Promise} 找到的角色名字数组,如果没有找到则返回空数组 + */ +async function find() { + log.info(`开始寻找角色...`); + const positions = data.mapPositions; // 读取data.json中的点位数据 + for (let retryCount = 0; retryCount < positions.length; retryCount++) { + const position = positions[retryCount]; + + log.info(`第 ${retryCount + 1} 次尝试定位...`); + log.info(`移动到位置:(${position.x}, ${position.y}), ${position.name || '未命名位置'}`); + + await genshin.moveMapTo(position.x, position.y, position.country); + try { + const detectedNames = await locate(); + if (detectedNames && detectedNames.length > 0) { + return detectedNames; // 保持兼容性,设置全局变量 + } + } catch (error) { + continue; + } + } + log.error("寻找所有角色可能存在的位置都没有找到角色"); + throw new Error("在所有可能的位置都没有找到角色,结束任务,请手动清理出现在地图上的旅闻后重新启动js"); +} + +/** + * 定位角色并获取坐标 + * @async + * @returns {Promise} 检测到的角色名字数组 + */ +async function locate() { + await sleep(500); // 确保画面稳定 + await genshin.setBigMapZoomLevel((data && typeof data.zoom === "number") ? data.zoom : 6.0); + + let character = captureGameRegion().findMulti(RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/三个点.png"))); + + if (character && character.count > 0) { + avatar = character[0]; + + const center = genshin.getPositionFromBigMap(); + const mapZoomLevel = genshin.getBigMapZoomLevel(); + const mapScaleFactor = 2.361; + + characterX = (960 - avatar.x - 13) * mapZoomLevel / mapScaleFactor + center.x + 20; + characterY = (540 - avatar.y - 13) * mapZoomLevel / mapScaleFactor + center.y + 20; + log.info(`找到角色的大致坐标:(${characterX}, ${characterY})`); + + await sleep(200); + click(avatar.x + 20, avatar.y + 20); + await sleep(2000); + let resList = captureGameRegion().findMulti(RecognitionObject.ocrThis); + + // 识别text中的角色名字 + const characterNames = [ + "柯莱", "迪希雅", "赛诺", "林尼", "夏沃蕾", "菲米尼", "夏洛蒂", + "绮良良", "鹿野院平藏", "托马", "梦见月瑞希", "八重神子", + "那维莱特", "神里绫人", "早柚" + ]; + let foundNames = []; + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + for (let j = 0; j < characterNames.length; j++) { + if (res.text.includes(characterNames[j])) { + log.info("识别到角色:{} ({x},{y})", characterNames[j]); + foundNames.push(characterNames[j]); + } + } + } + log.info(`识别到的角色名字:${foundNames.length > 0 ? foundNames.join(", ") : "未知"}`); + await sleep(200); + keyPress("VK_ESCAPE"); // 关闭菜单 + await sleep(1000); // 等待菜单关闭 + return foundNames; + } else { + log.warn("未找到角色"); + throw new Error("未找到角色,当前位置没有角色"); + } +} + +/** + * 检查是否存在派蒙菜单图标,等待游戏返回主菜单 + * + * @param {boolean} hasKeyMouse - 是否需要执行键鼠操作 + * @returns {Promise} - 如果检测到主菜单,则返回 true,否则在超时时返回 false。 + */ +async function waitToMain(hasKeyMouse = false) { + log.info("等待返回主界面..."); + const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/paimon_menu.png"), 0, 0, genshin.width / 3.0, genshin.width / 5.0); + const maxRetries = 180; // 设置最大重试次数以防止无限循环 + let retries = 0; + let enteredLoop = false; + while (captureGameRegion().Find(paimonMenuRo).isEmpty()) { + enteredLoop = true; + if (retries >= maxRetries) { + log.error("返回主界面超时"); + return false; + } + await sleep(1000); + retries++; + } + if (!enteredLoop && !hasKeyMouse) { + log.error("进入对话失败"); + failed = true; + return false; + } + failed = false; + return true; +} + +/** + * 判断坐标是否在指定位置附近(误差范围内) + * @param {number} x - 当前X坐标 + * @param {number} y - 当前Y坐标 + * @param {number} targetX - 目标X坐标 + * @param {number} targetY - 目标Y坐标 + * @returns {boolean} 是否在指定范围内 + */ +function isNearPosition(x, y, targetX, targetY) { + // 使用配置中的阈值或默认值100 + const errorThreshold = 150; + return Math.abs(x - targetX) <= errorThreshold && Math.abs(y - targetY) <= errorThreshold; +} + + +/** + * 检查对话进度并返回统计信息 + * @param {Object[]} characterPositions - 角色点位信息数组 + * @returns {Object} 包含进度统计的对象 + */ +function checkProgress(characterPositions) { + const total = characterPositions.length; + let completed = 0; + const remainingCharacters = []; + const completedCharacters = []; + + for (const pos of characterPositions) { + if (config[pos.name]) { + completed++; + completedCharacters.push(pos.name); + } else { + remainingCharacters.push(pos.name); + } + } + + const remaining = total - completed; + const completionRate = total > 0 ? Math.round((completed / total) * 100) : 0; + + return { + total, + completed, + remaining, + completionRate, + remainingCharacters, + completedCharacters + }; +} + +/** + * 重置所有对话配置 + * @returns {Promise} + */ +async function resetAllProgress() { + log.info("重置所有对话进度..."); + config = {}; + await file.writeText("config.json", JSON.stringify(config, null, 4)); + log.info("✅ 所有对话进度已重置,将重新开始所有角色的对话"); +} + +/** + * 检查是否有未完成的角色,如果没有则提前结束 + * @param {Object[]} characterPositions - 角色点位信息数组 + * @returns {boolean} 是否还有未完成的角色 + */ +function hasRemainingCharacters(characterPositions) { + for (const pos of characterPositions) { + if (!config[pos.name]) { + return true; + } + } + return false; +} + +// === 设置管理相关函数 (BetterGI 自动处理设置) === + +/** + * 显示当前设置 + */ +function showCurrentSettings() { + log.info("=== 当前设置 ==="); + log.info(`启动时重置进度: ${settings.resetOnStart ? "✅ 启用" : "❌ 禁用"}`); + log.info(`进度更新间隔: ${settings.progressUpdateInterval} 次`); + log.info(`最大运行次数: ${settings.maxRuns}`); + log.info(`跳过已完成角色: ${settings.skipCompletedCharacters ? "✅ 启用" : "❌ 禁用"}`); + log.info("==============="); +} + +/** + * 处理重置相关设置 + * @param {Object[]} characterPositions - 角色点位信息数组 + * @returns {Promise} 是否继续执行程序 + */ +async function handleResetSettings() { + // 启动时重置 + if (settings.resetOnStart) { + log.info("⚠️ 检测到启动时重置设置已启用"); + log.info("将在 5 秒后重置所有进度,如需取消请立即停止程序"); + await sleep(5000); + + await resetAllProgress(); + log.info("🔄 已根据设置重置所有进度"); + } +} \ No newline at end of file diff --git a/repo/js/TravelersTales/manifest.json b/repo/js/TravelersTales/manifest.json new file mode 100644 index 00000000..d2ef8f57 --- /dev/null +++ b/repo/js/TravelersTales/manifest.json @@ -0,0 +1,21 @@ +{ + "manifest_version": 1, + "name": "游逸旅闻", + "version": "0.1.3", + "bgi_version": "0.45.1", + "description": "自动游逸旅闻", + "authors": [ + { + "name": "ddaodan", + "link": "https://github.com/ddaodan" + }, + { + "name": "秋云" + }, + { + "name": "mno" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/TravelersTales/settings.json b/repo/js/TravelersTales/settings.json new file mode 100644 index 00000000..56a0b5f3 --- /dev/null +++ b/repo/js/TravelersTales/settings.json @@ -0,0 +1,33 @@ +[ + { + "name": "resetOnStart", + "type": "checkbox", + "label": "启动时重置所有进度", + "default": false + }, + { + "name": "progressUpdateInterval", + "type": "select", + "label": "进度更新间隔(次数)", + "options": [ + "1", + "3", + "5", + "10", + "20" + ], + "default": "3" + }, + { + "name": "maxRuns", + "type": "input-text", + "label": "最大运行次数", + "default": "50" + }, + { + "name": "skipCompletedCharacters", + "type": "checkbox", + "label": "跳过已完成的角色", + "default": true + } +] \ No newline at end of file