diff --git a/repo/js/AutoCommission/assets/邪恶的扩张/明冠峡-1.json b/repo/js/AutoCommission/assets/邪恶的扩张/明冠山地-1.json similarity index 92% rename from repo/js/AutoCommission/assets/邪恶的扩张/明冠峡-1.json rename to repo/js/AutoCommission/assets/邪恶的扩张/明冠山地-1.json index 46e27b47d..7b6aca0f0 100644 --- a/repo/js/AutoCommission/assets/邪恶的扩张/明冠峡-1.json +++ b/repo/js/AutoCommission/assets/邪恶的扩张/明冠山地-1.json @@ -4,7 +4,7 @@ "type": "collect", "author": "星野", "version": "1.0", - "description": "", + "description": "老版本这个任务点位所在地区命名为明冠峡,新版本被重命名为明冠山地", "map_name": "Teyvat", "bgi_version": "0.45.0", "tags": [], @@ -75,4 +75,4 @@ "type": "path" } ] -} \ No newline at end of file +} diff --git a/repo/js/AutoCommission/lib/commission-recognition.js b/repo/js/AutoCommission/lib/commission-recognition.js index c11bde6ea..193350330 100644 --- a/repo/js/AutoCommission/lib/commission-recognition.js +++ b/repo/js/AutoCommission/lib/commission-recognition.js @@ -442,26 +442,9 @@ var CommissionRecognition = { await sleep(300); keyUp("VK_ESCAPE"); await sleep(1200); - let scale = 2.0 - let bigMapPosition - while (scale <= 5.0) { - try { - await genshin.setBigMapZoomLevel(scale); - bigMapPosition = genshin.getPositionFromBigMap(); - break; - } catch { - scale += 0.1; - } - await sleep(100); - } - if (bigMapPosition) { - commission.CommissionPosition = bigMapPosition; - log.info( - "当前委托位置: ({x}, {y})", - bigMapPosition.x, - bigMapPosition.y - ); - } + // 使用投票机制获取位置 + let bigMapPosition = await Utils.getPositionWithVoting(genshin); + commission.CommissionPosition = bigMapPosition; keyDown("VK_ESCAPE"); await sleep(300); @@ -636,26 +619,9 @@ var CommissionRecognition = { await sleep(300); keyUp("VK_ESCAPE"); await sleep(1200); - let scale = 2.0 - let bigMapPosition - while (scale <= 5.0) { - try { - await genshin.setBigMapZoomLevel(scale); - bigMapPosition = genshin.getPositionFromBigMap(); - break; - } catch { - scale += 0.1; - } - await sleep(100); - } - if (bigMapPosition) { - fourthCommission.CommissionPosition = bigMapPosition; - log.info( - "当前委托位置: ({x}, {y})", - bigMapPosition.x, - bigMapPosition.y - ); - } + // 使用投票机制获取位置 + let bigMapPosition = await Utils.getPositionWithVoting(genshin); + fourthCommission.CommissionPosition = bigMapPosition; keyDown("VK_ESCAPE"); await sleep(300); diff --git a/repo/js/AutoCommission/lib/execute.js b/repo/js/AutoCommission/lib/execute.js index 9e0f5063f..d01accd2a 100644 --- a/repo/js/AutoCommission/lib/execute.js +++ b/repo/js/AutoCommission/lib/execute.js @@ -127,26 +127,9 @@ var Execute = { await sleep(300); keyUp("VK_ESCAPE"); await sleep(1200); - let scale = 2.0 - let bigMapPosition - while (scale <= 5.0) { - try { - await genshin.setBigMapZoomLevel(scale); - bigMapPosition = genshin.getPositionFromBigMap(); - break; - } catch { - scale += 0.1; - } - await sleep(100); - } - if (bigMapPosition) { - currentCommissionPosition = bigMapPosition; - log.info( - "当前委托位置: ({x}, {y})", - bigMapPosition.x, - bigMapPosition.y - ); - } + // 使用投票机制获取位置 + let bigMapPosition = await Utils.getPositionWithVoting(genshin); + currentCommissionPosition = bigMapPosition; await genshin.returnMainUi(); } else { diff --git a/repo/js/AutoCommission/lib/step-processor-loader.js b/repo/js/AutoCommission/lib/step-processor-loader.js index 203ce35a0..4d5718929 100644 --- a/repo/js/AutoCommission/lib/step-processor-loader.js +++ b/repo/js/AutoCommission/lib/step-processor-loader.js @@ -43,15 +43,11 @@ var StepProcessorLoader = { for (var i = 0; i < stepFiles.length; i++) { var fileName = stepFiles[i]; try { - log.info("正在加载步骤处理器: {file}", fileName); eval(file.readTextSync("lib/steps/" + fileName)); - log.debug("步骤处理器 {file} 加载成功", fileName); } catch (error) { log.error("加载步骤处理器 {file} 失败: {error}", fileName, error.message); } } - - log.info("步骤处理器动态加载完成,共注册 {count} 个处理器", Object.keys(this.processors).length); } catch (error) { log.error("动态扫描步骤处理器目录失败: {error}", error.message); log.warn("将使用备用的固定文件列表加载方式"); diff --git a/repo/js/AutoCommission/lib/utils.js b/repo/js/AutoCommission/lib/utils.js index 67a87da8d..6aa834f93 100644 --- a/repo/js/AutoCommission/lib/utils.js +++ b/repo/js/AutoCommission/lib/utils.js @@ -374,4 +374,66 @@ var Utils = { return false; } }, + + // 位置识别投票函数 + getPositionWithVoting: async function (genshin) { + /** + * 使用投票机制获取最可靠的地图位置 + * @param {Object} genshin - genshin对象 + * @returns {Object} - 最可靠的位置对象 + * @throws {Error} - 当无法识别位置时抛出错误 + */ + let scale = 2.0; + const positions = []; + let recognitionCount = 0; + + // 至少识别6次 + while (scale <= 5.0 && recognitionCount < 6) { + try { + await genshin.setBigMapZoomLevel(scale); + await sleep(100); + const position = genshin.getPositionFromBigMap(); + positions.push(position); + recognitionCount++; + } catch (error) { + log.debug('缩放:{0}, error:{1}', scale, error.message); + } + scale += 0.3; + } + + // 聚类并选择最可靠的位置 + if (positions.length > 0) { + // 简单的聚类算法 + const clusters = []; + for (const pos of positions) { + let added = false; + for (const cluster of clusters) { + const distance = Math.sqrt( + Math.pow(cluster[0].x - pos.x, 2) + Math.pow(cluster[0].y - pos.y, 2) + ); + if (distance < 5) { + cluster.push(pos); + added = true; + break; + } + } + if (!added) { + clusters.push([pos]); + } + } + + // 选择最大的聚类 + clusters.sort((a, b) => b.length - a.length); + if (clusters.length > 0) { + // 取聚类中的第一个位置作为最终位置 + const bestPosition = clusters[0][0]; + log.info(`位置识别成功: (${bestPosition.x}, ${bestPosition.y})`); + // 打印所有识别的坐标(debug日志) + log.debug(`所有识别坐标: ${positions.map(p => `(${p.x}, ${p.y})`).join(', ')}`); + return bestPosition; + } + } + + throw new Error('无法从大地图中识别位置'); + }, }; diff --git a/repo/js/AutoCommission/manifest.json b/repo/js/AutoCommission/manifest.json index 06d584be4..d26985e12 100644 --- a/repo/js/AutoCommission/manifest.json +++ b/repo/js/AutoCommission/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "(对话+成就)全自动蒙德地区每日委托", - "version": "0.98.17", + "version": "0.98.18", "tags": [ "委托", "对话",