diff --git a/repo/js/DoubleFriendshipEncounterPoints/main.js b/repo/js/DoubleFriendshipEncounterPoints/main.js deleted file mode 100644 index 63eaa842..00000000 --- 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 84058c3e..00000000 --- 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 8042a16d..00000000 --- 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 00000000..d3848bef Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Co-Op Mode Page.png differ 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 00000000..e6bdd02a Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Configure Team Button.png differ diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Confirm Deploy Button.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Confirm Deploy Button.png new file mode 100644 index 00000000..6c870dfc Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Confirm Deploy Button.png differ 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 00000000..ed39e777 Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/My Friends Page.png differ diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Quick Setup Button.png b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Quick Setup Button.png new file mode 100644 index 00000000..4b7e3751 Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Quick Setup Button.png differ 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 00000000..4af2e3cb Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Bottom.png differ 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 00000000..7334e462 Binary files /dev/null and b/repo/js/DoubleFriendshipEncounterPointsRecognition/Assets/RecognitionObject/Slider Top.png differ 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 1bd6fa78..01ad50e2 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 5ae73016..36f28139 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 29364b7f..b7071d2b 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