JS脚本:feat:双倍好感度支持指定翻页寻找好友,fix:自增坐标间隔好友因单击取消选项卡不点及第四位好友错点备注的bug (#510)
@@ -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();
|
||||
})();
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"manifest_version": 1,
|
||||
"name": "历练点双倍好感",
|
||||
"version": "1.0",
|
||||
"description": "进入好友尘歌壶,用历练点领取双倍好感",
|
||||
"authors": [
|
||||
{
|
||||
"name": "起个名字好难的喵"
|
||||
}
|
||||
],
|
||||
"settings_ui": "settings.json",
|
||||
"main": "main.js"
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "partyName",
|
||||
"type": "input-text",
|
||||
"label": "(选填)需要切换的队伍名称"
|
||||
},
|
||||
{
|
||||
"name": "request_times",
|
||||
"type": "input-text",
|
||||
"label": "(选填)申请好友数,需小于等于7,不支持翻页"
|
||||
}
|
||||
]
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 307 B |
|
After Width: | Height: | Size: 517 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -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<void>}
|
||||
*/
|
||||
(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);
|
||||
}
|
||||
}
|
||||
})();
|
||||
@@ -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",
|
||||
|
||||
@@ -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": "关闭前往七天神像"
|
||||
}
|
||||
]
|
||||