diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Configure Team Button.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Configure Team Button.png new file mode 100644 index 00000000..e6bdd02a Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Configure Team Button.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Confirm Deploy Button.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Confirm Deploy Button.png new file mode 100644 index 00000000..6c870dfc Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Confirm Deploy Button.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Leave Button.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Leave Button.png new file mode 100644 index 00000000..58c150b4 Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Leave Button.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Quick Setup Button.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Quick Setup Button.png new file mode 100644 index 00000000..4b7e3751 Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Quick Setup Button.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Bottom.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Bottom.png new file mode 100644 index 00000000..4af2e3cb Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Bottom.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Top.png b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Top.png new file mode 100644 index 00000000..7334e462 Binary files /dev/null and b/repo/js/AcceleratedEditionSwitchParty/Assets/RecognitionObject/Slider Top.png differ diff --git a/repo/js/AcceleratedEditionSwitchParty/main.js b/repo/js/AcceleratedEditionSwitchParty/main.js new file mode 100644 index 00000000..f9dcc98f --- /dev/null +++ b/repo/js/AcceleratedEditionSwitchParty/main.js @@ -0,0 +1,146 @@ +// 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 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 * 2)); + 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)); + leftButtonDown(); + await sleep(1000); + leftButtonUp(); + await moveMouseTo(0, 0); + await sleep(100); + } + } + + // 切换队伍 + async function SwitchParty(partyName) { + let ConfigureStatue = false; + 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]; + log.info("当前队伍名称位置:({x},{y},{w},{h}), 识别结果:{text}", res.x, res.y, res.Width, res.Height, res.text); + if (res.text.includes(partyName)) { + log.info("当前队伍即为目标队伍,无需切换"); + keyPress("VK_ESCAPE"); + await sleep(500); + } 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 captureRegion = captureGameRegion(); + let resList = captureRegion.findMulti(RecognitionObject.ocr(0, 100, 400, 900)); + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + if (settings.enableDebug) { + 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.35)); + + // 找到目标队伍,点击确定、部署 + await sleep(1500); + let ConfirmButton = captureGameRegion().find(ConfirmDeployButtonRo); + if (ConfirmButton.isExist()) { + log.info("识别到确定按钮:({x},{y},{w},{h})", ConfirmButton.x, ConfirmButton.y, ConfirmButton.Width, ConfirmButton.Height); + ConfirmButton.click(); + } + await sleep(1500); + let DeployButton = captureGameRegion().find(ConfirmDeployButtonRo); + if (DeployButton.isExist()) { + log.info("识别到部署按钮:({x},{y},{w},{h})", DeployButton.x, DeployButton.y, DeployButton.Width, DeployButton.Height); + DeployButton.click(); + ConfigureStatue = true; + break; + } + } + } + if (ConfigureStatue) { + await genshin.returnMainUi(); + break; + } else { + await pageDown(LeftSliderBottomRo); + } + } + if (!ConfigureStatue) { + log.warn("\n\n队伍切换失败,可能是:\n1.处于联机模式 \n2.无法正确识别\n3.JS自定义配置中的队伍名称设置错误,请检查!\n"); + await genshin.returnMainUi(); + break; + } + } + } + } + } + + // Main + if (!!settings.partyName) { + // try { + if (!settings.disableGoStatue) { + log.info("正在传送回七天神像切换队伍"); + await genshin.TpToStatueOfTheSeven(); + log.info("正在尝试切换至" + settings.partyName); + await SwitchParty(settings.partyName); + } else { + await genshin.returnMainUi(); + log.info("正在尝试切换至" + settings.partyName); + await SwitchParty(settings.partyName); + } + // } catch { + // log.warn("队伍切换失败,可能处于联机模式或其他不可切换状态"); + // await genshin.returnMainUi(); + // } + } else { + log.warn("没有设置切换队伍"); + await genshin.returnMainUi(); + } +})(); \ No newline at end of file diff --git a/repo/js/AcceleratedEditionSwitchParty/manifest.json b/repo/js/AcceleratedEditionSwitchParty/manifest.json new file mode 100644 index 00000000..62b73da1 --- /dev/null +++ b/repo/js/AcceleratedEditionSwitchParty/manifest.json @@ -0,0 +1,15 @@ +{ + "manifest_version": 1, + "name": "返回七天神像切换指定队伍加速版", + "version": "1.0", + "BgiVersion": "0.44.1", + "description": "", + "authors": [ + { + "name": "起个名字好难的喵", + "links":"https://github.com/MisakaAldrich" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/AcceleratedEditionSwitchParty/settings.json b/repo/js/AcceleratedEditionSwitchParty/settings.json new file mode 100644 index 00000000..e655a17d --- /dev/null +++ b/repo/js/AcceleratedEditionSwitchParty/settings.json @@ -0,0 +1,17 @@ +[ + { + "name": "partyName", + "type": "input-text", + "label": "需要切换的队伍名称" + }, + { + "name": "disableGoStatue", + "type": "checkbox", + "label": "关闭前往七天神像" + }, + { + "name": "enableDebug", + "type": "checkbox", + "label": "开启Debug模式(队伍寻找过程中的识别内容)" + } +] \ No newline at end of file diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js b/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js index 01ad50e2..37ce10a6 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/main.js @@ -28,15 +28,17 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn */ (async function() { // 切换队伍 - for (let n = 0; n < 10; n++) { - log.warn("提示:队伍中小于等于两人时,才会触发双倍奖励"); + if (!settings.disableNotice) { + for (let n = 0; n < 10; n++) { + log.warn("提示:队伍中小于等于两人时,才会触发双倍奖励"); + } + await sleep(1000); } - await sleep(1000); if (!!settings.partyName) { try { log.info("正在尝试切换至" + settings.partyName); - if (!settings.goStatue) { + if (!settings.disableGoStatue) { log.info("正在传送回七天神像切换队伍"); await genshin.TpToStatueOfTheSeven(); await SwitchParty(settings.partyName); @@ -45,7 +47,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn await SwitchParty(settings.partyName); } } catch { - log.warn("队伍切换失败,可能处于联机模式或其他不可切换状态"); + log.warn("\n\n队伍切换失败,可能是:\n1.处于联机模式 \n2.无法正确识别\n3.JS自定义配置中的队伍名称设置错误,请检查!\n"); await genshin.returnMainUi(); } } else { @@ -86,6 +88,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn // 切换队伍 async function SwitchParty(partyName) { + let ConfigureStatue = false; keyPress("VK_L"); for (let i = 0; i < 10; i++) { @@ -102,10 +105,11 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn let resList = captureRegion.findMulti(RecognitionObject.ocr(100, 900, 300, 180)); 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("当前队伍即为目标队伍,无需切换", res.x, res.y, res.Width, res.Height, res.text); + log.info("当前队伍即为目标队伍,无需切换"); keyPress("VK_ESCAPE"); - await sleep(1000); + await sleep(500); } else { await sleep(1000); let ConfigureTeamButton = captureGameRegion().find(ConfigureTeamButtonRo); @@ -116,36 +120,47 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn 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 (settings.enableDebug) { + 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)); + 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.35)); // 找到目标队伍,点击确定、部署 - for (let c = 0; c < 2; c++) { - await sleep(1000); - let ConfirmDeployButton = captureGameRegion().find(ConfirmDeployButtonRo); - if (ConfirmDeployButton.isExist()) { - log.info("识别到确定按钮"); - ConfirmDeployButton.click(); - } + await sleep(1500); + let ConfirmButton = captureGameRegion().find(ConfirmDeployButtonRo); + if (ConfirmButton.isExist()) { + log.info("识别到确定按钮:({x},{y},{w},{h})", ConfirmButton.x, ConfirmButton.y, ConfirmButton.Width, ConfirmButton.Height); + ConfirmButton.click(); + } + await sleep(1500); + let DeployButton = captureGameRegion().find(ConfirmDeployButtonRo); + if (DeployButton.isExist()) { + log.info("识别到部署按钮:({x},{y},{w},{h})", DeployButton.x, DeployButton.y, DeployButton.Width, DeployButton.Height); + DeployButton.click(); + ConfigureStatue = true; + break; } - ConfigureStatue = true; - keyPress("VK_ESCAPE"); } } if (ConfigureStatue) { + await genshin.returnMainUi(); break; } else { await pageDown(LeftSliderBottomRo); } } + if (!ConfigureStatue) { + log.warn("\n\n队伍切换失败,可能是:\n1.处于联机模式 \n2.无法正确识别\n3.JS自定义配置中的队伍名称设置错误,请检查!\n"); + await genshin.returnMainUi(); + break; + } } } } @@ -164,7 +179,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn FriendsBotton.click(); await sleep(2000); } else { - log.info("未识别到按钮,使用坐标点击"); + log.warn("未识别到按钮,使用坐标点击"); click(680, 550); await sleep(2000); } @@ -176,7 +191,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn 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); + 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); @@ -186,7 +201,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn 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); + log.info("申请造访尘歌壶位置:({x},{y},{w},{h}), 识别内容:{text}", res.x, res.y, res.Width, res.Height, res.text); res.click(); } } @@ -242,7 +257,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn FriendsBotton.click(); await sleep(2000); } else { - log.info("未识别到按钮,使用坐标点击"); + log.warn("未识别到按钮,使用坐标点击"); // click(1020,840); click(680, 550); await sleep(2000); @@ -326,7 +341,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn 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); + log.info("识别到委托选项卡位置:({x},{y},{w},{h}), 识别内容:{text}", res.x, res.y, res.Width, res.Height, res.text); res.click(); } else { log.info("未识别到识别到委托选项卡"); @@ -342,7 +357,7 @@ const RightSliderBottomRo = RecognitionObject.TemplateMatch(file.ReadImageMatSyn log.info("已领取历练点奖励"); keyPress("VK_ESCAPE"); } else if (EncounterPointsStageRewardsButton.isEmpty()) { - log.info("未识别到历练点领取奖励按钮"); + log.warn("未识别到历练点领取奖励按钮,可能是已领取或未完成"); } await genshin.returnMainUi(); await sleep(2000); diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json b/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json index 36f28139..d4b3b368 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "历练点双倍好感(Recognition Version)", - "version": "2.1", + "version": "2.1.1", "BgiVersion": "0.44.1", "description": "进入好友尘歌壶,用历练点领取双倍好感\n目前支持游戏语言:简体、繁体中文、英文\n!!!此版本基于图像识别&OCR,Build日期早于2025年4月2日的BetterGI无法使用", "authors": [ diff --git a/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json b/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json index b7071d2b..1475a48d 100644 --- a/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json +++ b/repo/js/DoubleFriendshipEncounterPointsRecognition/settings.json @@ -15,8 +15,18 @@ "label": "(选填)申请好友数,需小于等于7,不支持翻页" }, { - "name": "goStatue", + "name": "disableGoStatue", "type": "checkbox", "label": "关闭前往七天神像" + }, + { + "name": "disableNotice", + "type": "checkbox", + "label": "关闭双人队伍提醒" + }, + { + "name": "enableDebug", + "type": "checkbox", + "label": "开启Debug模式(队伍识别输出所有内容)" } ] \ No newline at end of file