diff --git a/repo/js/AutoHoeingOneDragon/README.md b/repo/js/AutoHoeingOneDragon/README.md index 8c93986a9..77698fa9d 100644 --- a/repo/js/AutoHoeingOneDragon/README.md +++ b/repo/js/AutoHoeingOneDragon/README.md @@ -94,6 +94,9 @@ --- ### 更新日志 +### 1.6.0(2025.09.14) +1.增加路线:挪德卡莱希汐岛区域 +2.增加选项,可拾取新材料 ### 1.5.1(2025.08.28) 1.优化检测坐标判断路线运行成功的机制 ### 1.5.0(2025.08.27) diff --git a/repo/js/AutoHoeingOneDragon/assets/monsterInfo.json b/repo/js/AutoHoeingOneDragon/assets/monsterInfo.json index 5f4eae592..502be7842 100644 --- a/repo/js/AutoHoeingOneDragon/assets/monsterInfo.json +++ b/repo/js/AutoHoeingOneDragon/assets/monsterInfo.json @@ -267,6 +267,30 @@ "type": "首领", "tags": [] }, + { + "name": "灼烜·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "辉电·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蔓结·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "凌晶·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, { "name": "丘丘人", "moraRate": 1, @@ -603,6 +627,22 @@ "type": "首领", "tags": [] }, + { + "name": "荒野幽徒", + "moraRate": 1, + "type": "精英", + "tags": [ + "狂猎" + ] + }, + { + "name": "荒野狂狩士", + "moraRate": 2, + "type": "精英", + "tags": [ + "狂猎" + ] + }, { "name": "愚人众先遣队·火统游击兵", "moraRate": 1, @@ -675,6 +715,108 @@ "type": "精英", "tags": [] }, + { + "name": "愚人众特辖队·线列军", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·支援兵", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·榴铳手", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·先锋士", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·疗愈师", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·掷弹兵", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·火刃突击队", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·冰雹重炮手", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·雷霰近卫军", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·近战攻坚型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·近战斥候型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦攻坚型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦斥候型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦地效型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端全能攻坚型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端全能斥候型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端火力地效型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, { "name": "遗迹守卫", "moraRate": 1, @@ -879,6 +1021,12 @@ "type": "首领", "tags": [] }, + { + "name": "重拳出击鸭", + "moraRate": 1, + "type": "首领", + "tags": [] + }, { "name": "盗宝团·斥候", "moraRate": 1, @@ -1759,6 +1907,30 @@ "type": "精英", "tags": [] }, + { + "name": "蕴光奇羊", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光刃犀", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光璇蛸", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光月幻蝶", + "moraRate": 1, + "type": "首领", + "tags": [] + }, { "name": "裂空的魔龙", "moraRate": 1, diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/加固机轴.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/加固机轴.png new file mode 100644 index 000000000..79b83304f Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/加固机轴.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/失光块骨.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/失光块骨.png new file mode 100644 index 000000000..4b67aa471 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/失光块骨.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾兜盔.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾兜盔.png new file mode 100644 index 000000000..a6bc04511 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾兜盔.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾化形.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾化形.png new file mode 100644 index 000000000..813040ec9 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾化形.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾片甲.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾片甲.png new file mode 100644 index 000000000..8d6143d95 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/幽雾片甲.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/毁损机轴.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/毁损机轴.png new file mode 100644 index 000000000..3fa24164f Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/毁损机轴.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/磨损的执凭.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/磨损的执凭.png new file mode 100644 index 000000000..0cf0eff1f Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/磨损的执凭.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/稀光遗骼.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/稀光遗骼.png new file mode 100644 index 000000000..5e04dc85d Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/稀光遗骼.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/精制机轴.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/精制机轴.png new file mode 100644 index 000000000..bc9b211f3 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/精制机轴.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/精致的执凭.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/精致的执凭.png new file mode 100644 index 000000000..74daffe65 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/精致的执凭.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/繁光躯外骸.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/繁光躯外骸.png new file mode 100644 index 000000000..6b76b0cf3 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/繁光躯外骸.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的柔辉.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的柔辉.png new file mode 100644 index 000000000..ae6c978af Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的柔辉.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的残照.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的残照.png new file mode 100644 index 000000000..2d1378a1d Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的残照.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的煌荣.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的煌荣.png new file mode 100644 index 000000000..5daebee4b Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜夜的煌荣.png differ diff --git a/repo/js/AutoHoeingOneDragon/assets/newTargets/霜携的执凭.png b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜携的执凭.png new file mode 100644 index 000000000..addcd4908 Binary files /dev/null and b/repo/js/AutoHoeingOneDragon/assets/newTargets/霜携的执凭.png differ diff --git a/repo/js/AutoHoeingOneDragon/main.js b/repo/js/AutoHoeingOneDragon/main.js index d5083800a..514702ab4 100644 --- a/repo/js/AutoHoeingOneDragon/main.js +++ b/repo/js/AutoHoeingOneDragon/main.js @@ -1,4 +1,4 @@ -//当前js版本 1.5.1 +//当前js版本 1.6.0 //拾取时上下滑动的时间 let timeMoveUp; @@ -63,11 +63,19 @@ let warnMessage = []; const blacklistKeywords = ocrPickupJson["黑名单"]; targetItems = await readFolder(targetItemPath, false); + + if (settings.enableNewTargets) { + const newItems = await readFolder('assets/newTargets', false); + // 逐个 push + for (const f of newItems) targetItems.push(f); + } + //模板匹配对象处理 if (pickupMode === "模板匹配拾取,默认只拾取狗粮") { for (const targetItem of targetItems) { targetItem.template = file.ReadImageMatSync(targetItem.fullPath); targetItem.itemName = targetItem.fileName.replace(/\.png$/, ''); + //log.info(targetItem.itemName); } } timeMoveUp = Math.round(timeMove * 0.45); @@ -624,7 +632,7 @@ async function runPath(pathFilePath, map_name, whitelistKeywords, blacklistKeywo let itemName = null; // 在捕获的区域内进行模板匹配识别 for (const targetItem of targetItems) { - let recognitionObject = RecognitionObject.TemplateMatch(targetItem.template, 1220, centerYF - 35, 70, 70); + let recognitionObject = RecognitionObject.TemplateMatch(targetItem.template, 1200, centerYF - 35, 160, 70); result = gameRegion.find(recognitionObject); if (result.isExist()) { itemName = targetItem.itemName; diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index 3aad5b415..351c5a66a 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "1.5.1", + "version": "1.6.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ { diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7101挪德卡莱希汐岛西南.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7101挪德卡莱希汐岛西南.json new file mode 100644 index 000000000..83b4b08d2 --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7101挪德卡莱希汐岛西南.json @@ -0,0 +1,159 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时206.68秒,包含以下怪物:5只雷史莱姆、2只变异雷史莱姆、3只打手丘丘人、1只木盾丘丘暴徒、2只蕴光奇羊。", + "enable_monster_loot_split": false, + "last_modified_time": 1757858338851, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7101挪德卡莱希汐岛西南", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10973.5283203125, + "y": 1682.45703125 + }, + { + "action": "fight", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "path", + "x": 10992.5, + "y": 1706.75 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "dash", + "type": "path", + "x": 10987.556640625, + "y": 1743.72900390625 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "path", + "x": 11011.0546875, + "y": 1752.83837890625 + }, + { + "action": "fight", + "action_params": "", + "id": 5, + "move_mode": "dash", + "type": "path", + "x": 11069.8671875, + "y": 1775.5615234375 + }, + { + "action": "", + "action_params": "", + "id": 6, + "move_mode": "dash", + "type": "path", + "x": 11069.8671875, + "y": 1775.5615234375 + }, + { + "action": "fight", + "action_params": "", + "id": 7, + "move_mode": "jump", + "type": "path", + "x": 11076.4931640625, + "y": 1714.462890625 + }, + { + "action": "", + "action_params": "", + "id": 8, + "move_mode": "dash", + "type": "path", + "x": 11104.9423828125, + "y": 1717.1787109375 + }, + { + "action": "fight", + "action_params": "", + "id": 9, + "move_mode": "dash", + "type": "path", + "x": 11184.3173828125, + "y": 1687.4521484375 + }, + { + "action": "", + "action_params": "", + "id": 10, + "move_mode": "walk", + "type": "teleport", + "x": 11060.90234375, + "y": 1592.326171875 + }, + { + "action": "", + "action_params": "", + "id": 11, + "move_mode": "dash", + "type": "path", + "x": 11050.9375, + "y": 1577.4697265625 + }, + { + "action": "", + "action_params": "", + "id": 12, + "move_mode": "fly", + "type": "path", + "x": 11030.7431640625, + "y": 1556.23486328125 + }, + { + "action": "stop_flying", + "action_params": "", + "id": 13, + "move_mode": "fly", + "type": "path", + "x": 11046.912109375, + "y": 1542.6259765625 + }, + { + "action": "fight", + "action_params": "", + "id": 14, + "move_mode": "dash", + "type": "path", + "x": 11075.181640625, + "y": 1533.96875 + }, + { + "action": "fight", + "action_params": "", + "id": 15, + "move_mode": "dash", + "type": "path", + "x": 11075.181640625, + "y": 1533.96875 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7102挪德卡莱希汐岛北1.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7102挪德卡莱希汐岛北1.json new file mode 100644 index 000000000..f0269335b --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7102挪德卡莱希汐岛北1.json @@ -0,0 +1,108 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时155.36秒,包含以下怪物:1只愚人众特辖队·先锋士、1只愚人众特辖队·掷弹兵、1只愚人众特辖队·雷霰近卫军、1只凌晶·霜夜灵嗣。", + "enable_monster_loot_split": false, + "last_modified_time": 1757850486965, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7102挪德卡莱希汐岛北1", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10789.009765625, + "y": 2277.678466796875 + }, + { + "action": "fight", + "action_params": "", + "id": 2, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10758.0146484375, + "y": 2311.341552734375 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "dash", + "type": "path", + "x": 10758.0146484375, + "y": 2311.341552734375 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "path", + "x": 10737.3251953125, + "y": 2375.56640625 + }, + { + "action": "fight", + "action_params": "", + "id": 5, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10735.4462890625, + "y": 2408.2099609375 + }, + { + "action": "", + "action_params": "", + "id": 6, + "move_mode": "dash", + "type": "path", + "x": 10735.4462890625, + "y": 2408.2099609375 + }, + { + "action": "", + "action_params": "", + "id": 7, + "move_mode": "dash", + "type": "path", + "x": 10707.880859375, + "y": 2478.90966796875 + }, + { + "action": "fight", + "action_params": "", + "id": 8, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10690.67578125, + "y": 2477.87353515625 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 9, + "move_mode": "dash", + "type": "path", + "x": 10690.67578125, + "y": 2477.87353515625 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7103挪德卡莱希汐岛北2.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7103挪德卡莱希汐岛北2.json new file mode 100644 index 000000000..67de6cfd9 --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7103挪德卡莱希汐岛北2.json @@ -0,0 +1,79 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时99.36秒,包含以下怪物:3只丘丘风行游侠。", + "enable_monster_loot_split": false, + "last_modified_time": 1757850938960, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7103挪德卡莱希汐岛北2", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10789.009765625, + "y": 2277.678466796875 + }, + { + "action": "", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "path", + "x": 10751.10546875, + "y": 2277.8349609375 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "dash", + "type": "path", + "x": 10754.814453125, + "y": 2233.7265625 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "jump", + "type": "path", + "x": 10754.66796875, + "y": 2223.5322265625 + }, + { + "action": "fight", + "action_params": "", + "id": 5, + "locked": false, + "move_mode": "walk", + "type": "path", + "x": 10763.3896484375, + "y": 2206.59228515625 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 6, + "move_mode": "walk", + "type": "path", + "x": 10763.3896484375, + "y": 2206.59228515625 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7104挪德卡莱希汐岛中1.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7104挪德卡莱希汐岛中1.json new file mode 100644 index 000000000..8e1e4505c --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7104挪德卡莱希汐岛中1.json @@ -0,0 +1,108 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时175.66秒,包含以下怪物:2只水史莱姆、2只冰史莱姆、2只嗜雷·兽境幼兽、2只荒野幽徒、2只蕴光璇蛸。", + "enable_monster_loot_split": false, + "last_modified_time": 1757851234855, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7104挪德卡莱希汐岛中1", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10828.3359375, + "y": 1936.04931640625 + }, + { + "action": "fight", + "action_params": "", + "id": 2, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10936.826171875, + "y": 1913.34521484375 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "dash", + "type": "path", + "x": 10936.826171875, + "y": 1913.34521484375 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "path", + "x": 10897.375, + "y": 1967.490234375 + }, + { + "action": "fight", + "action_params": "", + "id": 5, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10893.82421875, + "y": 2008.7529296875 + }, + { + "action": "", + "action_params": "", + "id": 6, + "move_mode": "dash", + "type": "path", + "x": 10893.82421875, + "y": 2008.7529296875 + }, + { + "action": "", + "action_params": "", + "id": 7, + "move_mode": "dash", + "type": "path", + "x": 10893.1669921875, + "y": 2064.507568359375 + }, + { + "action": "fight", + "action_params": "", + "id": 8, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10907.8076171875, + "y": 2067.474365234375 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 9, + "move_mode": "dash", + "type": "orientation", + "x": 10907.8076171875, + "y": 2067.474365234375 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7105挪德卡莱希汐岛中2.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7105挪德卡莱希汐岛中2.json new file mode 100644 index 000000000..ec873d88f --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7105挪德卡莱希汐岛中2.json @@ -0,0 +1,180 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时181.77秒,包含以下怪物:2只水史莱姆、1只大型水史莱姆、2只凌晶·霜夜灵嗣。", + "enable_monster_loot_split": false, + "last_modified_time": 1757851601648, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7105挪德卡莱希汐岛中2", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10754.3466796875, + "y": 2061.1728515625 + }, + { + "action": "", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "path", + "x": 10765.8232421875, + "y": 2056.236328125 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "dash", + "type": "path", + "x": 10775.8896484375, + "y": 2052.828125 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "path", + "x": 10783.970703125, + "y": 2044.412109375 + }, + { + "action": "fight", + "action_params": "", + "id": 5, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10750.9970703125, + "y": 2001.2412109375 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 6, + "move_mode": "dash", + "type": "orientation", + "x": 10750.9970703125, + "y": 2001.2412109375 + }, + { + "action": "", + "action_params": "", + "id": 7, + "move_mode": "walk", + "type": "teleport", + "x": 10754.3466796875, + "y": 2061.171630859375 + }, + { + "action": "", + "action_params": "", + "id": 8, + "move_mode": "dash", + "type": "path", + "x": 10734.02734375, + "y": 2049.311767578125 + }, + { + "action": "stop_flying", + "action_params": "1500", + "id": 9, + "move_mode": "fly", + "type": "path", + "x": 10729.2509765625, + "y": 2046.77685546875 + }, + { + "action": "", + "action_params": "", + "id": 10, + "move_mode": "dash", + "type": "path", + "x": 10735.62109375, + "y": 2060.714111328125 + }, + { + "action": "fight", + "action_params": "", + "id": 11, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10752.8232421875, + "y": 2067.874267578125 + }, + { + "action": "", + "action_params": "", + "id": 12, + "move_mode": "dash", + "type": "path", + "x": 10752.8232421875, + "y": 2067.874267578125 + }, + { + "action": "", + "action_params": "", + "id": 13, + "move_mode": "dash", + "type": "path", + "x": 10768.83984375, + "y": 2075.16357421875 + }, + { + "action": "", + "action_params": "", + "id": 14, + "move_mode": "jump", + "type": "path", + "x": 10770.7138671875, + "y": 2092.34375 + }, + { + "action": "stop_flying", + "action_params": "", + "id": 15, + "move_mode": "fly", + "type": "path", + "x": 10773.4033203125, + "y": 2099.35302734375 + }, + { + "action": "fight", + "action_params": "", + "id": 16, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10780.1591796875, + "y": 2104.132080078125 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 17, + "move_mode": "dash", + "type": "orientation", + "x": 10780.1591796875, + "y": 2104.132080078125 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7106挪德卡莱希汐岛东南1.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7106挪德卡莱希汐岛东南1.json new file mode 100644 index 000000000..10197eabd --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7106挪德卡莱希汐岛东南1.json @@ -0,0 +1,117 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时145.72秒,包含以下怪物:2只水史莱姆、1只大型水史莱姆、1只凌晶·霜夜灵嗣、1只愚人众特辖队·先锋士、1只愚人众特辖队·火刃突击队。", + "enable_monster_loot_split": false, + "last_modified_time": 1757854181778, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7106挪德卡莱希汐岛东南1", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10416.7421875, + "y": 1657.3515625 + }, + { + "action": "stop_flying", + "action_params": "200", + "id": 2, + "move_mode": "fly", + "type": "path", + "x": 10430.326171875, + "y": 1653.125 + }, + { + "action": "fight", + "action_params": "", + "id": 3, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10441.9521484375, + "y": 1653.94140625 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "dash", + "type": "path", + "x": 10441.9521484375, + "y": 1653.94140625 + }, + { + "action": "", + "action_params": "", + "id": 5, + "move_mode": "dash", + "type": "path", + "x": 10450.5322265625, + "y": 1667.5068359375 + }, + { + "action": "fight", + "action_params": "", + "id": 6, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10480.04296875, + "y": 1678.396484375 + }, + { + "action": "", + "action_params": "", + "id": 7, + "move_mode": "dash", + "type": "path", + "x": 10480.04296875, + "y": 1678.396484375 + }, + { + "action": "", + "action_params": "", + "id": 8, + "move_mode": "dash", + "type": "path", + "x": 10562.0859375, + "y": 1676.6083984375 + }, + { + "action": "fight", + "action_params": "", + "id": 9, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10584.279296875, + "y": 1729.9638671875 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 10, + "move_mode": "dash", + "type": "orientation", + "x": 10584.279296875, + "y": 1729.9638671875 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7107挪德卡莱希汐岛东南2.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7107挪德卡莱希汐岛东南2.json new file mode 100644 index 000000000..774d360b0 --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7107挪德卡莱希汐岛东南2.json @@ -0,0 +1,70 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时91.9秒,包含以下怪物:2只冰箭丘丘人、1只木盾丘丘暴徒、1只蕴光刃犀。", + "enable_monster_loot_split": false, + "last_modified_time": 1757854305966, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7107挪德卡莱希汐岛东南2", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10553.2548828125, + "y": 1793.7978515625 + }, + { + "action": "fight", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "path", + "x": 10581.2626953125, + "y": 1815.0263671875 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "walk", + "type": "teleport", + "x": 10553.2548828125, + "y": 1793.7978515625 + }, + { + "action": "fight", + "action_params": "", + "id": 4, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10493.4130859375, + "y": 1802.5556640625 + }, + { + "action": "combat_script", + "action_params": "wait(1)", + "id": 5, + "move_mode": "dash", + "type": "orientation", + "x": 10493.4130859375, + "y": 1802.5556640625 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7108挪德卡莱希汐岛东南3.json b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7108挪德卡莱希汐岛东南3.json new file mode 100644 index 000000000..927cca658 --- /dev/null +++ b/repo/js/AutoHoeingOneDragon/pathing/2-小怪2000/0_7_挪德卡莱/7108挪德卡莱希汐岛东南3.json @@ -0,0 +1,79 @@ +{ + "info": { + "authors": [ + { + "links": "", + "name": "mno" + } + ], + "bgi_version": "0.45.0", + "description": " 路线信息:该路线预计用时76.94秒,包含以下怪物:2只水史莱姆、1只蕴光璇蛸。", + "enable_monster_loot_split": false, + "last_modified_time": 1757854419993, + "map_match_method": "", + "map_name": "Teyvat", + "name": "7108挪德卡莱希汐岛东南3", + "tags": [ + "挪德卡莱" + ], + "type": "collect", + "version": "1.0" + }, + "positions": [ + { + "action": "", + "action_params": "", + "id": 1, + "move_mode": "walk", + "type": "teleport", + "x": 10524.8857421875, + "y": 1931.7197265625 + }, + { + "action": "", + "action_params": "", + "id": 2, + "move_mode": "dash", + "type": "path", + "x": 10571.5283203125, + "y": 1939.64404296875 + }, + { + "action": "", + "action_params": "", + "id": 3, + "move_mode": "walk", + "type": "path", + "x": 10600.79296875, + "y": 1952.7431640625 + }, + { + "action": "", + "action_params": "", + "id": 4, + "move_mode": "fly", + "type": "path", + "x": 10643.279296875, + "y": 1946.044921875 + }, + { + "action": "stop_flying", + "action_params": "", + "id": 5, + "move_mode": "fly", + "type": "path", + "x": 10641.3837890625, + "y": 1915.642578125 + }, + { + "action": "fight", + "action_params": "", + "id": 6, + "locked": false, + "move_mode": "dash", + "type": "path", + "x": 10642.470703125, + "y": 1907.181640625 + } + ] +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/settings.json b/repo/js/AutoHoeingOneDragon/settings.json index 3eb18978b..90005b013 100644 --- a/repo/js/AutoHoeingOneDragon/settings.json +++ b/repo/js/AutoHoeingOneDragon/settings.json @@ -46,10 +46,15 @@ "default": "模板匹配拾取,默认只拾取狗粮" }, { - "name": "rollingDelay", - "type": "input-text", - "label": "滚轮滚动后延时(毫秒),观察到漏捡时建议调大", - "default": "25" + "name": "disableSelfOptimization", + "type": "checkbox", + "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息" + }, + { + "name": "enableNewTargets", + "type": "checkbox", + "label": "勾选后使用模板匹配拾取模式时将会拾取新材料\n默认为挪德卡莱地区所有怪物材料\n可在assets/newTargets文件中查看并调整", + "default": "true" }, { "name": "pickupDelay", diff --git a/repo/js/HoeingPathingTest/assets/info.json b/repo/js/HoeingPathingTest/assets/info.json index 9fa944c77..69afd14dd 100644 --- a/repo/js/HoeingPathingTest/assets/info.json +++ b/repo/js/HoeingPathingTest/assets/info.json @@ -217,6 +217,30 @@ "type": "首领", "tags": [] }, + { + "name": "灼烜·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "辉电·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蔓结·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "凌晶·霜夜灵嗣", + "moraRate": 1, + "type": "精英", + "tags": [] + }, { "name": "丘丘人", "moraRate": 1, @@ -543,7 +567,9 @@ "name": "深邃拟覆叶", "moraRate": 3, "type": "精英", - "tags": ["次数盾"] + "tags": [ + "次数盾" + ] }, { "name": "深邃摹结株", @@ -551,6 +577,22 @@ "type": "首领", "tags": [] }, + { + "name": "荒野幽徒", + "moraRate": 1, + "type": "精英", + "tags": [ + "狂猎" + ] + }, + { + "name": "荒野狂狩士", + "moraRate": 2, + "type": "精英", + "tags": [ + "狂猎" + ] + }, { "name": "愚人众先遣队·火统游击兵", "moraRate": 1, @@ -623,6 +665,108 @@ "type": "精英", "tags": [] }, + { + "name": "愚人众特辖队·线列军", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·支援兵", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·榴铳手", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·先锋士", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·疗愈师", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·掷弹兵", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·火刃突击队", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·冰雹重炮手", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "愚人众特辖队·雷霰近卫军", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·近战攻坚型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·近战斥候型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦攻坚型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦斥候型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·强侦地效型", + "moraRate": 1, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端全能攻坚型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端全能斥候型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, + { + "name": "巡陆艇·尖端火力地效型", + "moraRate": 2, + "type": "普通", + "tags": [] + }, { "name": "遗迹守卫", "moraRate": 1, @@ -827,6 +971,12 @@ "type": "首领", "tags": [] }, + { + "name": "重拳出击鸭", + "moraRate": 1, + "type": "首领", + "tags": [] + }, { "name": "盗宝团·斥候", "moraRate": 1, @@ -1707,6 +1857,30 @@ "type": "精英", "tags": [] }, + { + "name": "蕴光奇羊", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光刃犀", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光璇蛸", + "moraRate": 1, + "type": "精英", + "tags": [] + }, + { + "name": "蕴光月幻蝶", + "moraRate": 1, + "type": "首领", + "tags": [] + }, { "name": "裂空的魔龙", "moraRate": 1, diff --git a/repo/js/HoeingPathingTest/assets/monster/丘丘人.png b/repo/js/HoeingPathingTest/assets/monster/丘丘人.png index 395eedcd8..9c1f7672e 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/丘丘人.png and b/repo/js/HoeingPathingTest/assets/monster/丘丘人.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/冰盾丘丘人.png b/repo/js/HoeingPathingTest/assets/monster/冰盾丘丘人.png index 41a7fedf8..36d44af3a 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/冰盾丘丘人.png and b/repo/js/HoeingPathingTest/assets/monster/冰盾丘丘人.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/冲锋丘丘人.png b/repo/js/HoeingPathingTest/assets/monster/冲锋丘丘人.png index c4b3c404e..c09059f96 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/冲锋丘丘人.png and b/repo/js/HoeingPathingTest/assets/monster/冲锋丘丘人.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/凌晶·霜夜灵嗣.png b/repo/js/HoeingPathingTest/assets/monster/凌晶·霜夜灵嗣.png new file mode 100644 index 000000000..cc6da6cc9 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/凌晶·霜夜灵嗣.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/实验性场力发生装置.png b/repo/js/HoeingPathingTest/assets/monster/实验性场力发生装置.png index 62a2c45c7..cd0606c18 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/实验性场力发生装置.png and b/repo/js/HoeingPathingTest/assets/monster/实验性场力发生装置.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能攻坚型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能攻坚型.png new file mode 100644 index 000000000..281326478 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能攻坚型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能斥候型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能斥候型.png new file mode 100644 index 000000000..ff4c485d3 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端全能斥候型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端火力地效型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端火力地效型.png new file mode 100644 index 000000000..5bf58fbe7 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·尖端火力地效型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦地效型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦地效型.png new file mode 100644 index 000000000..0dd120727 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦地效型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦攻坚型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦攻坚型.png new file mode 100644 index 000000000..5e4e61922 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦攻坚型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦斥候型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦斥候型.png new file mode 100644 index 000000000..66233cd60 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·强侦斥候型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战攻坚型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战攻坚型.png new file mode 100644 index 000000000..4af3b31e1 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战攻坚型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战斥候型.png b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战斥候型.png new file mode 100644 index 000000000..c88dd152b Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/巡陆艇·近战斥候型.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·冰铳重卫士.png b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·冰铳重卫士.png index f423bf563..11fea7305 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·冰铳重卫士.png and b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·冰铳重卫士.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·水铳重卫士.png b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·水铳重卫士.png index 7ba49da48..5400c3e1c 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·水铳重卫士.png and b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·水铳重卫士.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·雷锤前锋军.png b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·雷锤前锋军.png index f1bc5c538..7c897b295 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·雷锤前锋军.png and b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·雷锤前锋军.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·风拳前锋军.png b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·风拳前锋军.png index c6b232536..06d49fd8e 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·风拳前锋军.png and b/repo/js/HoeingPathingTest/assets/monster/愚人众先遣队·风拳前锋军.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·先锋士.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·先锋士.png new file mode 100644 index 000000000..e4cacdfd8 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·先锋士.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·冰雹重炮手.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·冰雹重炮手.png new file mode 100644 index 000000000..861651e14 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·冰雹重炮手.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·掷弹兵.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·掷弹兵.png new file mode 100644 index 000000000..93897fceb Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·掷弹兵.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·支援兵.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·支援兵.png new file mode 100644 index 000000000..150fb326e Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·支援兵.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·榴铳手.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·榴铳手.png new file mode 100644 index 000000000..2f94c68c0 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·榴铳手.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·火刃突击队.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·火刃突击队.png new file mode 100644 index 000000000..15ac53d30 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·火刃突击队.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·疗愈师.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·疗愈师.png new file mode 100644 index 000000000..1f09b14a1 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·疗愈师.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·线列军.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·线列军.png new file mode 100644 index 000000000..60db5dbfd Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·线列军.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·雷霰近卫军.png b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·雷霰近卫军.png new file mode 100644 index 000000000..899a98f82 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/愚人众特辖队·雷霰近卫军.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/打手丘丘人.png b/repo/js/HoeingPathingTest/assets/monster/打手丘丘人.png index 83f77d54f..d8d78e11b 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/打手丘丘人.png and b/repo/js/HoeingPathingTest/assets/monster/打手丘丘人.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/木盾丘丘人.png b/repo/js/HoeingPathingTest/assets/monster/木盾丘丘人.png index ef2a2d79d..40c065734 100644 Binary files a/repo/js/HoeingPathingTest/assets/monster/木盾丘丘人.png and b/repo/js/HoeingPathingTest/assets/monster/木盾丘丘人.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/灼烜·霜夜灵嗣.png b/repo/js/HoeingPathingTest/assets/monster/灼烜·霜夜灵嗣.png new file mode 100644 index 000000000..48001942a Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/灼烜·霜夜灵嗣.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/荒野幽徒.png b/repo/js/HoeingPathingTest/assets/monster/荒野幽徒.png new file mode 100644 index 000000000..6ea593012 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/荒野幽徒.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/荒野狂狩士.png b/repo/js/HoeingPathingTest/assets/monster/荒野狂狩士.png new file mode 100644 index 000000000..9fcda3062 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/荒野狂狩士.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/蔓结·霜夜灵嗣.png b/repo/js/HoeingPathingTest/assets/monster/蔓结·霜夜灵嗣.png new file mode 100644 index 000000000..8ece042c3 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/蔓结·霜夜灵嗣.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/蕴光刃犀.png b/repo/js/HoeingPathingTest/assets/monster/蕴光刃犀.png new file mode 100644 index 000000000..0ad2a7c13 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/蕴光刃犀.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/蕴光奇羊.png b/repo/js/HoeingPathingTest/assets/monster/蕴光奇羊.png new file mode 100644 index 000000000..1d08b3d5d Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/蕴光奇羊.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/蕴光月幻蝶.png b/repo/js/HoeingPathingTest/assets/monster/蕴光月幻蝶.png new file mode 100644 index 000000000..25a90d507 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/蕴光月幻蝶.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/蕴光璇蛸.png b/repo/js/HoeingPathingTest/assets/monster/蕴光璇蛸.png new file mode 100644 index 000000000..42970e419 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/蕴光璇蛸.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/辉电·霜夜灵嗣.png b/repo/js/HoeingPathingTest/assets/monster/辉电·霜夜灵嗣.png new file mode 100644 index 000000000..3a91ebcb6 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/辉电·霜夜灵嗣.png differ diff --git a/repo/js/HoeingPathingTest/assets/monster/重拳出击鸭.png b/repo/js/HoeingPathingTest/assets/monster/重拳出击鸭.png new file mode 100644 index 000000000..1fb7a9fd0 Binary files /dev/null and b/repo/js/HoeingPathingTest/assets/monster/重拳出击鸭.png differ diff --git a/repo/js/HoeingPathingTest/main.js b/repo/js/HoeingPathingTest/main.js index 19a2dc581..77efedf39 100644 --- a/repo/js/HoeingPathingTest/main.js +++ b/repo/js/HoeingPathingTest/main.js @@ -1,461 +1,3 @@ - -// 定义替换映射表 -const replacementMap = { - "监": "盐", - "卵": "卯" -}; - -async function readFolder(folderPath, onlyJson) { - log.info(`开始读取文件夹:${folderPath}`); - - // 新增一个堆栈,初始时包含 folderPath - const folderStack = [folderPath]; - - // 新增一个数组,用于存储文件信息对象 - const files = []; - - // 当堆栈不为空时,继续处理 - while (folderStack.length > 0) { - // 从堆栈中弹出一个路径 - const currentPath = folderStack.pop(); - - // 读取当前路径下的所有文件和子文件夹路径 - const filesInSubFolder = file.ReadPathSync(currentPath); - - // 临时数组,用于存储子文件夹路径 - const subFolders = []; - for (const filePath of filesInSubFolder) { - if (file.IsFolder(filePath)) { - // 如果是文件夹,先存储到临时数组中 - subFolders.push(filePath); - } else { - // 如果是文件,根据 onlyJson 判断是否存储 - if (onlyJson) { - if (filePath.endsWith(".json")) { - const fileName = filePath.split('\\').pop(); // 提取文件名 - const folderPathArray = filePath.split('\\').slice(0, -1); // 提取文件夹路径数组 - files.push({ - fullPath: filePath, - fileName: fileName, - folderPathArray: folderPathArray - }); - //log.info(`找到 JSON 文件:${filePath}`); - } - } else { - const fileName = filePath.split('\\').pop(); // 提取文件名 - const folderPathArray = filePath.split('\\').slice(0, -1); // 提取文件夹路径数组 - files.push({ - fullPath: filePath, - fileName: fileName, - folderPathArray: folderPathArray - }); - //log.info(`找到文件:${filePath}`); - } - } - } - // 将临时数组中的子文件夹路径按原顺序压入堆栈 - folderStack.push(...subFolders.reverse()); // 反转子文件夹路径 - } - - return files; -} - - -async function getMonsterCounts() { - // 初始化结果对象 - const monsterCounts = {}; - - async function scrollPage(totalDistance, stepDistance = 10, delayMs = 5) { - moveMouseTo(400, 750); // 移动到屏幕水平中心,垂直750坐标 - await sleep(50); - leftButtonDown(); - - // 计算滚动方向和总步数 - const isDownward = totalDistance < 0; // 如果totalDistance为负数,则向下滑动 - const steps = Math.ceil(Math.abs(totalDistance) / stepDistance); // 使用绝对值计算步数 - - for (let j = 0; j < steps; j++) { - const remainingDistance = Math.abs(totalDistance) - j * stepDistance; - const moveDistance = remainingDistance < stepDistance ? remainingDistance : stepDistance; - - // 根据滚动方向调整移动方向 - const direction = isDownward ? 1 : -1; // 向下滑动为正方向,向上滑动为负方向 - moveMouseBy(0, 1.2 * direction * moveDistance); // 根据方向调整滚动方向 - await sleep(delayMs); - } - - await sleep(200); - leftButtonUp(); - await sleep(100); - } - - await genshin.returnMainUi(); // 返回主界面 - keyPress("VK_ESCAPE"); // 打开派蒙菜单 - await sleep(1500); // 等待1.5秒 - - // 1. 识别并点击【图鉴】 - const archiveTemplate = RecognitionObject.TemplateMatch( - file.readImageMatSync("assets/RecognitionObject/图鉴.png"), - 0, 0, 1920, 1080 - ); - const archiveRegion = captureGameRegion().find(archiveTemplate); - if (!archiveRegion.isEmpty()) { - archiveRegion.click(); - } - await sleep(3000); // 等待3秒 - - // 2. 识别并点击【生物志】 - const faunaTemplate = RecognitionObject.TemplateMatch( - file.readImageMatSync("assets/RecognitionObject/生物志.png"), - 0, 0, 1920, 1080 - ); - const faunaRegion = captureGameRegion().find(faunaTemplate); - if (!faunaRegion.isEmpty()) { - faunaRegion.click(); - } - await sleep(400); - click(1355, 532); - await sleep(2000); // 等待2秒 - - // 3. 循环处理怪物识别 - // 读取 name.txt 文件中的怪物名称列表 - const monsterList = file.readTextSync("assets/name.txt").split('\n').filter(name => name.trim() !== ''); - let monsterNum = 1; - - let previousMonsterCount = -1; - - let failCount = 0; - - for (let i = 0; i < monsterList.length; i++) { - const monsterId = monsterList[i]; - let monsterRegion = null; - - let pageTurnsUp = 0; - while (pageTurnsUp < 5) { - let pageTurns = 0; - while (pageTurns < 5) { - let tryTimes = 0; - while (tryTimes < 5) { - // 4a. 识别怪物图片 - const monsterTemplate = RecognitionObject.TemplateMatch( - file.readImageMatSync(`assets/monster/${monsterId.trim()}.png`), - 0, 0, 1920, 1080 - ); - monsterRegion = captureGameRegion().find(monsterTemplate); - if (!monsterRegion.isEmpty()) { - break; // 识别到怪物,跳出翻页循环 - } - //未识别到时重试 - tryTimes++; - } - if (!monsterRegion.isEmpty()) { - break; // 识别到怪物,跳出翻页循环 - } - // 未识别到则向下翻页 - await scrollPage(300); // 调用翻页函数 - pageTurns++; - } - if (!monsterRegion.isEmpty()) { - break; // 识别到怪物,跳出翻页循环 - } - // 未识别到则向上翻页 - await scrollPage(-1800); // 调用翻页函数 - pageTurnsUp++; - } - - if (!monsterRegion || monsterRegion.isEmpty()) { - log.info(`怪物: ${monsterId.trim()}, 没有找到`); - monsterCounts[monsterId.trim()] = -1; - continue; // 达到翻页上限仍未找到,处理下一个怪物 - } - - monsterRegion.click(); // 点击怪物图标 - await sleep(10); // 等待界面加载 - - // 4b. 识别数量区域(870,1000,100,30) - const countRegion = new ImageRegion( - captureGameRegion().SrcMat, - 830, 980, - null, // owner 参数设置为 null - null, // converter 参数设置为 null - null // drawContent 参数设置为 null - ); - // 创建OCR识别对象 - const ocrObject = RecognitionObject.Ocr(830, 980, 140, 70); - const countResults = countRegion.findMulti(ocrObject); - let monsterCount = "-1"; - - if (countResults.count > 0) { - for (let i = 0; i < countResults.count; i++) { - const text = countResults[i].text; - const numbers = text.match(/\d+/); - if (numbers) { - monsterCount = numbers[0]; - break; - } - } - } - - if ((monsterCount === -1 || monsterCount === previousMonsterCount) && failCount <= 5) { - log.warn(`识别失败或结果与上次相同,重新识别第 ${i + 1} 个怪物 ${monsterId}`); - i--; // 将索引减 1,使得下一次循环重新执行当前索引 - failCount++;//失败计数加一 - continue; // 跳过当前迭代的剩余部分 - } else { - failCount = 0;//重置失败计数 - } - - previousMonsterCount = monsterCount; - - - // 4c. 输出日志 - log.info(`NO.${monsterNum} 怪物名称: ${monsterId.trim()}, 数量: ${monsterCount}`); - monsterNum++; - - // 4d. 存储结果到对象 - monsterCounts[monsterId.trim()] = monsterCount; - } - - return monsterCounts; -} - -// 定义所有图标的图像识别对象,每个图片都有自己的识别区域 -let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38); - -// 定义一个函数用于识别图像 -async function recognizeImage(recognitionObject, timeout = 5000) { - log.info(`开始图像识别,超时时间: ${timeout}ms`); - let startTime = Date.now(); - while (Date.now() - startTime < timeout) { - try { - // 尝试识别图像 - let imageResult = captureGameRegion().find(recognitionObject); - if (imageResult) { - log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); - return { success: true, x: imageResult.x, y: imageResult.y }; - } - } catch (error) { - log.error(`识别图像时发生异常: ${error.message}`); - } - await sleep(500); // 短暂延迟,避免过快循环 - } - log.warn(`经过多次尝试,仍然无法识别图像`); - return { success: false }; -} - -// 定义一个函数用于识别文字并点击 -async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000) { - log.info(`开始文字识别,目标文本: ${targetText},区域: x=${ocrRegion.x}, y=${ocrRegion.y}, width=${ocrRegion.width}, height=${ocrRegion.height}`); - let startTime = Date.now(); - while (Date.now() - startTime < timeout) { - try { - // 尝试 OCR 识别 - let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 - // 遍历识别结果,检查是否找到目标文本 - for (let res of resList) { - // 后处理:根据替换映射表检查和替换错误识别的字符 - let correctedText = res.text; - for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { - correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); - } - - if (correctedText.includes(targetText)) { - // 如果找到目标文本,计算并点击文字的中心坐标 - let centerX = res.x + res.width / 2; - let centerY = res.y + res.height / 2; - log.info(`识别到目标文本: ${correctedText},点击坐标: x=${centerX}, y=${centerY}`); - await click(centerX, centerY); - await sleep(500); // 确保点击后有足够的时间等待 - return { success: true, x: centerX, y: centerY }; - } - } - } catch (error) { - log.warn(`页面标志识别失败,正在进行重试... 错误信息: ${error.message}`); - } - await sleep(1000); // 短暂延迟,避免过快循环 - } - log.warn(`经过多次尝试,仍然无法识别文字: ${targetText}`); - return { success: false }; -} - -// 定义一个独立的函数用于在指定区域进行 OCR 识别并输出识别内容 -async function recognizeTextInRegion(ocrRegion, timeout = 5000) { - log.info(`开始 OCR 识别,区域: x=${ocrRegion.x}, y=${ocrRegion.y}, width=${ocrRegion.width}, height=${ocrRegion.height}`); - let startTime = Date.now(); - while (Date.now() - startTime < timeout) { - try { - // 在指定区域进行 OCR 识别 - let ocrResult = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); - if (ocrResult) { - log.info(`OCR 识别成功,原始文本: ${ocrResult.text}`); - // 后处理:根据替换映射表检查和替换错误识别的字符 - let correctedText = ocrResult.text; - for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { - correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); - } - log.info(`修正后文本: ${correctedText}`); - return correctedText; // 返回识别到的内容 - } else { - log.warn(`OCR 识别区域未找到内容`); - return null; // 如果 OCR 未识别到内容,返回 null - } - } catch (error) { - log.error(`OCR 摩拉数识别失败,错误信息: ${error.message}`); - } - await sleep(500); // 短暂延迟,避免过快循环 - } - log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); - return null; // 如果未识别到文字,返回 null -} - -// 定义 mora 函数 -async function mora() { - log.info("开始执行 mora 函数"); - // 设置游戏分辨率和 DPI 缩放比例 - setGameMetrics(1920, 1080, 1); - log.info("游戏分辨率和 DPI 设置完成"); - - // 返回游戏主界面 - await genshin.returnMainUi(); - log.info("返回游戏主界面"); - - // 按下 C 键 - keyPress("C"); - log.info("按下 C 键"); - await sleep(1500); - - let recognized = false; - - // 识别“角色菜单”图标或“天赋”文字 - let startTime = Date.now(); - while (Date.now() - startTime < 5000) { - // 尝试识别“角色菜单”图标 - let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000); - if (characterMenuResult.success) { - await click(177, 433); - log.info("点击角色菜单图标"); - await sleep(500); - recognized = true; - break; - } - - // 尝试识别“天赋”文字 - let targetText = "天赋"; - let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域 - let talentResult = await recognizeTextAndClick(targetText, ocrRegion); - if (talentResult.success) { - log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`); - recognized = true; - break; - } - - await sleep(1000); // 短暂延迟,避免过快循环 - } - - // 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值” - if (recognized) { - let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域 - let recognizedText = await recognizeTextInRegion(ocrRegionMora); - if (recognizedText) { - log.info(`成功识别到摩拉数值: ${recognizedText}`); - return recognizedText; // 返回识别到的摩拉数值 - } else { - log.warn("未能识别到摩拉数值。"); - } - } else { - log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。"); - } - - await sleep(500); - await genshin.returnMainUi(); - log.info("返回游戏主界面"); - - return null; // 如果未能识别到摩拉数值,返回 null -} - -// 定义自定义函数 basename,用于获取文件名 -function basename(filePath) { - const lastSlashIndex = filePath.lastIndexOf('\\'); // 或者使用 '/',取决于你的路径分隔符 - return filePath.substring(lastSlashIndex + 1); -} - -async function fakeLog(name, isJs, isStart, duration) { - await sleep(10); - const currentTime = Date.now(); - // 参数检查 - if (typeof name !== 'string') { - log.error("参数 'name' 必须是字符串类型!"); - return; - } - if (typeof isJs !== 'boolean') { - log.error("参数 'isJs' 必须是布尔型!"); - return; - } - if (typeof isStart !== 'boolean') { - log.error("参数 'isStart' 必须是布尔型!"); - return; - } - if (typeof currentTime !== 'number' || !Number.isInteger(currentTime)) { - log.error("参数 'currentTime' 必须是整数!"); - return; - } - if (typeof duration !== 'number' || !Number.isInteger(duration)) { - log.error("参数 'duration' 必须是整数!"); - return; - } - - // 将 currentTime 转换为 Date 对象并格式化为 HH:mm:ss.sss - const date = new Date(currentTime); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); - const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`; - - // 将 duration 转换为分钟和秒,并保留三位小数 - const durationInSeconds = duration / 1000; // 转换为秒 - const durationMinutes = Math.floor(durationInSeconds / 60); - const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 - - // 使用四个独立的 if 语句处理四种情况 - if (isJs && isStart) { - // 处理 isJs = true 且 isStart = true 的情况 - const logMessage = `正在伪造js开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行JS脚本: "${name}"`; - log.debug(logMessage); - } - if (isJs && !isStart) { - // 处理 isJs = true 且 isStart = false 的情况 - const logMessage = `正在伪造js结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - } - if (!isJs && isStart) { - // 处理 isJs = false 且 isStart = true 的情况 - const logMessage = `正在伪造地图追踪开始的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 开始执行地图追踪任务: "${name}"`; - log.debug(logMessage); - } - if (!isJs && !isStart) { - // 处理 isJs = false 且 isStart = false 的情况 - const logMessage = `正在伪造地图追踪结束的日志记录\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + - `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + - `------------------------------`; - log.debug(logMessage); - } -} - // 主逻辑 (async function () { const name1 = "锄地路线测试"; @@ -889,3 +431,454 @@ async function fakeLog(name, isJs, isStart, duration) { const duration4 = 0; // JS 开始时,耗时为 0 await fakeLog(name1, true, true, duration4); })(); + +async function readFolder(folderPath, onlyJson) { + log.info(`开始读取文件夹:${folderPath}`); + + // 新增一个堆栈,初始时包含 folderPath + const folderStack = [folderPath]; + + // 新增一个数组,用于存储文件信息对象 + const files = []; + + // 当堆栈不为空时,继续处理 + while (folderStack.length > 0) { + // 从堆栈中弹出一个路径 + const currentPath = folderStack.pop(); + + // 读取当前路径下的所有文件和子文件夹路径 + const filesInSubFolder = file.ReadPathSync(currentPath); + + // 临时数组,用于存储子文件夹路径 + const subFolders = []; + for (const filePath of filesInSubFolder) { + if (file.IsFolder(filePath)) { + // 如果是文件夹,先存储到临时数组中 + subFolders.push(filePath); + } else { + // 如果是文件,根据 onlyJson 判断是否存储 + if (onlyJson) { + if (filePath.endsWith(".json")) { + const fileName = filePath.split('\\').pop(); // 提取文件名 + const folderPathArray = filePath.split('\\').slice(0, -1); // 提取文件夹路径数组 + files.push({ + fullPath: filePath, + fileName: fileName, + folderPathArray: folderPathArray + }); + //log.info(`找到 JSON 文件:${filePath}`); + } + } else { + const fileName = filePath.split('\\').pop(); // 提取文件名 + const folderPathArray = filePath.split('\\').slice(0, -1); // 提取文件夹路径数组 + files.push({ + fullPath: filePath, + fileName: fileName, + folderPathArray: folderPathArray + }); + //log.info(`找到文件:${filePath}`); + } + } + } + // 将临时数组中的子文件夹路径按原顺序压入堆栈 + folderStack.push(...subFolders.reverse()); // 反转子文件夹路径 + } + + return files; +} + +async function getMonsterCounts() { + /* 0. 读取怪物列表 */ + const raw = file.readTextSync('assets/info.json'); + const monsterList = JSON.parse(raw).map(it => it.name); + const monsterCounts = {}; + + /* 1. 外层循环:最多 3 次进入生物志 */ + let attempt = 0; + while (attempt < 3) { + attempt++; + log.info(`第 ${attempt} 次尝试进入生物志`); + await genshin.returnMainUi(); + keyPress('VK_ESCAPE'); + await sleep(1500); + + const archiveTpl = RecognitionObject.TemplateMatch( + file.readImageMatSync('assets/RecognitionObject/图鉴.png'), 0, 0, 1920, 1080); + if (!(await findAndClick(archiveTpl))) continue; + + const faunaTpl = RecognitionObject.TemplateMatch( + file.readImageMatSync('assets/RecognitionObject/生物志.png'), 0, 0, 1920, 1080); + if (!(await findAndClick(faunaTpl))) continue; + + click(1355, 532); + await sleep(2000); + break; + } + if (attempt >= 3) { + log.error('连续 3 次无法进入生物志,脚本终止'); + await genshin.returnMainUi(); + return {}; + } + + /* ===== 工具函数 ===== */ + async function findAndClick(target, maxAttempts = 20) { + for (let attempts = 0; attempts < maxAttempts; attempts++) { + const gameRegion = captureGameRegion(); + try { + const result = gameRegion.find(target); + if (result.isExist()) { + result.click(); + return true; // 成功立刻返回 + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + if (attempts < maxAttempts - 1) { // 最后一次不再 sleep + await sleep(50); + } + } + //log.error("已达到重试次数上限,仍未找到目标"); + return false; + } + + async function scrollPage(totalDistance, stepDistance = 10, delayMs = 5) { + moveMouseTo(400, 750); // 移动到屏幕水平中心,垂直750坐标 + await sleep(50); + leftButtonDown(); + + // 计算滚动方向和总步数 + const isDownward = totalDistance < 0; // 如果totalDistance为负数,则向下滑动 + const steps = Math.ceil(Math.abs(totalDistance) / stepDistance); // 使用绝对值计算步数 + + for (let j = 0; j < steps; j++) { + const remainingDistance = Math.abs(totalDistance) - j * stepDistance; + const moveDistance = remainingDistance < stepDistance ? remainingDistance : stepDistance; + + // 根据滚动方向调整移动方向 + const direction = isDownward ? 1 : -1; // 向下滑动为正方向,向上滑动为负方向 + moveMouseBy(0, 1.2 * direction * moveDistance); // 根据方向调整滚动方向 + await sleep(delayMs); + } + + await sleep(200); + leftButtonUp(); + await sleep(500); + } + + async function readKillCount(maxTry = 5) { + const ocrObj = RecognitionObject.Ocr(865, 980, 150, 50); + for (let t = 0; t < maxTry; t++) { + const region = captureGameRegion(); + const results = region.findMulti(ocrObj); + region.dispose(); + + for (let i = 0; i < results.count; i++) { + const str = results[i].text.trim(); + // 必须是纯数字 + if (/^\d+$/.test(str)) { + return { success: true, count: parseInt(str, 10) }; + } + } + if (t < maxTry - 1) await sleep(200); // 最后一次不重试 + } + return { success: false, count: -1 }; + } + + async function readKillCountStable(prevCount, sameTolerance = 5) { + let lastCount = -1; + for (let r = 0; r < sameTolerance; r++) { + await sleep(50 * r); + //log.info(`执行第${r}次ocr`) + const ocrRet = await readKillCount(5); + if (!ocrRet.success) break; // 真的读不到数字就放弃 + lastCount = ocrRet.count; + + if (lastCount !== prevCount) return { success: true, count: lastCount }; // 变了→成功 + } + // 3 次仍相同→返回最后一次相同值 + return { success: true, count: lastCount }; + } + + + async function findMonsterIcon(monsterId, iconRetry = 3) { + const tpl = RecognitionObject.TemplateMatch( + file.readImageMatSync(`assets/monster/${monsterId.trim()}.png`), 130, 80, 670, 970); + let pageTurnsUp = 0; + while (pageTurnsUp < 1) { + let pageTurns = 0; + while (pageTurns < 2) { + //log.info("执行一次模板识别"); + if (await findAndClick(tpl, iconRetry)) return true; + await scrollPage(300); + pageTurns++; + } + for (let j = 0; j < 2; j++) { + await scrollPage(-300); + } + pageTurnsUp++; + } + return false; + } + + /* ===== 主循环 ===== */ + let prevCount = -1; // 上一轮 OCR 结果 + let retryMask = 0; // 位掩码:第 i 位为 1 表示已回退过 + let prevFinalCount = -1; // 上一只怪物的最终击杀数 + + for (let i = 0; i < monsterList.length; i++) { + const monsterId = monsterList[i]; + let time0 = new Date(); + /* 1. 找怪 + OCR */ + if (!(await findMonsterIcon(monsterId, 3))) { + log.info(`怪物: ${monsterId.trim()}, 未找到图标`); + monsterCounts[monsterId.trim()] = -1; + prevCount = -1; // 重置 + continue; + } + let time1 = new Date(); + //log.info(`寻找图标用时${time1 - time0}`); + /* 2. OCR:与上一只结果比较,原地重试 3 次 */ + const ocr = await readKillCountStable(prevFinalCount, 3); + const count = ocr.success ? ocr.count : -1; + let time2 = new Date(); + //log.info(`ocr用时${time2 - time1}`); + /* 2. 结果相同且本行还没回退过 → 回退一次 */ + if (count === prevCount && !(retryMask & (1 << i))) { + retryMask |= (1 << i); // 标记已回退 + i--; // 回退同一 i 一次 + continue; + } + + /* 3. 正常记录 */ + monsterCounts[monsterId.trim()] = count; + log.info(`怪物: ${monsterId.trim()}, 数量: ${count}`); + prevCount = count; + prevFinalCount = count; // 记录本次最终值,供下一只比对 + } + return monsterCounts; +} + +// 定义 mora 函数 +async function mora() { + // 定义所有图标的图像识别对象,每个图片都有自己的识别区域 + let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38); + + // 定义一个函数用于识别图像 + async function recognizeImage(recognitionObject, timeout = 5000) { + log.info(`开始图像识别,超时时间: ${timeout}ms`); + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 尝试识别图像 + let imageResult = captureGameRegion().find(recognitionObject); + if (imageResult) { + log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); + return { success: true, x: imageResult.x, y: imageResult.y }; + } + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + } + await sleep(500); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法识别图像`); + return { success: false }; + } + + // 定义一个函数用于识别文字并点击 + async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000) { + log.info(`开始文字识别,目标文本: ${targetText},区域: x=${ocrRegion.x}, y=${ocrRegion.y}, width=${ocrRegion.width}, height=${ocrRegion.height}`); + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 尝试 OCR 识别 + let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + // 遍历识别结果,检查是否找到目标文本 + for (let res of resList) { + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = res.text; + + if (correctedText.includes(targetText)) { + // 如果找到目标文本,计算并点击文字的中心坐标 + let centerX = res.x + res.width / 2; + let centerY = res.y + res.height / 2; + log.info(`识别到目标文本: ${correctedText},点击坐标: x=${centerX}, y=${centerY}`); + await click(centerX, centerY); + await sleep(500); // 确保点击后有足够的时间等待 + return { success: true, x: centerX, y: centerY }; + } + } + } catch (error) { + log.warn(`页面标志识别失败,正在进行重试... 错误信息: ${error.message}`); + } + await sleep(1000); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法识别文字: ${targetText}`); + return { success: false }; + } + + // 定义一个独立的函数用于在指定区域进行 OCR 识别并输出识别内容 + async function recognizeTextInRegion(ocrRegion, timeout = 5000) { + log.info(`开始 OCR 识别,区域: x=${ocrRegion.x}, y=${ocrRegion.y}, width=${ocrRegion.width}, height=${ocrRegion.height}`); + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 在指定区域进行 OCR 识别 + let ocrResult = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + if (ocrResult) { + log.info(`OCR 识别成功,原始文本: ${ocrResult.text}`); + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = ocrResult.text; + log.info(`修正后文本: ${correctedText}`); + return correctedText; // 返回识别到的内容 + } else { + log.warn(`OCR 识别区域未找到内容`); + return null; // 如果 OCR 未识别到内容,返回 null + } + } catch (error) { + log.error(`OCR 摩拉数识别失败,错误信息: ${error.message}`); + } + await sleep(500); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); + return null; // 如果未识别到文字,返回 null + } + log.info("开始执行 mora 函数"); + // 设置游戏分辨率和 DPI 缩放比例 + setGameMetrics(1920, 1080, 1); + log.info("游戏分辨率和 DPI 设置完成"); + + // 返回游戏主界面 + await genshin.returnMainUi(); + log.info("返回游戏主界面"); + + // 按下 C 键 + keyPress("C"); + log.info("按下 C 键"); + await sleep(1500); + + let recognized = false; + + // 识别“角色菜单”图标或“天赋”文字 + let startTime = Date.now(); + while (Date.now() - startTime < 5000) { + // 尝试识别“角色菜单”图标 + let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000); + if (characterMenuResult.success) { + await click(177, 433); + log.info("点击角色菜单图标"); + await sleep(500); + recognized = true; + break; + } + + // 尝试识别“天赋”文字 + let targetText = "天赋"; + let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域 + let talentResult = await recognizeTextAndClick(targetText, ocrRegion); + if (talentResult.success) { + log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`); + recognized = true; + break; + } + + await sleep(1000); // 短暂延迟,避免过快循环 + } + + // 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值” + if (recognized) { + let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域 + let recognizedText = await recognizeTextInRegion(ocrRegionMora); + if (recognizedText) { + log.info(`成功识别到摩拉数值: ${recognizedText}`); + return recognizedText; // 返回识别到的摩拉数值 + } else { + log.warn("未能识别到摩拉数值。"); + } + } else { + log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。"); + } + + await sleep(500); + await genshin.returnMainUi(); + log.info("返回游戏主界面"); + + return null; // 如果未能识别到摩拉数值,返回 null +} + +async function fakeLog(name, isJs, isStart, duration) { + await sleep(10); + const currentTime = Date.now(); + // 参数检查 + if (typeof name !== 'string') { + log.error("参数 'name' 必须是字符串类型!"); + return; + } + if (typeof isJs !== 'boolean') { + log.error("参数 'isJs' 必须是布尔型!"); + return; + } + if (typeof isStart !== 'boolean') { + log.error("参数 'isStart' 必须是布尔型!"); + return; + } + if (typeof currentTime !== 'number' || !Number.isInteger(currentTime)) { + log.error("参数 'currentTime' 必须是整数!"); + return; + } + if (typeof duration !== 'number' || !Number.isInteger(duration)) { + log.error("参数 'duration' 必须是整数!"); + return; + } + + // 将 currentTime 转换为 Date 对象并格式化为 HH:mm:ss.sss + const date = new Date(currentTime); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + const seconds = String(date.getSeconds()).padStart(2, '0'); + const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); + const formattedTime = `${hours}:${minutes}:${seconds}.${milliseconds}`; + + // 将 duration 转换为分钟和秒,并保留三位小数 + const durationInSeconds = duration / 1000; // 转换为秒 + const durationMinutes = Math.floor(durationInSeconds / 60); + const durationSeconds = (durationInSeconds % 60).toFixed(3); // 保留三位小数 + + // 使用四个独立的 if 语句处理四种情况 + if (isJs && isStart) { + // 处理 isJs = true 且 isStart = true 的情况 + const logMessage = `正在伪造js开始的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 开始执行JS脚本: "${name}"`; + log.debug(logMessage); + } + if (isJs && !isStart) { + // 处理 isJs = true 且 isStart = false 的情况 + const logMessage = `正在伪造js结束的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------`; + log.debug(logMessage); + } + if (!isJs && isStart) { + // 处理 isJs = false 且 isStart = true 的情况 + const logMessage = `正在伪造地图追踪开始的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 开始执行地图追踪任务: "${name}"`; + log.debug(logMessage); + } + if (!isJs && !isStart) { + // 处理 isJs = false 且 isStart = false 的情况 + const logMessage = `正在伪造地图追踪结束的日志记录\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `→ 脚本执行结束: "${name}", 耗时: ${durationMinutes}分${durationSeconds}秒\n\n` + + `[${formattedTime}] [INF] BetterGenshinImpact.Service.ScriptService\n` + + `------------------------------`; + log.debug(logMessage); + } +} \ No newline at end of file diff --git a/repo/js/HoeingPathingTest/manifest.json b/repo/js/HoeingPathingTest/manifest.json index f91160f4b..b9eb886df 100644 --- a/repo/js/HoeingPathingTest/manifest.json +++ b/repo/js/HoeingPathingTest/manifest.json @@ -1,16 +1,15 @@ { "manifest_version": 1, "name": "锄地路线测试", - "version": "1.0", + "version": "1.1", "description": "用于测试锄地路线的怪物信息,运行时间,并根据运行记录修改description字段,以适配js锄地一条龙", "authors": [ { - "name": "mno", - "links": "https://github.com/Bedrockx" + "name": "mno" }, { "name": "Tool_tingsu", - "links": "https://github.com/Tooltingsu" + "link": "" } ], "settings_ui": "settings.json",