JS脚本打牌一条龙更新 (#2045)

* Update settings.json

* Update manifest.json

* Update main.js

* Add files via upload
This commit is contained in:
5117600049
2025-10-01 12:37:34 +08:00
committed by GitHub
parent 66d07d465c
commit dfe716de9a
9 changed files with 143 additions and 5 deletions

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":1687},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":3156},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":3515},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":3656},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4312},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4437},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":5234},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":7140},{"type":0,"keyCode":65,"mouseX":0,"mouseY":0,"time":7500},{"type":1,"keyCode":65,"mouseX":0,"mouseY":0,"time":7700}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":100,"mouseX":0,"mouseY":0,"time":500},{"type":1,"keyCode":100,"mouseX":0,"mouseY":0,"time":900},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":1062},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":2765},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":3375},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":3500},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4375},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4531},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":5390},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":7031},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":7200},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":8000}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":2218},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":3718},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":4109},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":4265},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":5187},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":5312},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":6140},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":8937},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":9375},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":10843}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":750},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":2125},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":2468},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":2562},{"type":6,"mouseX":0,"mouseY":120,"time":3406},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":3593},{"type":6,"mouseX":0,"mouseY":-120,"time":3593},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":3750},{"type":6,"mouseX":0,"mouseY":120,"time":3781},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":4718},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":8593},{"type":0,"keyCode":65,"mouseX":0,"mouseY":0,"time":8890},{"type":1,"keyCode":65,"mouseX":0,"mouseY":0,"time":9875}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":1016},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":2407},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":2938},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":3047},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":3813},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":3969},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":4766},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":11500}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -0,0 +1 @@
{"macroEvents":[{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":1219},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":2672},{"type":0,"keyCode":68,"mouseX":0,"mouseY":0,"time":3141},{"type":1,"keyCode":68,"mouseX":0,"mouseY":0,"time":3250},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4219},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":4391},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":5250},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":8400},{"type":0,"keyCode":65,"mouseX":0,"mouseY":0,"time":8735},{"type":1,"keyCode":65,"mouseX":0,"mouseY":0,"time":8844},{"type":4,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":9453},{"type":5,"mouseX":2051,"mouseY":1275,"mouseButton":"Middle","time":9980},{"type":0,"keyCode":87,"mouseX":0,"mouseY":0,"time":10400},{"type":1,"keyCode":87,"mouseX":0,"mouseY":0,"time":13000}],"info":{"name":"","description":"","x":1090,"y":758,"width":1920,"height":1080,"recordDpi":1.75}}

View File

