From 0b2fcd14cce1ab87e70e0203444a4b97fd85908a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B7=E4=B8=AA=E5=90=8D=E5=AD=97=E5=A5=BD=E9=9A=BE?= =?UTF-8?q?=E7=9A=84=E5=96=B5?= <25520958+MisakaAldrich@users.noreply.github.com> Date: Wed, 2 Apr 2025 15:17:56 +0800 Subject: [PATCH] =?UTF-8?q?JS=E8=84=9A=E6=9C=AC=EF=BC=9Afeat:=E5=8F=8C?= =?UTF-8?q?=E5=80=8D=E5=A5=BD=E6=84=9F=E5=BA=A6=E6=94=AF=E6=8C=81=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E7=BF=BB=E9=A1=B5=E5=AF=BB=E6=89=BE=E5=A5=BD=E5=8F=8B?= =?UTF-8?q?=EF=BC=8Cfix:=E8=87=AA=E5=A2=9E=E5=9D=90=E6=A0=87=E9=97=B4?= =?UTF-8?q?=E9=9A=94=E5=A5=BD=E5=8F=8B=E5=9B=A0=E5=8D=95=E5=87=BB=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E9=80=89=E9=A1=B9=E5=8D=A1=E4=B8=8D=E7=82=B9=E5=8F=8A?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E4=BD=8D=E5=A5=BD=E5=8F=8B=E9=94=99=E7=82=B9?= =?UTF-8?q?=E5=A4=87=E6=B3=A8=E7=9A=84bug=20(#510)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DoubleFriendshipEncounterPoints/main.js | 115 ------ .../manifest.json | 13 - .../settings.json | 12 - .../Adventurer Handbook Button.png} | Bin .../RecognitionObject/Co-Op Mode Button.png} | Bin .../RecognitionObject/Co-Op Mode Page.png | Bin 0 -> 4630 bytes .../Configure Team Button.png | Bin 0 -> 1211 bytes .../Confirm Deploy Button.png | Bin 0 -> 2010 bytes .../Encounter Points Stage Rewards.png | Bin .../RecognitionObject/Friends Button.png} | Bin .../RecognitionObject/Leave Button.png} | Bin .../RecognitionObject/My Friends Page.png | Bin 0 -> 3454 bytes .../RecognitionObject/Quick Setup Button.png | Bin 0 -> 2499 bytes .../RecognitionObject/Slider Bottom.png | Bin 0 -> 307 bytes .../Assets/RecognitionObject/Slider Top.png | Bin 0 -> 517 bytes .../RecognitionObject}/paimon_menu.png | Bin .../main.js | 362 ++++++++++++------ .../manifest.json | 9 +- .../settings.json | 9 +- 19 files changed, 265 insertions(+), 255 deletions(-) delete mode 100644 repo/js/DoubleFriendshipEncounterPoints/main.js delete mode 100644 repo/js/DoubleFriendshipEncounterPoints/manifest.json delete mode 100644 repo/js/DoubleFriendshipEncounterPoints/settings.json rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets/Adventurer Handbook.png => Assets/RecognitionObject/Adventurer Handbook Button.png} (100%) rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets/Co-Op Mode.png => Assets/RecognitionObject/Co-Op Mode Button.png} (100%) create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Page.png create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Configure Team Button.png create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Confirm Deploy Button.png rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets => Assets/RecognitionObject}/Encounter Points Stage Rewards.png (100%) rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets/Friends.png => Assets/RecognitionObject/Friends Button.png} (100%) rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets/Leave the Serenitea Pot.png => Assets/RecognitionObject/Leave Button.png} (100%) create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/My Friends Page.png create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Quick Setup Button.png create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Bottom.png create mode 100644 repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Top.png rename repo/js/DoubleFriendshipEncounterPointsRecognition/{assets => Assets/RecognitionObject}/paimon_menu.png (100%) diff --git a/repo/js/DoubleFriendshipEncounterPoints/main.js b/repo/js/DoubleFriendshipEncounterPoints/main.js deleted file mode 100644 index 63eaa8425..000000000 --- a/repo/js/DoubleFriendshipEncounterPoints/main.js +++ /dev/null @@ -1,115 +0,0 @@ -(async function () { - - async function RequestToVisitSereniteaPot(total_clicks) { - setGameMetrics(3840, 2160, 1.5); - await sleep(2000); - keyPress("VK_ESCAPE"); - await sleep(2000); - click(1020,840); - await sleep(2000); - - let y_avatar = 355; //好友头像按钮起始Y坐标 - let y_request = 489; //申请造访按钮起始Y坐标 - const x_avatar = 415; - const x_request = 920; - const avatar_increment = 250; //两按钮相隔坐标 - const request_increment = 249; //两按钮相隔坐标 - const request_fixed_value = 1118; //第四~七位好友申请造访按钮Y坐标 - let request_count = 0; - - // 先申请造访首位好友的尘歌壶 - log.info("正在申请造访第 1 位好友尘歌壶"); - click(x_avatar, y_avatar); - await sleep(1000); - click(x_request, y_request); - await sleep(1000); - - // 依次申请造访第二~七位好友的尘歌壶 - for (let i = 2; i < total_clicks; i++) { - if (i % 2 === 0) { - // 偶数索引,递增 y_avatar - y_avatar += avatar_increment; - log.info(`正在申请造访第 ${i/2+1} 位好友尘歌壶`); - click(x_avatar, y_avatar); - await sleep(1000); - } else { - // 奇数索引,递增 y_request - if (request_count < 3) { - // 前 3 次递增 249 - y_request += request_increment; - } else { - // 第四次及以后设为 1118 - y_request = request_fixed_value; - } - request_count++; - click(x_request, y_request); - await sleep(1000); - } - } - log.info("等待界面响应"); - await sleep(10000); - } - - async function pageDown() { - //暂无计划,还是联系一下好友开放尘歌壶吧 - } - - async function claimEncounterPointsRewards() { - setGameMetrics(3840, 2160, 1.5); - log.info("正在打开冒险之证领取历练点奖励"); - await sleep(2000); - keyPress("VK_ESCAPE"); - await sleep(2000); - click(400,1650); - await sleep(2000); - - setGameMetrics(3840, 2160, 2); //领历练点这小节是抄来的 - click(580, 680); - await sleep(1000); - click(3110, 1508); - await sleep(1000); - click(3110, 1508); - await sleep(1500); - keyPress("Escape"); - log.info("已领取历练点奖励"); - } - - async function ReturnToBigWorld() { - setGameMetrics(3840, 2160, 1.5); - log.info("正在返回大世界"); - await sleep(2000); - keyPress("VK_ESCAPE"); - await sleep(2000); - click(1330,1660); - await sleep(2000); - click(3300,2030); - await sleep(20000); - } - - let request_times = settings.request_times * 2; - let total_clicks = request_times ? request_times : 14; - - for (let n = 0 ; n < 6 ; n++) - log.warn("注意:队伍中小于等于两人时,才会触发双倍奖励"); - await sleep(2000); - - if (!!settings.partyName) { - try { - log.info("正在传送回七天神像切换队伍"); - await genshin.tp(2297.60, -824.45); - await sleep(3000); - log.info("正在尝试切换至" + settings.partyName); - await genshin.switchParty(settings.partyName); - } catch { - log.warn("队伍切换失败,可能处于联机模式或其他不可切换状态"); - await genshin.returnMainUi(); - } - } else { - await genshin.returnMainUi(); - } - await RequestToVisitSereniteaPot(total_clicks); - await claimEncounterPointsRewards(); - await sleep(1500); - await genshin.returnMainUi(); - await ReturnToBigWorld(); -})(); \ No newline at end of file diff --git a/repo/js/DoubleFriendshipEncounterPoints/manifest.json b/repo/js/DoubleFriendshipEncounterPoints/manifest.json deleted file mode 100644 index 84058c3e9..000000000 --- a/repo/js/DoubleFriendshipEncounterPoints/manifest.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "manifest_version": 1, - "name": "历练点双倍好感", - "version": "1.0", - "description": "进入好友尘歌壶,用历练点领取双倍好感", - "authors": [ - { - "name": "起个名字好难的喵" - } - ], - "settings_ui": "settings.json", - "main": "main.js" -} \ No newline at end of file diff --git a/repo/js/DoubleFriendshipEncounterPoints/settings.json b/repo/js/DoubleFriendshipEncounterPoints/settings.json deleted file mode 100644 index 8042a16d3..000000000 --- a/repo/js/DoubleFriendshipEncounterPoints/settings.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "name": "partyName", - "type": "input-text", - "label": "(选填)需要切换的队伍名称" - }, - { - "name": "request_times", - "type": "input-text", - "label": "(选填)申请好友数,需小于等于7,不支持翻页" - } -] \ No newline at end of file diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Adventurer Handbook.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Adventurer Handbook Button.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Adventurer Handbook.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Adventurer Handbook Button.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Co-Op Mode.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Button.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Co-Op Mode.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Button.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Page.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Page.png new file mode 100644 index 0000000000000000000000000000000000000000..d3848befa92efcfcda0c01c601b07738078ae284 GIT binary patch literal 4630 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 M07*qoM6N<$g6&4#5C8xG literal 0 HcmV?d00001 diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Configure Team Button.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Configure Team Button.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bdd02afbf3fa48bafe5e4a6d6440dc4222d41f GIT binary patch literal 1211 zcmV;s1VsCZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1W-vtK~z{ry_jum z6h#=v|Fd^3&^KCo1uaOl7DFHv@Pm;S5+ufe8d@P>RBF{i(E@^RsEHCxRf-9k7B%rD zLSl?j5=;|6nLvCY5U|01K%qb@lC-szCe*g1z1tU`XKuE)dpA(p-toI^_IYM^X8!Zc zv%51Vy4y}VnR$h<%^_G;1dapPjzCKBG%pZ@Ap&q#5W!}+Jb{kKS@6o zq^GB0*Q-^SmY1zcq8LUHqPO!bOY}`u#Zx;|9;NChS7OzQQsqSvLcrjDRx{uq5P?;1Q;3)*RItL zI$_F^MI>Ts#V|)toJRZKUCQ&L%^^4J6JcO*NLh(+`)z-9D$kELhxUE`Jr4i+yDAwQ zO<&c?^Oe2AUdLwWYcoIoTPi#81*+jE_9H7|%Yjf;x_l^}qhBIQ+{g zv|s8%L4GclFIk9Lg$44Oj-&~?>&{uIseBkk^hsb`K|Fn7dg9KvcVOnNA>`&{UiTfR zP3lHU>LWLpN8I?fO{=l2bb++FJ`*u5{P5#(oM=9S3l}?KlF!#?&zz2uc}1vrs0<;M zV_tz;LCp0=;U)fl%d)ZelY?k(X~l3jBFl7e1n16~joN2c`KC}iWfS4C4Run8D|9qi z*r5Y&D=!64S;Kpqm33om-T0`oqD*+oT)g%A2d-lM^Sh<5!)?2sRt0m5Z&y zzVc!S+QDig`3MI6D?@I3J*^tG(2R@Tj#fGGa&yLK8XYI&cTGP_ zf2^>8kLtIM4C>^mvv~Kzucgf_U%Cj}YE~=H19flEc3SlPd(p9J@y&lU$a0mK&`50Bu0*#f$%doEYwR=<6F*oX9Qk()=;-fh Z$N#3c*}3v~00009a7bBm000&x z000&x0ZCFM@Bjb+5p+dZbW?9;ba!ELWdKudX>eh4bY)!^&fNe22X9G4K~z|Uy_ow` z8`l-bzjs$pB!L7%LOhJIK)h^h2MWeE7#y3iYcd%-V~=Orv`N!W|D^uVNyqgx6Wh}y zO@`F2362Xf2FDM~8*IRU5C{pO7f4!Z_x1-V!UA-metm!1IeX68&)z-v-m{kkR_9{j zh$x9*ic%WCh(rX(l5=*}zT#PRuXsYCa4Z(%d0wSb84Ov*979n-enEboR;!8o6GGUT zlaj@Rh(vebh-=>N`1#S(fx!{4&+qg3L*Z~J6cNRkC`ug1$#`C=RH!r5nL4dLE3>Mi ztiJAWS!u~GIRFs1V*HQN)3DIgb*#>=i*}gMv zt^2FWlXf=BIMQeK2ZFb|{@dBrv$*ICMOaruZ}WrcYJx{ z+xz_w*VaS-FT}bTi8FgWtYIpUg~vv>UahiA`cwtn{%lu#(# zbML{A-S^%SM_fZAr1#?1@^TluD8`H8b0B^9MnQvU3qalyaE#FzBFGQl3Lh zL?jB|8gY5C9)TpWDm@m9-GA_?yv%yC^_W5~PtNd-vJHj8ckce=Sah;Ecn+lnsIj8X zhO#2$W)YQz3-?ovQOe#rO^k94r4mUy(s*n?t0p&#~Fyf#UB^F}R>= z8w{>J8W^fMP?={orJ$^@hwk>=XN(6=@Zs?|2f|TwK19zDrWW8_r4a#g88v2+5(|!0 z;&d&H2An@ZM2f%siwd!{IR~DOEVa4JrrdbBBv9t<4yV(_Ksji|#TJsS1Awcy(b0biqv~=3sZ>({nIp;d~Prn!=qYX+M%@)jMxrtSm28DwRl1=E31H28T+4 z3(cg!2tx2xH@$Wz!Ld~?A3FMQy^97z$kgBu=SYTvrD@J0p^z>NdREdvD`x8NOEi3rb&2N@oEq$ zXxas0+b~Hb2idaivz74HXfzBbw;%E4p*U~1d2XAZrNJ6jKh95E5y zgDg)|ZjM4OPeHLUe^|y|U~~r2C@cp2=^XSr)>5I%z(>s}v4A6(oJarI_KQ$lMTPk) zl`;jTW`89EB`o0EUM#JGQhd~m%O_D_+}<-+j}MNLOD)i<5e(tV?H#%W>%P6340Zfk zmZUSAa~a#v<4JtegHO*OQ-j~N!IF)hK};>c=|x0lO#una}B7oVQdzQ9)tua<;c|& zTOkT_sayvCI&Svi@3*KZu}}`yROOj-H+OL|8Grm}eP>rUqh$$%@I@DvylAV%dp1~d zV95ber<4%I;1s$ZW5?D>tJTyUt}z%kWZNt zJ=6*aF|7D8?MOD1lwBeK_E(kL%JwCv4_;nv)oRtrmgA2HhS}|{C}Gl$Stt5OVaSA9 zL1jEd31I==V6x5Lfg?Lxf3%^_VllsL+!z&}=dC5h?PpJ2`Ns`*(@!Z43z%ER-16o- zJ0Qd#DU&tU*Vfh6B)i(UQnm@TTGe!{zP0(-ZZf{I4pdj1Io)E+$=+m7K_P^gO}Xu7 z-#=7S{gyb2_Y}7O`czqI$=2m@^X5qiv6b!n&E@kIHtQSb$TOQRU1&dcq;6Ng?*KTC zJ5*Es=RbaYV1MQAPtw>TgcRiGefG)awo@mzsq(#BIJ^*8)yw0&; zjzMp;SIUPx1A|z zQGBjhQH)BlU;Zc41iphKWa3?ZL8-Lkz`Rb`?$VPRnF)vz;dmLx%LtdYM<=hU-9vM| sgU;b;zbFx2Cg*q=Aq0d~G;dG;1IL+=p{x6i*Z=?k07*qoM6N<$g64q1L;wH) literal 0 HcmV?d00001 diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Encounter Points Stage Rewards.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Encounter Points Stage Rewards.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Encounter Points Stage Rewards.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Encounter Points Stage Rewards.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Friends.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Friends Button.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Friends.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Friends Button.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Leave the Serenitea Pot.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Leave Button.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/Leave the Serenitea Pot.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Leave Button.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/My Friends Page.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/My Friends Page.png new file mode 100644 index 0000000000000000000000000000000000000000..ed39e77706e069f5ba8b6e8c2ac5c3259f991c75 GIT binary patch literal 3454 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 N002ovPDHLkV1idH(&YdE literal 0 HcmV?d00001 diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Bottom.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4af2e3cb2cbfae1e2b64dab230b8f1753fab2fbd GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BS!3HE91=ODbDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9E$svykh8Km+7D0srt#W6%9c zvKIZZNAqcu;7g^`mj4Vw7JX~8?b3Hkc5&@bE#7s}sJG)xz|Grt{^-RRa&25V;gP=9Lq-J>PB=pSVaTU~+}n;T;R@gFbLD zu^gPtuOD%;``MHqz7E%YzqDzwJ(ko97giLEGdUCS=E|v1J)oZ$JYD@<);T3K0RVgU Bbaem# literal 0 HcmV?d00001 diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Top.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Top.png new file mode 100644 index 0000000000000000000000000000000000000000..7334e462d3aaf4a0dcf36f6b50a4da22abfb8fc4 GIT binary patch literal 517 zcmV+g0{Z=lP)#2meK|Hies_SI zLX+l+xgzHDUlXw%yshMd@ZuNJ^SYw00000NkvXX Hu0mjf5ToL$ literal 0 HcmV?d00001 diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/assets/paimon_menu.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/paimon_menu.png similarity index 100% rename from repo/js/DoubleFriendshipEncounterPointsRecognition/assets/paimon_menu.png rename to repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/paimon_menu.png diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js b/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js index 1bd6fa782..01ad50e26 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js @@ -1,27 +1,49 @@ -const FriendsRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Friends.png")); -const AdventurerHandbookRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Adventurer Handbook.png")); -const EncounterPointsStageRewardsRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Encounter Points Stage Rewards.png")); -const CoOpModeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Co-Op Mode.png")); -const LeavetheSereniteaPotRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Leave the Serenitea Pot.png")); -const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/paimon_menu.png")); +// Encounter Points +const AdventurerHandbookButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Adventurer Handbook Button.png"), 100, 300, 700, 700); +const EncounterPointsStageRewardsRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Encounter Points Stage Rewards.png"), 1500, 700, 100, 100); +// MainUi +const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/paimon_menu.png"), 0, 0, 100, 100); +// Paimon Menu +const FriendsButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Friends Button.png"), 0, 300, 700, 780); +const CoOpModeButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Co-Op Mode Button.png"), 100, 300, 700, 780); +// Co-Op Mode Page +const CoOpModeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Co-Op Mode Page.png"), 0, 0, 200, 100); +const MyFriendsRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/My Friends Page.png"), 0, 0, 200, 100); +const LeaveButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Leave Button.png"), 1400, 900, 300, 180); +// Party Setup +const QuickSetupButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Quick Setup Button.png"), 1100, 900, 400, 180); +const ConfigureTeamButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Configure Team Button.png"), 0, 900, 200, 180); +const ConfirmDeployButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Confirm Deploy Button.png"), 0, 900, 1920, 180); +// Slider +const LeftSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Top.png"), 650, 50, 100, 100); +const LeftSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Bottom.png"), 650, 100, 100, 900); +const MiddleSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Top.png"), 1250, 50, 100, 200); +const MiddleSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Bottom.png"), 1250, 100, 100, 900); +const RightSliderTopRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Top.png"), 1750, 100, 100, 100); +const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Slider Bottom.png"), 1750, 100, 100, 900); + /** * @returns {Promise} */ -(async function () { +(async function() { // 切换队伍 - for (let n = 0 ; n < 10 ; n++) { + for (let n = 0; n < 10; n++) { log.warn("提示:队伍中小于等于两人时,才会触发双倍奖励"); } - await sleep(2000); + await sleep(1000); if (!!settings.partyName) { try { - log.info("正在传送回七天神像切换队伍"); - await genshin.tp(2297.60, -824.45); - await sleep(3000); log.info("正在尝试切换至" + settings.partyName); - await genshin.switchParty(settings.partyName); + if (!settings.goStatue) { + log.info("正在传送回七天神像切换队伍"); + await genshin.TpToStatueOfTheSeven(); + await SwitchParty(settings.partyName); + } else { + await genshin.returnMainUi(); + await SwitchParty(settings.partyName); + } } catch { log.warn("队伍切换失败,可能处于联机模式或其他不可切换状态"); await genshin.returnMainUi(); @@ -34,24 +56,25 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse // 进尘歌壶领历练点奖励后返回大世界 let request_times = settings.request_times * 2; let total_clicks = request_times ? request_times : 14; - if(!!settings.appointFriendName) { - let enterState = await AppointFriendRequestToVisitSereniteaPot(); - if (enterState) { + if (!!settings.appointFriendName) { + let enterStatus = await AppointFriendRequestToVisitSereniteaPot(); + if (enterStatus) { await claimEncounterPointsRewards(); await ReturnToBigWorld(); } else { log.warn("好友列表未能识别出设置的好友名称"); log.info("尝试依次进入"); - let enterState = await RequestToVisitSereniteaPot(total_clicks); - if (enterState) { + await pageTop(RightSliderTopRo); + let enterStatus = await RequestToVisitSereniteaPot(total_clicks); + if (enterStatus) { await claimEncounterPointsRewards(); await ReturnToBigWorld(); } } } else if (!settings.appointFriendName) { log.warn("未设置指定好友,执行依次进入"); - let enterState = await RequestToVisitSereniteaPot(total_clicks); - if (enterState) { + let enterStatus = await RequestToVisitSereniteaPot(total_clicks); + if (enterStatus) { await claimEncounterPointsRewards(); await ReturnToBigWorld(); } @@ -59,15 +82,85 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse log.warn("出现异常,请检查自定义参数和日志,也可能是没有好友开放尘歌壶"); } + // 以下为可供调用的函数部分 + + // 切换队伍 + async function SwitchParty(partyName) { + keyPress("VK_L"); + + for (let i = 0; i < 10; i++) { + let QuickSetupButton = captureGameRegion().find(QuickSetupButtonRo); + if (QuickSetupButton.isExist()) { + log.info("已进入队伍配置页面"); + break; + } else { + await sleep(1000); + } + } + // 识别当前队伍 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(100, 900, 300, 180)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes(partyName)) { + log.info("当前队伍即为目标队伍,无需切换", res.x, res.y, res.Width, res.Height, res.text); + keyPress("VK_ESCAPE"); + await sleep(1000); + } else { + await sleep(1000); + let ConfigureTeamButton = captureGameRegion().find(ConfigureTeamButtonRo); + if (ConfigureTeamButton.isExist()) { + log.info("识别到配置队伍按钮"); + ConfigureTeamButton.click(); + await sleep(500); + await pageTop(LeftSliderTopRo); + + for (let p = 0; p < 4; p++) { + let ConfigureStatue = false; + // 识别当前页 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(0, 100, 400, 900)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + // log.info("文本位置:({x},{y},{w},{h}), 名称:{text}", res.x, res.y, res.Width, res.Height, res.text); + if (res.text.includes(partyName)) { + log.info("目标队伍位置:({x},{y},{w},{h}), 名称:{text}", res.x, res.y, res.Width, res.Height, res.text); + click(res.x, Math.ceil(res.y + res.Height * 1.1)); + + // 找到目标队伍,点击确定、部署 + for (let c = 0; c < 2; c++) { + await sleep(1000); + let ConfirmDeployButton = captureGameRegion().find(ConfirmDeployButtonRo); + if (ConfirmDeployButton.isExist()) { + log.info("识别到确定按钮"); + ConfirmDeployButton.click(); + } + } + ConfigureStatue = true; + keyPress("VK_ESCAPE"); + } + } + if (ConfigureStatue) { + break; + } else { + await pageDown(LeftSliderBottomRo); + } + } + } + } + } + } + // 模板匹配&OCR进指定好友尘歌壶 async function AppointFriendRequestToVisitSereniteaPot() { - let enterState = false; + let enterStatus = false; + await sleep(2000); keyPress("VK_ESCAPE"); await sleep(2000); - - let FriendsBotton = captureGameRegion().find(FriendsRo); + + let FriendsBotton = captureGameRegion().find(FriendsButtonRo); if (FriendsBotton.isExist()) { - log.info("识别到好友按钮,尝试点击"); + log.info("识别到好友按钮"); FriendsBotton.click(); await sleep(2000); } else { @@ -76,59 +169,76 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse await sleep(2000); } - // 点击好友头像 - let captureRegion = captureGameRegion(); - let resList = captureRegion.findMulti(RecognitionObject.ocr(250, 120, 500, 840)); - for (let i = 0; i < resList.count; i++) { - let res = resList[i]; - if (res.text.includes(settings.appointFriendName)) { - log.info("指定好友名字位置:({x},{y},{h},{w}), 文本{text}", res.x, res.y, res.width, res.Height, res.text); - click(res.x - 100, res.y + 50); - await sleep(2000); + for (let p = 0; p < 5; p++) { + // 点击好友头像 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(250, 120, 500, 840)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes(settings.appointFriendName)) { + log.info("指定好友名字位置:({x},{y},{w},{h}), 文本{text}", res.x, res.y, res.Width, res.Height, res.text); + click(res.x - 100, res.y + 50); + await sleep(500); - // 申请造访尘歌壶 - let captureRegion = captureGameRegion(); - let resList = captureRegion.findMulti(RecognitionObject.ocr(250, 220, 425, 380)); - for (let i = 0; i < resList.count; i++) { - let res = resList[i]; - if (res.text.includes("申请造访") || res.text.includes("visit Serenitea Pot") || res.text.includes("申請造訪")) { - log.info("申请造访尘歌壶位置:({x},{y},{h},{w}), 文本{text}", res.x, res.y, res.width, res.Height, res.text); - res.click(); - - // 模板匹配的方式等待加载 - log.info("等待界面响应"); - for (let i = 0; i < 10; i++) { - let captureRegion = captureGameRegion(); - let res = captureRegion.Find(paimonMenuRo); - if (res.isEmpty()) { - await click(960, 540); - } else if (res.isExist()) { - log.info("已进入好友尘歌壶"); - enterState = true; - break; - } else { - log.warn("出现异常情况,请检查"); - enterState = false; - } - await sleep(2000); + // 申请造访尘歌壶 + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(250, 220, 425, 380)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes("申请造访") || res.text.includes("visit Serenitea Pot") || res.text.includes("申請造訪")) { + log.info("申请造访尘歌壶位置:({x},{y},{w},{h}), 文本{text}", res.x, res.y, res.Width, res.Height, res.text); + res.click(); } + } + } + } + // 翻页继续尝试&模板匹配的方式等待加载 + let SliderBottom = captureGameRegion().find(RightSliderBottomRo); + if (SliderBottom.isExist()) { + await pageDown(RightSliderBottomRo); + } else { + for (let i = 0; i < 10; i++) { + let captureRegion = captureGameRegion(); + let paimonMenu = captureRegion.Find(paimonMenuRo); + let CoOpMode = captureRegion.Find(CoOpModeRo); + let MyFriends = captureRegion.Find(MyFriendsRo); + if (CoOpMode.isExist() || MyFriends.isExist()) { + log.info("继续申请"); break; + } else if (paimonMenu.isEmpty() && (CoOpMode.isEmpty() || MyFriends.isEmpty())) { + log.info("正在等待加载"); + await click(960, 540); + for (let i = 0; i < 30; i++) { + let captureRegion = captureGameRegion(); + let paimonMenu = captureRegion.Find(paimonMenuRo); + if (paimonMenu.isExist()) { + break; + } + await sleep(1000); + } + } else if (paimonMenu.isExist()) { + log.info("已进入联机模式"); + enterStatus = true; + break; + } else { + log.warn("出现异常情况,请检查"); + enterStatus = false; } } break; } } - return enterState; + return enterStatus; } - // 好友列表递增坐标进尘歌壶 + // 好友列表递增坐标进尘歌壶(仅第一页) async function RequestToVisitSereniteaPot(total_clicks) { - let enterState = false; + let enterStatus = false; keyPress("VK_ESCAPE"); await sleep(2000); - let FriendsBotton = captureGameRegion().find(FriendsRo); + let FriendsBotton = captureGameRegion().find(FriendsButtonRo); if (FriendsBotton.isExist()) { - log.info("识别到好友按钮,尝试点击"); + log.info("识别到好友按钮"); FriendsBotton.click(); await sleep(2000); } else { @@ -138,66 +248,64 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse await sleep(2000); } - let y_avatar = 178; //好友头像按钮起始Y坐标 - let y_request = 245; //申请造访按钮起始Y坐标 + let y_avatar = 178; //好友头像按钮起始Y坐标 + let y_request = 245; //申请造访按钮起始Y坐标 const x_avatar = 208; const x_request = 460; - const avatar_increment = 125; //两按钮相隔坐标 - const request_increment = 124; //两按钮相隔坐标 - const request_fixed_value = 560; //第四~七位好友申请造访按钮Y坐标 + const avatar_increment = 125; //两按钮相隔坐标 + const request_increment = 124; //两按钮相隔坐标 + const request_fixed_value = 560; //第四~七位好友申请造访按钮Y坐标 let request_count = 0; - + // 先申请造访首位好友的尘歌壶 log.info("正在申请造访第 1 位好友尘歌壶"); click(x_avatar, y_avatar); - await sleep(1000); + await sleep(750); click(x_request, y_request); - await sleep(1000); + await sleep(750); // 依次申请造访第 2 ~ 7 位好友的尘歌壶 - for (let i = 2; i < total_clicks; i++) { - if (i % 2 === 0) { + for (let i = 2; i < total_clicks; i++) { + if (i % 2 === 0) { // 偶数索引,递增 y_avatar y_avatar += avatar_increment; log.info(`正在申请造访第 ${i/2+1} 位好友尘歌壶`); click(x_avatar, y_avatar); - await sleep(1000); - } else { + await sleep(250); + click(x_avatar, y_avatar); + await sleep(750); + } else { // 奇数索引,递增 y_request - if (request_count < 3) { - // 前 3 次递增 249 + if (request_count < 2) { + // 前 3 位好友递增 249 y_request += request_increment; - } else { - // 第四次及以后设为 1118 + } else { + // 第 4 位及以后设为 1118 y_request = request_fixed_value; } request_count++; click(x_request, y_request); - await sleep(1000); + await sleep(750); } } // 模板匹配的方式等待加载 log.info("等待界面响应"); - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 30; i++) { let captureRegion = captureGameRegion(); let res = captureRegion.Find(paimonMenuRo); if (res.isEmpty()) { - await click(1920, 1080); + await click(960, 540); } else if (res.isExist()) { log.info("已进入好友尘歌壶"); - enterState = true; + enterStatus = true; break; } else { log.warn("出现异常情况,请检查"); - enterState = false; + enterStatus = false; } - await sleep(2000); + await sleep(500); } - return enterState; - } - - async function pageDown() { - //暂无计划,还是联系一下好友开放尘歌壶吧 + return enterStatus; } // 模板匹配领取历练点奖励 @@ -205,45 +313,55 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse log.info("正在打开冒险之证领取历练点奖励"); await sleep(2000); keyPress("VK_ESCAPE"); - await sleep(2000); - let AdventurerHandbookButton = captureGameRegion().find(AdventurerHandbookRo); + await sleep(2000); + let AdventurerHandbookButton = captureGameRegion().find(AdventurerHandbookButtonRo); if (AdventurerHandbookButton.isExist()) { - log.info("识别到冒险之证按钮,尝试点击"); + log.info("识别到冒险之证按钮"); AdventurerHandbookButton.click(); - // 委托按钮 - await sleep(2000); - click(300, 350); + await sleep(2000) + let captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(200, 300, 200, 100)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (res.text.includes("委托") || res.text.includes("委託") || res.text.includes("Commissions") || res.text.includes("委")) { + log.info("识别到委托选项卡位置:({x},{y},{w},{h}), 文本{text}", res.x, res.y, res.Width, res.Height, res.text); + res.click(); + } else { + log.info("未识别到识别到委托选项卡"); + } + } + await sleep(2000) let EncounterPointsStageRewardsButton = captureGameRegion().find(EncounterPointsStageRewardsRo); if (EncounterPointsStageRewardsButton.isExist()) { - log.info("识别到历练点领取按钮,尝试点击"); + log.info("识别到历练点领取按钮"); EncounterPointsStageRewardsButton.click(); await sleep(2000); log.info("已领取历练点奖励"); - keyPress("Escape"); + keyPress("VK_ESCAPE"); + } else if (EncounterPointsStageRewardsButton.isEmpty()) { + log.info("未识别到历练点领取奖励按钮"); } - await genshin.returnMainUi(); - await sleep(2000); + await genshin.returnMainUi(); + await sleep(2000); } } // 模板匹配退出尘歌壶回到大世界 async function ReturnToBigWorld() { log.info("正在返回大世界"); - keyPress("VK_ESCAPE"); + keyPress("VK_F2"); await sleep(2000); - let CoOpModeButton = captureGameRegion().find(CoOpModeRo); if (CoOpModeButton.isExist()) { - log.info("识别到多人游戏按钮,尝试点击"); - CoOpModeButton.click(); - await sleep(2000); - let LeavetheSereniteaPotButton = captureGameRegion().find(LeavetheSereniteaPotRo); - if (LeavetheSereniteaPotButton.isExist()) { - log.info("识别到离开尘歌壶按钮,尝试点击"); - LeavetheSereniteaPotButton.click(); + log.info("识别到多人游戏页面"); + // + let LeaveButton = captureGameRegion().find(LeaveButtonRo); + if (LeaveButton.isExist()) { + log.info("识别到离开尘歌壶按钮"); + LeaveButton.click(); await sleep(2000); } // 模板匹配的方式等待加载 @@ -263,4 +381,30 @@ const paimonMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("asse } } } + + // 向下一页 + async function pageDown(SliderBottomRo) { + let SliderBottom = captureGameRegion().find(SliderBottomRo); + if (SliderBottom.isExist()) { + log.info("当前页面已点击完毕,向下滑动"); + log.info("滑块当前位置:({x},{y},{h},{w})", SliderBottom.x, SliderBottom.y, SliderBottom.Width, SliderBottom.Height); + click(Math.ceil(SliderBottom.x + SliderBottom.Width / 2), Math.ceil(SliderBottom.y + SliderBottom.Height * 3.5)); + await moveMouseTo(0, 0); + await sleep(100); + } + } + + // 回到页面顶部 + async function pageTop(SliderTopRo) { + let SliderTop = captureGameRegion().find(SliderTopRo); + if (SliderTop.isExist()) { + log.info("滑条顶端位置:({x},{y},{h},{w})", SliderTop.x, SliderTop.y, SliderTop.Width, SliderTop.Height); + await moveMouseTo(Math.ceil(SliderTop.x + SliderTop.Width / 2), Math.ceil(SliderTop.y + SliderTop.Height * 1.5)); + leftButtonDown(); + await sleep(500); + leftButtonUp(); + await moveMouseTo(0, 0); + await sleep(1000); + } + } })(); \ No newline at end of file diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json b/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json index 5ae730169..36f281392 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json @@ -1,12 +1,13 @@ { "manifest_version": 1, "name": "历练点双倍好感(Recognition Version)", - "version": "2.0", - "BgiVersion": "0.43.6", - "description": "进入好友尘歌壶,用历练点领取双倍好感\n!!!此版本基于图像识别&OCR,CI日期早于2025年3月31日的BetterGI无法使用", + "version": "2.1", + "BgiVersion": "0.44.1", + "description": "进入好友尘歌壶,用历练点领取双倍好感\n目前支持游戏语言:简体、繁体中文、英文\n!!!此版本基于图像识别&OCR,Build日期早于2025年4月2日的BetterGI无法使用", "authors": [ { - "name": "起个名字好难的喵" + "name": "起个名字好难的喵", + "links":"https://github.com/MisakaAldrich" } ], "settings_ui": "settings.json", diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json b/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json index 29364b7fc..b7071d2b7 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json @@ -2,16 +2,21 @@ { "name": "partyName", "type": "input-text", - "label": "(选填)需要切换的队伍名称" + "label": "(选填)需要领取双倍好感的队伍名称" }, { "name": "appointFriendName", "type": "input-text", - "label": "指定好友名称" + "label": "(选填)指定好友名称" }, { "name": "request_times", "type": "input-text", "label": "(选填)申请好友数,需小于等于7,不支持翻页" + }, + { + "name": "goStatue", + "type": "checkbox", + "label": "关闭前往七天神像" } ] \ No newline at end of file