@@ -590,6 +590,91 @@ async function searchAndClickTexts() {
return false;
}
/**
* 在指定区域内查找并点击指定文字
* @param {string} targetText - 要点击的目标文字
* @param {number} x - 识别区域的左上角X坐标
* @param {number} y - 识别区域的左上角Y坐标
* @param {number} width - 识别区域的宽度
* @param {number} height - 识别区域的高度
* @param {object} options - 可选参数
* @param {boolean} options.trimText - 是否对OCR结果进行trim处理默认true
* @param {boolean} options.clickCenter - 是否点击文字区域中心默认true
* @param {number} options.retryCount - 重试次数默认1不重试
* @param {number} options.retryInterval - 重试间隔(毫秒)默认500
* @returns {Promise<boolean>} 是否找到并点击了文字
*/
async function clickTextInRegion(targetText, x, y, width, height, options = {}) {
const {
trimText = true,
clickCenter = true,
retryCount = 1,
retryInterval = 500
} = options;
for (let attempt = 0; attempt <= retryCount; attempt++) {
try {
// 获取游戏区域截图
const captureRegion = captureGameRegion();
// 创建OCR识别对象限定识别区域
const ocrRo = RecognitionObject.ocr(x, y, width, height);
// 在限定区域内进行OCR识别
const results = captureRegion.findMulti(ocrRo);
// 遍历OCR结果
for (let i = 0; i < results.count; i++) {
const res = results[i];
let detectedText = res.text;
// 可选:去除前后空白字符
if (trimText) {
detectedText = detectedText.trim();
}
// 检查是否匹配目标文字
if (detectedText === targetText) {
log.info(`找到目标文字: "${targetText}",位置: (${res.x}, ${res.y}, ${res.width}, ${res.height})`);
if (clickCenter) {
// 点击文字区域中心
keyDown("VK_LMENU");
await sleep(500);
res.click();
await sleep(100);
keyUp("VK_LMENU");
log.info(`已点击文字中心: "${targetText}"`);
} else {
// 点击文字区域的左上角
res.clickTo(0, 0);
log.info(`已点击文字偏移位置: "${targetText}"`);
}
return true;
}
}
// 如果当前尝试未找到,且还有重试机会,则等待后重试
if (attempt < retryCount) {
log.info(`${attempt + 1}次尝试未找到文字"${targetText}"${retryInterval}ms后重试...`);
await sleep(retryInterval);
}
} catch (error) {
log.error(`点击文字"${targetText}"时发生错误: ${error.message}`);
if (attempt < retryCount) {
await sleep(retryInterval);
}
}
}
log.info(`未找到文字: "${targetText}",已尝试${retryCount + 1}`);
return false;
}
//函数:打开地图前往猫尾酒馆
async function gotoTavern() {
const tavernRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/tavern.png"));
@@ -599,7 +684,7 @@ async function gotoTavern() {
await sleep(1500);
click(1841, 1015); //地图选择
await sleep(1000);
click(1460, 140); //蒙德
await clickTextInRegion("蒙德", 1310, 70, 90, 180);
await sleep(1200);
//放大地图
await genshin.setBigMapZoomLevel(1.0);
@@ -643,12 +728,13 @@ async function waitOrCheckMaxCoin(wait_time_ms) {
// true和false对应打牌成功或失败
async function Playcards(strategy, teamName, pos) {
// 点击存储的位置
await keyMouseScript.runFile(`assets/ALT点击.json`);
keyDown("VK_LMENU");
await sleep(500);
pos.click();
await sleep(500);
await keyMouseScript.runFile(`assets/ALT释放.json`);
keyUp("VK_LMENU");
await sleep(800); //略微俯视,避免名字出现在选项框附近,导致错误点击
moveMouseBy(0, 1030);
await sleep(1000);
@@ -672,6 +758,11 @@ async function Playcards(strategy, teamName, pos) {
//前往一号桌
async function gotoTable1() {
log.info(`前往1号桌`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable1.json`);
}
else{
keyDown("d");
await sleep(1500);
keyUp("d");
@@ -684,10 +775,16 @@ async function gotoTable1() {
keyUp("d");
keyUp("w");
await sleep(700);
}
}
//前往二号桌
async function gotoTable2() {
log.info(`前往2号桌`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable2.json`);
}
else{
keyDown("d");
await sleep(1500);
keyUp("d");
@@ -704,9 +801,15 @@ async function gotoTable2() {
keyUp("s");
await sleep(700);
}
}
//前往三号桌
async function gotoTable3() {
log.info(`前往3号桌`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable3.json`);
}
else{
keyDown("w");
await sleep(2000);
keyUp("w");
@@ -718,9 +821,15 @@ async function gotoTable3() {
keyUp("a");
await sleep(700);
}
}
//前往四号桌
async function gotoTable4() {
log.info(`前往4号桌`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable4.json`);
}
else{
keyDown("w");
await sleep(2000);
keyUp("w");
@@ -738,9 +847,15 @@ async function gotoTable4() {
keyUp("w");
await sleep(700);
}
}
//前往一号包间
async function gotoTable5() {
log.info(`前往1号包间`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable5.json`);
}
else{
keyDown("w");
await sleep(2500);
keyUp("w");
@@ -757,9 +872,15 @@ async function gotoTable5() {
keyUp("w");
await sleep(700);
}
}
//前往二号包间
async function gotoTable6() {
log.info(`前往2号包间`);
if(settings.teamName){
keyPress("4");
await keyMouseScript.runFile(`assets/gotoTable6.json`);
}
else{
await sleep(1500);
keyDown("d");
await sleep(1500);
@@ -784,6 +905,8 @@ async function gotoTable6() {
keyUp("s");
await sleep(500);
}
}
async function main() {
//主流程
@@ -850,6 +973,9 @@ async function main() {
return;
}
if ((await isTaskRefreshed("assets/weekly.txt"), refresh)) {
await genshin.returnMainUi();
if(settings.teamName)await genshin.switchParty(settings.teamName);
await main();
}
})();

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "打牌一条龙",
"version": "2.7",
"version": "2.8",
"description": "完成每周的七圣召唤七日历练来客挑战。详见README.md",
"tags": [
"七圣召唤"
@@ -23,4 +23,4 @@
"牌组策略/*.txt",
"牌组策略/各策略胜败记录.json"
]
}
}

View File

@@ -20,6 +20,11 @@
"type": "input-text",
"label": "仅使用胜率记录大于该值的备用策略 (0到1之间的小数)",
"default": "0.25"
},
{
"name": "teamName",
"type": "input-text",
"label": "如无法到达牌桌,请输入指定队伍(强制芭芭拉4号位且队伍无加速)"
},
{
"name": "passWord",
@@ -27,3 +32,4 @@
"label": "请阅读脚本说明或README.md文件获取启动密码后填写到此处"
}
]