diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/almond.png b/archive/js/Auto Theft NPC & 原食/assets/images/almond.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/almond.png rename to archive/js/Auto Theft NPC & 原食/assets/images/almond.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/buyBtn.png b/archive/js/Auto Theft NPC & 原食/assets/images/buyBtn.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/buyBtn.png rename to archive/js/Auto Theft NPC & 原食/assets/images/buyBtn.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/cabbage.png b/archive/js/Auto Theft NPC & 原食/assets/images/cabbage.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/cabbage.png rename to archive/js/Auto Theft NPC & 原食/assets/images/cabbage.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/coffeeBeans.png b/archive/js/Auto Theft NPC & 原食/assets/images/coffeeBeans.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/coffeeBeans.png rename to archive/js/Auto Theft NPC & 原食/assets/images/coffeeBeans.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/crab.png b/archive/js/Auto Theft NPC & 原食/assets/images/crab.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/crab.png rename to archive/js/Auto Theft NPC & 原食/assets/images/crab.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/fermentedJuice.png b/archive/js/Auto Theft NPC & 原食/assets/images/fermentedJuice.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/fermentedJuice.png rename to archive/js/Auto Theft NPC & 原食/assets/images/fermentedJuice.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/fish.png b/archive/js/Auto Theft NPC & 原食/assets/images/fish.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/fish.png rename to archive/js/Auto Theft NPC & 原食/assets/images/fish.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/fonta.png b/archive/js/Auto Theft NPC & 原食/assets/images/fonta.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/fonta.png rename to archive/js/Auto Theft NPC & 原食/assets/images/fonta.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/glabrousBeans.png b/archive/js/Auto Theft NPC & 原食/assets/images/glabrousBeans.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/glabrousBeans.png rename to archive/js/Auto Theft NPC & 原食/assets/images/glabrousBeans.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/milk.png b/archive/js/Auto Theft NPC & 原食/assets/images/milk.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/milk.png rename to archive/js/Auto Theft NPC & 原食/assets/images/milk.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/onion.png b/archive/js/Auto Theft NPC & 原食/assets/images/onion.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/onion.png rename to archive/js/Auto Theft NPC & 原食/assets/images/onion.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/pepper.png b/archive/js/Auto Theft NPC & 原食/assets/images/pepper.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/pepper.png rename to archive/js/Auto Theft NPC & 原食/assets/images/pepper.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/potato.png b/archive/js/Auto Theft NPC & 原食/assets/images/potato.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/potato.png rename to archive/js/Auto Theft NPC & 原食/assets/images/potato.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/rawMeat.png b/archive/js/Auto Theft NPC & 原食/assets/images/rawMeat.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/rawMeat.png rename to archive/js/Auto Theft NPC & 原食/assets/images/rawMeat.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/rice.png b/archive/js/Auto Theft NPC & 原食/assets/images/rice.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/rice.png rename to archive/js/Auto Theft NPC & 原食/assets/images/rice.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/salt.png b/archive/js/Auto Theft NPC & 原食/assets/images/salt.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/salt.png rename to archive/js/Auto Theft NPC & 原食/assets/images/salt.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/shrimp.png b/archive/js/Auto Theft NPC & 原食/assets/images/shrimp.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/shrimp.png rename to archive/js/Auto Theft NPC & 原食/assets/images/shrimp.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/tofu.png b/archive/js/Auto Theft NPC & 原食/assets/images/tofu.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/tofu.png rename to archive/js/Auto Theft NPC & 原食/assets/images/tofu.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/tomato.png b/archive/js/Auto Theft NPC & 原食/assets/images/tomato.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/tomato.png rename to archive/js/Auto Theft NPC & 原食/assets/images/tomato.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/images/wheat.png b/archive/js/Auto Theft NPC & 原食/assets/images/wheat.png similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/images/wheat.png rename to archive/js/Auto Theft NPC & 原食/assets/images/wheat.png diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/东升.json b/archive/js/Auto Theft NPC & 原食/assets/path/东升.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/东升.json rename to archive/js/Auto Theft NPC & 原食/assets/path/东升.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/卯师父.json b/archive/js/Auto Theft NPC & 原食/assets/path/卯师父.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/卯师父.json rename to archive/js/Auto Theft NPC & 原食/assets/path/卯师父.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/哈马维.json b/archive/js/Auto Theft NPC & 原食/assets/path/哈马维.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/哈马维.json rename to archive/js/Auto Theft NPC & 原食/assets/path/哈马维.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/小畑.json b/archive/js/Auto Theft NPC & 原食/assets/path/小畑.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/小畑.json rename to archive/js/Auto Theft NPC & 原食/assets/path/小畑.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/布兰琪.json b/archive/js/Auto Theft NPC & 原食/assets/path/布兰琪.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/布兰琪.json rename to archive/js/Auto Theft NPC & 原食/assets/path/布兰琪.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/布希柯.json b/archive/js/Auto Theft NPC & 原食/assets/path/布希柯.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/布希柯.json rename to archive/js/Auto Theft NPC & 原食/assets/path/布希柯.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/布特罗斯.json b/archive/js/Auto Theft NPC & 原食/assets/path/布特罗斯.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/布特罗斯.json rename to archive/js/Auto Theft NPC & 原食/assets/path/布特罗斯.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/布纳马.json b/archive/js/Auto Theft NPC & 原食/assets/path/布纳马.json similarity index 95% rename from repo/js/Auto Theft NPC & 原食/assets/path/布纳马.json rename to archive/js/Auto Theft NPC & 原食/assets/path/布纳马.json index 820debcff..ea3aca788 100644 --- a/repo/js/Auto Theft NPC & 原食/assets/path/布纳马.json +++ b/archive/js/Auto Theft NPC & 原食/assets/path/布纳马.json @@ -1,57 +1,57 @@ -{ - "info": { - "name": "布纳马", - "type": "collect", - "authors": [ - { - "name": "芝士贝果" - } - ], - "version": "1.0", - "description": "", - "map_name": "Teyvat", - "bgi_version": "0.47.3", - "tags": [], - "last_modified_time": 1754489424074, - "enable_monster_loot_split": false, - "map_match_method": "" - }, - "positions": [ - { - "id": 1, - "action": "", - "move_mode": "walk", - "type": "teleport", - "x": 9060.5419921875, - "y": -1847.5107421875, - "action_params": "" - }, - { - "id": 2, - "x": 9089.0361328125, - "y": -1852.42919921875, - "type": "path", - "move_mode": "walk", - "action": "", - "action_params": "" - }, - { - "id": 3, - "x": 9088.6552734375, - "y": -1856.89306640625, - "type": "target", - "move_mode": "walk", - "action": "", - "action_params": "" - }, - { - "id": 4, - "x": 9089.8935546875, - "y": -1857.2724609375, - "type": "target", - "move_mode": "walk", - "action": "", - "action_params": "" - } - ] +{ + "info": { + "name": "布纳马", + "type": "collect", + "authors": [ + { + "name": "芝士贝果" + } + ], + "version": "1.0", + "description": "", + "map_name": "Teyvat", + "bgi_version": "0.47.3", + "tags": [], + "last_modified_time": 1754489424074, + "enable_monster_loot_split": false, + "map_match_method": "" + }, + "positions": [ + { + "id": 1, + "action": "", + "move_mode": "walk", + "type": "teleport", + "x": 9060.5419921875, + "y": -1847.5107421875, + "action_params": "" + }, + { + "id": 2, + "x": 9089.0361328125, + "y": -1852.42919921875, + "type": "path", + "move_mode": "walk", + "action": "", + "action_params": "" + }, + { + "id": 3, + "x": 9088.6552734375, + "y": -1856.89306640625, + "type": "target", + "move_mode": "walk", + "action": "", + "action_params": "" + }, + { + "id": 4, + "x": 9089.8935546875, + "y": -1857.2724609375, + "type": "target", + "move_mode": "walk", + "action": "", + "action_params": "" + } + ] } \ No newline at end of file diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/志村勘兵卫.json b/archive/js/Auto Theft NPC & 原食/assets/path/志村勘兵卫.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/志村勘兵卫.json rename to archive/js/Auto Theft NPC & 原食/assets/path/志村勘兵卫.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/恩忒卡.json b/archive/js/Auto Theft NPC & 原食/assets/path/恩忒卡.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/恩忒卡.json rename to archive/js/Auto Theft NPC & 原食/assets/path/恩忒卡.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/珀姆.json b/archive/js/Auto Theft NPC & 原食/assets/path/珀姆.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/珀姆.json rename to archive/js/Auto Theft NPC & 原食/assets/path/珀姆.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/老孙.json b/archive/js/Auto Theft NPC & 原食/assets/path/老孙.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/老孙.json rename to archive/js/Auto Theft NPC & 原食/assets/path/老孙.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/老高.json b/archive/js/Auto Theft NPC & 原食/assets/path/老高.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/老高.json rename to archive/js/Auto Theft NPC & 原食/assets/path/老高.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/莎拉.json b/archive/js/Auto Theft NPC & 原食/assets/path/莎拉.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/莎拉.json rename to archive/js/Auto Theft NPC & 原食/assets/path/莎拉.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/葵.json b/archive/js/Auto Theft NPC & 原食/assets/path/葵.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/葵.json rename to archive/js/Auto Theft NPC & 原食/assets/path/葵.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/阿扎莱.json b/archive/js/Auto Theft NPC & 原食/assets/path/阿扎莱.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/阿扎莱.json rename to archive/js/Auto Theft NPC & 原食/assets/path/阿扎莱.json diff --git a/repo/js/Auto Theft NPC & 原食/assets/path/阿鲁埃.json b/archive/js/Auto Theft NPC & 原食/assets/path/阿鲁埃.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/assets/path/阿鲁埃.json rename to archive/js/Auto Theft NPC & 原食/assets/path/阿鲁埃.json diff --git a/repo/js/Auto Theft NPC & 原食/main.js b/archive/js/Auto Theft NPC & 原食/main.js similarity index 100% rename from repo/js/Auto Theft NPC & 原食/main.js rename to archive/js/Auto Theft NPC & 原食/main.js diff --git a/repo/js/Auto Theft NPC & 原食/manifest.json b/archive/js/Auto Theft NPC & 原食/manifest.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/manifest.json rename to archive/js/Auto Theft NPC & 原食/manifest.json diff --git a/repo/js/Auto Theft NPC & 原食/settings.json b/archive/js/Auto Theft NPC & 原食/settings.json similarity index 100% rename from repo/js/Auto Theft NPC & 原食/settings.json rename to archive/js/Auto Theft NPC & 原食/settings.json diff --git a/repo/js/EscofierKitchenContraption/README.md b/archive/js/EscofierKitchenContraption/README.md similarity index 100% rename from repo/js/EscofierKitchenContraption/README.md rename to archive/js/EscofierKitchenContraption/README.md diff --git a/repo/js/EscofierKitchenContraption/main.js b/archive/js/EscofierKitchenContraption/main.js similarity index 100% rename from repo/js/EscofierKitchenContraption/main.js rename to archive/js/EscofierKitchenContraption/main.js diff --git a/repo/js/EscofierKitchenContraption/manifest.json b/archive/js/EscofierKitchenContraption/manifest.json similarity index 100% rename from repo/js/EscofierKitchenContraption/manifest.json rename to archive/js/EscofierKitchenContraption/manifest.json diff --git a/repo/js/EscofierKitchenContraption/settings.json b/archive/js/EscofierKitchenContraption/settings.json similarity index 100% rename from repo/js/EscofierKitchenContraption/settings.json rename to archive/js/EscofierKitchenContraption/settings.json diff --git a/repo/js/OCR购买食材/assets/Comfirm.png b/archive/js/OCR购买食材/assets/Comfirm.png similarity index 100% rename from repo/js/OCR购买食材/assets/Comfirm.png rename to archive/js/OCR购买食材/assets/Comfirm.png diff --git a/repo/js/OCR购买食材/assets/E_Dialogue.png b/archive/js/OCR购买食材/assets/E_Dialogue.png similarity index 100% rename from repo/js/OCR购买食材/assets/E_Dialogue.png rename to archive/js/OCR购买食材/assets/E_Dialogue.png diff --git a/repo/js/OCR购买食材/assets/F_Dialogue.png b/archive/js/OCR购买食材/assets/F_Dialogue.png similarity index 100% rename from repo/js/OCR购买食材/assets/F_Dialogue.png rename to archive/js/OCR购买食材/assets/F_Dialogue.png diff --git a/repo/js/OCR购买食材/assets/Pathing/挪德卡莱杂货铺采若.json b/archive/js/OCR购买食材/assets/Pathing/挪德卡莱杂货铺采若.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/挪德卡莱杂货铺采若.json rename to archive/js/OCR购买食材/assets/Pathing/挪德卡莱杂货铺采若.json diff --git a/repo/js/OCR购买食材/assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json b/archive/js/OCR购买食材/assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json rename to archive/js/OCR购买食材/assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json diff --git a/repo/js/OCR购买食材/assets/Pathing/枫丹达莫维百货店主布希柯.json b/archive/js/OCR购买食材/assets/Pathing/枫丹达莫维百货店主布希柯.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/枫丹达莫维百货店主布希柯.json rename to archive/js/OCR购买食材/assets/Pathing/枫丹达莫维百货店主布希柯.json diff --git a/repo/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅-2.json b/archive/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅-2.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅-2.json rename to archive/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅-2.json diff --git a/repo/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅.json b/archive/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅.json rename to archive/js/OCR购买食材/assets/Pathing/璃月万民堂老板卯师傅.json diff --git a/repo/js/OCR购买食材/assets/Pathing/璃月荣发商铺店主东升.json b/archive/js/OCR购买食材/assets/Pathing/璃月荣发商铺店主东升.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/璃月荣发商铺店主东升.json rename to archive/js/OCR购买食材/assets/Pathing/璃月荣发商铺店主东升.json diff --git a/repo/js/OCR购买食材/assets/Pathing/稻妻九十九物店主葵.json b/archive/js/OCR购买食材/assets/Pathing/稻妻九十九物店主葵.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/稻妻九十九物店主葵.json rename to archive/js/OCR购买食材/assets/Pathing/稻妻九十九物店主葵.json diff --git a/repo/js/OCR购买食材/assets/Pathing/稻妻志村屋店主志村勘兵卫.json b/archive/js/OCR购买食材/assets/Pathing/稻妻志村屋店主志村勘兵卫.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/稻妻志村屋店主志村勘兵卫.json rename to archive/js/OCR购买食材/assets/Pathing/稻妻志村屋店主志村勘兵卫.json diff --git a/repo/js/OCR购买食材/assets/Pathing/纳塔杂货铺布纳马.json b/archive/js/OCR购买食材/assets/Pathing/纳塔杂货铺布纳马.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/纳塔杂货铺布纳马.json rename to archive/js/OCR购买食材/assets/Pathing/纳塔杂货铺布纳马.json diff --git a/repo/js/OCR购买食材/assets/Pathing/蒙德百货销售员布兰琪.json b/archive/js/OCR购买食材/assets/Pathing/蒙德百货销售员布兰琪.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/蒙德百货销售员布兰琪.json rename to archive/js/OCR购买食材/assets/Pathing/蒙德百货销售员布兰琪.json diff --git a/repo/js/OCR购买食材/assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json b/archive/js/OCR购买食材/assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json rename to archive/js/OCR购买食材/assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json diff --git a/repo/js/OCR购买食材/assets/Pathing/须弥城鱼贩珀姆.json b/archive/js/OCR购买食材/assets/Pathing/须弥城鱼贩珀姆.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/须弥城鱼贩珀姆.json rename to archive/js/OCR购买食材/assets/Pathing/须弥城鱼贩珀姆.json diff --git a/repo/js/OCR购买食材/assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json b/archive/js/OCR购买食材/assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json rename to archive/js/OCR购买食材/assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json diff --git a/repo/js/OCR购买食材/assets/Pathing/须弥杂货铺哈马维.json b/archive/js/OCR购买食材/assets/Pathing/须弥杂货铺哈马维.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/须弥杂货铺哈马维.json rename to archive/js/OCR购买食材/assets/Pathing/须弥杂货铺哈马维.json diff --git a/repo/js/OCR购买食材/assets/Pathing/须弥阿如村商人阿扎莱.json b/archive/js/OCR购买食材/assets/Pathing/须弥阿如村商人阿扎莱.json similarity index 100% rename from repo/js/OCR购买食材/assets/Pathing/须弥阿如村商人阿扎莱.json rename to archive/js/OCR购买食材/assets/Pathing/须弥阿如村商人阿扎莱.json diff --git a/repo/js/OCR购买食材/assets/Picture/AlmondRo.png b/archive/js/OCR购买食材/assets/Picture/AlmondRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/AlmondRo.png rename to archive/js/OCR购买食材/assets/Picture/AlmondRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/CabbageRo.png b/archive/js/OCR购买食材/assets/Picture/CabbageRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/CabbageRo.png rename to archive/js/OCR购买食材/assets/Picture/CabbageRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/CoffeeRo.png b/archive/js/OCR购买食材/assets/Picture/CoffeeRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/CoffeeRo.png rename to archive/js/OCR购买食材/assets/Picture/CoffeeRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/CrabRo.png b/archive/js/OCR购买食材/assets/Picture/CrabRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/CrabRo.png rename to archive/js/OCR购买食材/assets/Picture/CrabRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/FengdaRo.png b/archive/js/OCR购买食材/assets/Picture/FengdaRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/FengdaRo.png rename to archive/js/OCR购买食材/assets/Picture/FengdaRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/FermentRo.png b/archive/js/OCR购买食材/assets/Picture/FermentRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/FermentRo.png rename to archive/js/OCR购买食材/assets/Picture/FermentRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/FishRo.png b/archive/js/OCR购买食材/assets/Picture/FishRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/FishRo.png rename to archive/js/OCR购买食材/assets/Picture/FishRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/MilkRo.png b/archive/js/OCR购买食材/assets/Picture/MilkRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/MilkRo.png rename to archive/js/OCR购买食材/assets/Picture/MilkRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/OnionRo.png b/archive/js/OCR购买食材/assets/Picture/OnionRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/OnionRo.png rename to archive/js/OCR购买食材/assets/Picture/OnionRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/PepperRo.png b/archive/js/OCR购买食材/assets/Picture/PepperRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/PepperRo.png rename to archive/js/OCR购买食材/assets/Picture/PepperRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/PotatoRo.png b/archive/js/OCR购买食材/assets/Picture/PotatoRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/PotatoRo.png rename to archive/js/OCR购买食材/assets/Picture/PotatoRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/RiceRo.png b/archive/js/OCR购买食材/assets/Picture/RiceRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/RiceRo.png rename to archive/js/OCR购买食材/assets/Picture/RiceRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/SaltRo.png b/archive/js/OCR购买食材/assets/Picture/SaltRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/SaltRo.png rename to archive/js/OCR购买食材/assets/Picture/SaltRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/ShrimpRo.png b/archive/js/OCR购买食材/assets/Picture/ShrimpRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/ShrimpRo.png rename to archive/js/OCR购买食材/assets/Picture/ShrimpRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/SpicesRo.png b/archive/js/OCR购买食材/assets/Picture/SpicesRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/SpicesRo.png rename to archive/js/OCR购买食材/assets/Picture/SpicesRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/TofuRo.png b/archive/js/OCR购买食材/assets/Picture/TofuRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/TofuRo.png rename to archive/js/OCR购买食材/assets/Picture/TofuRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/TomatoRo.png b/archive/js/OCR购买食材/assets/Picture/TomatoRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/TomatoRo.png rename to archive/js/OCR购买食材/assets/Picture/TomatoRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/ToutuRo.png b/archive/js/OCR购买食材/assets/Picture/ToutuRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/ToutuRo.png rename to archive/js/OCR购买食材/assets/Picture/ToutuRo.png diff --git a/repo/js/OCR购买食材/assets/Picture/WheatRo.png b/archive/js/OCR购买食材/assets/Picture/WheatRo.png similarity index 100% rename from repo/js/OCR购买食材/assets/Picture/WheatRo.png rename to archive/js/OCR购买食材/assets/Picture/WheatRo.png diff --git a/repo/js/OCR购买食材/assets/咖啡厅露泽店主阿鲁埃.json b/archive/js/OCR购买食材/assets/咖啡厅露泽店主阿鲁埃.json similarity index 100% rename from repo/js/OCR购买食材/assets/咖啡厅露泽店主阿鲁埃.json rename to archive/js/OCR购买食材/assets/咖啡厅露泽店主阿鲁埃.json diff --git a/repo/js/OCR购买食材/assets/枫丹咖啡厅露泽店主阿鲁埃.json b/archive/js/OCR购买食材/assets/枫丹咖啡厅露泽店主阿鲁埃.json similarity index 100% rename from repo/js/OCR购买食材/assets/枫丹咖啡厅露泽店主阿鲁埃.json rename to archive/js/OCR购买食材/assets/枫丹咖啡厅露泽店主阿鲁埃.json diff --git a/repo/js/OCR购买食材/assets/枫丹杂货商布希柯.json b/archive/js/OCR购买食材/assets/枫丹杂货商布希柯.json similarity index 100% rename from repo/js/OCR购买食材/assets/枫丹杂货商布希柯.json rename to archive/js/OCR购买食材/assets/枫丹杂货商布希柯.json diff --git a/repo/js/OCR购买食材/assets/枫丹达莫维百货店主布希柯.json b/archive/js/OCR购买食材/assets/枫丹达莫维百货店主布希柯.json similarity index 100% rename from repo/js/OCR购买食材/assets/枫丹达莫维百货店主布希柯.json rename to archive/js/OCR购买食材/assets/枫丹达莫维百货店主布希柯.json diff --git a/repo/js/OCR购买食材/assets/滚轮下翻.json b/archive/js/OCR购买食材/assets/滚轮下翻.json similarity index 98% rename from repo/js/OCR购买食材/assets/滚轮下翻.json rename to archive/js/OCR购买食材/assets/滚轮下翻.json index cd0e99aca..18e572736 100644 --- a/repo/js/OCR购买食材/assets/滚轮下翻.json +++ b/archive/js/OCR购买食材/assets/滚轮下翻.json @@ -1,3 +1,3 @@ -{"macroEvents":[{"type":6,"mouseX":0,"mouseY":-120,"time":0}, -{"type":6,"mouseX":0,"mouseY":0,"time":100}], +{"macroEvents":[{"type":6,"mouseX":0,"mouseY":-120,"time":0}, +{"type":6,"mouseX":0,"mouseY":0,"time":100}], "info":{"name":"","description":"","x":0,"y":0,"width":1920,"height":1080,"recordDpi":1}} \ No newline at end of file diff --git a/repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅-2.json b/archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅-2.json similarity index 100% rename from repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅-2.json rename to archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅-2.json diff --git a/repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅-备选.json b/archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅-备选.json similarity index 100% rename from repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅-备选.json rename to archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅-备选.json diff --git a/repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅.json b/archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅.json similarity index 100% rename from repo/js/OCR购买食材/assets/璃月万民堂老板卯师傅.json rename to archive/js/OCR购买食材/assets/璃月万民堂老板卯师傅.json diff --git a/repo/js/OCR购买食材/assets/璃月杂货商东升.json b/archive/js/OCR购买食材/assets/璃月杂货商东升.json similarity index 100% rename from repo/js/OCR购买食材/assets/璃月杂货商东升.json rename to archive/js/OCR购买食材/assets/璃月杂货商东升.json diff --git a/repo/js/OCR购买食材/assets/璃月荣发商铺店主东升.json b/archive/js/OCR购买食材/assets/璃月荣发商铺店主东升.json similarity index 100% rename from repo/js/OCR购买食材/assets/璃月荣发商铺店主东升.json rename to archive/js/OCR购买食材/assets/璃月荣发商铺店主东升.json diff --git a/repo/js/OCR购买食材/assets/稻妻九十九物店主葵.json b/archive/js/OCR购买食材/assets/稻妻九十九物店主葵.json similarity index 100% rename from repo/js/OCR购买食材/assets/稻妻九十九物店主葵.json rename to archive/js/OCR购买食材/assets/稻妻九十九物店主葵.json diff --git a/repo/js/OCR购买食材/assets/稻妻志村屋店主志村勘兵卫.json b/archive/js/OCR购买食材/assets/稻妻志村屋店主志村勘兵卫.json similarity index 100% rename from repo/js/OCR购买食材/assets/稻妻志村屋店主志村勘兵卫.json rename to archive/js/OCR购买食材/assets/稻妻志村屋店主志村勘兵卫.json diff --git a/repo/js/OCR购买食材/assets/蒙德杂货商布兰琪.json b/archive/js/OCR购买食材/assets/蒙德杂货商布兰琪.json similarity index 100% rename from repo/js/OCR购买食材/assets/蒙德杂货商布兰琪.json rename to archive/js/OCR购买食材/assets/蒙德杂货商布兰琪.json diff --git a/repo/js/OCR购买食材/assets/蒙德百货销售员布兰琪.json b/archive/js/OCR购买食材/assets/蒙德百货销售员布兰琪.json similarity index 100% rename from repo/js/OCR购买食材/assets/蒙德百货销售员布兰琪.json rename to archive/js/OCR购买食材/assets/蒙德百货销售员布兰琪.json diff --git a/repo/js/OCR购买食材/assets/须弥城鱼贩珀姆.json b/archive/js/OCR购买食材/assets/须弥城鱼贩珀姆.json similarity index 100% rename from repo/js/OCR购买食材/assets/须弥城鱼贩珀姆.json rename to archive/js/OCR购买食材/assets/须弥城鱼贩珀姆.json diff --git a/repo/js/OCR购买食材/assets/须弥奥摩斯港鱼贩布特罗斯.json b/archive/js/OCR购买食材/assets/须弥奥摩斯港鱼贩布特罗斯.json similarity index 100% rename from repo/js/OCR购买食材/assets/须弥奥摩斯港鱼贩布特罗斯.json rename to archive/js/OCR购买食材/assets/须弥奥摩斯港鱼贩布特罗斯.json diff --git a/repo/js/OCR购买食材/assets/须弥阿如村商人阿扎莱.json b/archive/js/OCR购买食材/assets/须弥阿如村商人阿扎莱.json similarity index 100% rename from repo/js/OCR购买食材/assets/须弥阿如村商人阿扎莱.json rename to archive/js/OCR购买食材/assets/须弥阿如村商人阿扎莱.json diff --git a/repo/js/OCR购买食材/main.js b/archive/js/OCR购买食材/main.js similarity index 97% rename from repo/js/OCR购买食材/main.js rename to archive/js/OCR购买食材/main.js index a06263ad7..5bc9670fc 100644 --- a/repo/js/OCR购买食材/main.js +++ b/archive/js/OCR购买食材/main.js @@ -1,601 +1,601 @@ -// 定义所有食材的图像识别对象 -let FengdaRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FengdaRo.png")); -let SaltRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/SaltRo.png")); -let PepperRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/PepperRo.png")); -let OnionRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/OnionRo.png")); -let MilkRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/MilkRo.png")); -let TomatoRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/TomatoRo.png")); -let SpicesRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/SpicesRo.png")); -let CabbageRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CabbageRo.png")); -let PotatoRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/PotatoRo.png")); -let WheatRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/WheatRo.png")); -let RiceRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/RiceRo.png")); -let TofuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/TofuRo.png")); -let AlmondRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/AlmondRo.png")); -let FishRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FishRo.png")); -let CrabRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CrabRo.png")); -let ShrimpRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/ShrimpRo.png")); -let CoffeeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CoffeeRo.png")); -let ToutuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/ToutuRo.png")); -let FermentRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FermentRo.png")); - -// 定义所有可能的食材,注意料理名字长度可能超过识图范围 -const ingredients = [ - "枫达", "盐", "胡椒", "洋葱", "牛奶", "番茄", "香辛料", "卷心菜", "土豆", "小麦", "稻米", "豆腐", "杏仁", "鱼肉", "螃蟹", "虾仁", "咖啡豆", "秃秃豆", "发酵果实汁", "黑麦" -]; - -// 定义所有食材及其对应的路径文件和 NPC -const mondstadtGroceryFilePath = `assets/Pathing/蒙德百货销售员布兰琪.json`; -const liyueGroceryFilePath = `assets/Pathing/璃月荣发商铺店主东升.json`; -const liyueWanminFilePath = `assets/Pathing/璃月万民堂老板卯师傅.json`; -const groceryFilePath = `assets/Pathing/稻妻九十九物店主葵.json`; -const charcoalFilePath = `assets/Pathing/稻妻志村屋店主志村勘兵卫.json`; -const fengdanGroceryFilePath = `assets/Pathing/枫丹达莫维百货店主布希柯.json`; -const cafeLuzheFilePath = `assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json`; -const sumiCitycafeFilePath = `assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json`; -const sumiCityFishPath = `assets/Pathing/须弥城鱼贩珀姆.json`; -const sumiGroceryFilePath = `assets/Pathing/须弥杂货铺哈马维.json`; -const omosPortFishPath = `assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json`; -const azaleVillMerPath = `assets/Pathing/须弥阿如村商人阿扎莱.json`; -const natlanGroceryFilePath = `assets/Pathing/纳塔杂货铺布纳马.json`; -const nodKraiGroceryFilePath = `assets/Pathing/挪德卡莱杂货铺采若.json`; - -const ingredientPaths = { - "枫达": [fengdanGroceryFilePath, cafeLuzheFilePath], - "盐": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "洋葱": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "牛奶": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "番茄": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "卷心菜": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "土豆": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "小麦": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "胡椒": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], - "稻米": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath],// - "虾仁": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, sumiCityFishPath, omosPortFishPath], - "豆腐": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath], - "杏仁": [liyueGroceryFilePath, fengdanGroceryFilePath], - "鱼肉": [liyueWanminFilePath, charcoalFilePath, sumiCityFishPath, omosPortFishPath, azaleVillMerPath], - "螃蟹": [liyueWanminFilePath, charcoalFilePath, sumiCityFishPath, omosPortFishPath], - "秃秃豆": [fengdanGroceryFilePath, azaleVillMerPath, natlanGroceryFilePath], - "咖啡豆": [sumiCitycafeFilePath, cafeLuzheFilePath], - "香辛料": [azaleVillMerPath], - "发酵果实汁": [fengdanGroceryFilePath], - "黑麦": [nodKraiGroceryFilePath], -}; - -// 定义食材名称和图片文件名的映射表 -const ingredientImageMap = { - "枫达": "FengdaRo.png", - "盐": "SaltRo.png", - "洋葱": "OnionRo.png", - "牛奶": "MilkRo.png", - "番茄": "TomatoRo.png", - "卷心菜": "CabbageRo.png", - "土豆": "PotatoRo.png", - "小麦": "WheatRo.png", - "胡椒": "PepperRo.png", - "稻米": "RiceRo.png", - "虾仁": "ShrimpRo.png", - "豆腐": "TofuRo.png", - "杏仁": "AlmondRo.png", - "鱼肉": "FishRo.png", - "螃蟹": "CrabRo.png", - "秃秃豆": "ToutuRo.png", - "咖啡豆": "CoffeeRo.png", - "香辛料": "SpicesRo.png", - "发酵果实汁": "FermentRo.png", - // 可以继续添加更多食材的映射 -}; - -// 定义替换映射表 -const replacementMap = { - "监": "盐", - "卵": "卯" -}; -// 定义所有NPC名,注意名字长度可能超过识图范围 -const npcNames = { - [mondstadtGroceryFilePath]: ["布兰琪"], - [liyueGroceryFilePath]: ["东升"], - [liyueWanminFilePath]: ["卯师傅", "师傅"],// ["卯师傅", "卵师傅"] - [groceryFilePath]: ["葵"], - [charcoalFilePath]: ["志村勘"], - [fengdanGroceryFilePath]: ["布希柯"], - [cafeLuzheFilePath]: ["阿鲁埃"], - [sumiCityFishPath]: ["珀姆"], - [sumiCitycafeFilePath]: ["恩忒卡"], - [omosPortFishPath]: ["布特罗斯"], - [azaleVillMerPath]: ["阿扎莱"], - [sumiGroceryFilePath]: ["哈马维"], - [natlanGroceryFilePath]: ["布纳马"], - [nodKraiGroceryFilePath]: ["采若"], -}; - -// 筛选出用户选择的食材及其对应的路径文件和 NPC -let selectedIngredients = []; // 在函数外部声明一次 -let selectedPaths = new Map(); - -for (let ingredient of ingredients) { - if (settings[ingredient]) { - selectedIngredients.push(ingredient); - ingredientPaths[ingredient].forEach(path => { - if (!selectedPaths.has(path)) { - selectedPaths.set(path, []); - } - selectedPaths.get(path).push(ingredient); - }); - } -} - -if (selectedIngredients.length === 0) { - log.error("未选择任何食材,退出任务"); - throw new Error("未选择任何食材,任务终止"); // 抛出异常以终止任务 -} -// 汇总即将购买的食材信息 -let purchaseSummary = selectedIngredients.join(", "); -log.info(`即将购买: ${purchaseSummary}`); - -// 定义一个函数用于模拟按键操作 -async function simulateKeyOperations(key, duration) { - keyDown(key); - await sleep(duration); - keyUp(key); - await sleep(500); // 释放按键后等待 500 毫秒 -} - -// 定义一个函数用于购买食材 -async function purchaseIngredient(ingredient) { - log.info(`购买食材: ${ingredient}`); - // 在购买前进行识别 - let ComfirmRoResult1 = await recognizeImage("assets/Comfirm.png", 1585, 1005, 31, 31, 2000); - if (ComfirmRoResult1) { - // 模拟购买操作的后续点击 - await click(1600, 1020); - await sleep(1000); // 购买 - } else { - log.warn(`食材: ${ingredient}已售罄或背包已满`); - return; // 退出操作 - } - - // 在点击选择100个之前进行识别 - let ComfirmRoResult2 = await recognizeImage("assets/Comfirm.png", 995, 766, 31, 31, 2000); - if (ComfirmRoResult2) { - log.info("选择100个的"); - await click(1181, 600); - await sleep(200); // 选择100个 - } else { - log.warn("尝试重新点击购买"); - await click(1600, 1020); - await sleep(1000); // 购买 - return; // 退出操作 - } - - await click(1320, 780); - await sleep(1000); // 最终确认 - await click(1320, 780); - await sleep(1000); // 点击空白 -} - - -// 定义一个通用的图像识别函数 -function recognizeImage(templatePath, xMin, yMin, width, height, timeout = 2000) { - let startTime = Date.now(); - while (Date.now() - startTime < timeout) { - try { - let template = file.ReadImageMatSync(templatePath); - let recognitionObject = RecognitionObject.TemplateMatch(template, xMin, yMin, width, height); - let ra = captureGameRegion(); - let result = ra.find(recognitionObject); - template.dispose(); - ra.dispose(); - if (result.isExist()) { - return { success: true, x: result.x, y: result.y, width: result.width, height: result.height }; - } - - } catch (error) { - log.error(`识别图像时发生异常: ${error.message}`); - return null; - } - } - log.warn("图像识别超时"); - return null; -} - -// 定义一个函数用于执行OCR识别 -function performOcr(targetText, xRange, yRange, tolerance, timeout = 2000) { - let startTime = Date.now(); - while (Date.now() - startTime < timeout) { - try { - // 调整区域范围以包含容错区间 - let adjustedXMin = xRange.min - tolerance; - let adjustedXMax = xRange.max + tolerance; - let adjustedYMin = yRange.min - tolerance; - let adjustedYMax = yRange.max + tolerance; - - // 在捕获的区域内进行OCR识别 - let ra = captureGameRegion(); - let resList = ra.findMulti(RecognitionObject.ocr( - adjustedXMin, adjustedYMin, - adjustedXMax - adjustedXMin, adjustedYMax - adjustedYMin - )); - ra.dispose(); - - // 遍历识别结果,检查是否找到目标文本 - for (let i = 0; i < resList.count; i++) { - let res = resList[i]; - // log.info("0CR结果-"+ res.text); - // 后处理:根据替换映射表检查和替换错误识别的字符 - let correctedText = res.text; - for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { - correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); - } - - if (correctedText.includes(targetText)) { - // 如果找到目标文本,直接返回坐标 - return { success: true, x: res.x, y: res.y, width: res.width, height: res.height }; - } - } - } catch (error) { - log.error(`识别文字时发生异常: ${error.message}`); - return { success: false }; - } - } - log.warn("OCR识别超时"); - return { success: false }; -} - -// 定义一个函数用于识别食材 -async function recognizeIngredient(ingredient) { - let recognized = false; - const clickOffset = 30; // 点击坐标偏移 - - // 尝试 OCR 识别 - let ocrResult = await performOcr(ingredient, { min: 210, max: 390 }, { min: 105, max: 920 }, 10); - if (ocrResult.success) { - log.info(`通过 OCR 识别找到食材: ${ingredient}`); - // log.info(`坐标: x=${ocrResult.x}, y=${ocrResult.y}`); - await click(ocrResult.x, ocrResult.y + clickOffset); - await sleep(1000); - recognized = true; - } else { - // OCR 识别失败,尝试图像识别 - let imagePath = `assets/Picture/${ingredientImageMap[ingredient]}`; - if (!imagePath) { - log.warn(`未找到食材 '${ingredient}' 的图片文件`); - return recognized; - } - let imageResult = recognizeImage(imagePath, 120, 90, 95, 865, 1000); - if (imageResult) { - log.info(`通过图像识别找到食材: ${ingredient}`); - // log.debug(`imageResult: ${JSON.stringify(imageResult)}`); - let x = Math.round(imageResult.x); - let y = Math.round(imageResult.y); - await click(x, y);await sleep(1000); - recognized = true; - } else { - log.warn(`未能识别到食材: ${ingredient}`); - } - } - - return recognized; -} - -// 定义一个函数用于识别并点击用户选择的食材 -async function clickSelectedIngredients(selectedIngredients, filePath, npcNames) { - log.info(`加载路径文件: ${filePath}`); - await pathingScript.runFile(filePath); - await sleep(1000); - - // 识别并交互 NPC - const npcxRange = { min: 1190, max: 1320 }; // npc X轴区间 - const FxRange = { min: 1050, max: 1150 }; // F X轴坐标 - const FyRange = { min: 400, max: 800 }; // F Y轴坐标 - let fDialogueRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/F_Dialogue.png"), FxRange.min, FyRange.min, FxRange.max - FxRange.min, FyRange.max - FyRange.min); - const tolerance = 12; // 容错区间 - const npctolerance = 5; // 容错区间 - - // 执行点击操作 - async function performClickOperations(filePath) { - if (filePath === liyueGroceryFilePath || filePath === groceryFilePath || filePath === sumiCityFishPath) { - log.info("执行璃月稻妻杂货商等的点击操作"); - await click(1300, 650); await sleep(500); // 双击增加低帧点击成功率 - await click(1300, 650); await sleep(500); - await click(1300, 650); await sleep(1000); - await click(1320, 780); await sleep(1000); - } else if (filePath === sumiGroceryFilePath) { - log.info("执行须弥杂货商等的点击操作"); - await click(1300, 660); await sleep(1000); - await click(1300, 660); await sleep(1000); - await click(1300, 660); await sleep(1000); - await click(1300, 660); await sleep(1000); - } else if (filePath === natlanGroceryFilePath) { - log.info("执行纳塔杂货商等的点击操作"); - await click(1300, 580); await sleep(1000); - await click(1300, 580); await sleep(1000); - await click(1300, 580); await sleep(1000); - await click(1300, 580); await sleep(1000); - } else if (filePath === nodKraiGroceryFilePath) { - log.info("执行挪德卡莱杂货商等的点击操作"); - await click(1300, 430); await sleep(1000); - await click(1300, 430); await sleep(1000); - await click(1300, 430); await sleep(1000); - } else { - log.info("执行其他路径文件的点击操作"); - await click(1300, 580); await sleep(500); - await click(1300, 580); await sleep(500); - await click(1300, 580); await sleep(1000); - await click(1320, 780); await sleep(1000); - } - } - -// 检查 F 图标和右边水平对齐的文字 -async function checkNpcAndFAlignment(npcName, fDialogueRo) { - let ra = captureGameRegion(); - let fRes = ra.find(fDialogueRo); - ra.dispose(); - if (!fRes.isExist()) { - let f_attempts = null; // 初始化尝试次数 - while (f_attempts < 5) { // 最多尝试 4 次 - f_attempts++; - log.info(`当前尝试次数:${f_attempts}`); - - if (f_attempts <= 3) { - // 第 1-3 次尝试 - await simulateKeyOperations("S", 200); // 后退 200 毫秒 - await sleep(200); - await simulateKeyOperations("W", 400); // 前进 400 毫秒 - await sleep(500); - } else if (f_attempts === 4) { - // 第 4 次尝试 - log.info("重新加载路径文件"); - await pathingScript.runFile(filePath); - await sleep(500); - } else { - // 第 5 次尝试,尝试次数已达上限 - log.warn("尝试次数已达上限"); - break; // 找到后退出循环 - } - - // 检查是否找到 F 图标 - ra = captureGameRegion(); - fRes = ra.find(fDialogueRo); // 重新查找 F 图标 - ra.dispose(); - if (fRes.isExist()) { - log.info("找到 F 图标"); - break; // 找到后退出循环 - } - log.warn(`尝试 ${f_attempts}:寻找 F 图标`); - } - - // 如果尝试次数用完仍未找到 F 图标,返回 false - if (!fRes.isExist()) { - log.warn("经过多次尝试后仍未找到 F 图标"); - return false; - } - } - - // 获取 F 图标的中心点 Y 坐标 - let centerYF = fRes.y + fRes.height / 2; - - // 在 F 图标右侧水平方向上识别 NPC 名称 - let ocrResult = await performOcr(npcName, npcxRange, { min: fRes.y, max: fRes.y + fRes.height }, tolerance); - if (!ocrResult.success) { - log.warn(`OCR 识别未找到 NPC: ${npcName},尝试滚动`); - return false; - } - - // 获取 NPC 名称的中心点 Y 坐标 - let centerYnpcName = ocrResult.y + ocrResult.height / 2; - - // 检查 NPC 名称和 F 图标的中心点 Y 坐标是否在容错范围内 - if (Math.abs(centerYnpcName - centerYF) <= npctolerance) { - return true; - } else { - log.info(`NPC '${npcName}' 和 F 图标未水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); - return false; - } -} - - // 新增变量用于记录滚轮操作次数 - let scrollAttempts = 0; - const maxScrollAttempts = 5; // 最大滚轮操作次数限制 - - for (const npcName of npcNames) { - log.info(`尝试识别 NPC: ${npcName}`); - let isAligned = await checkNpcAndFAlignment(npcName, fDialogueRo); - while (!isAligned && scrollAttempts < maxScrollAttempts) { - // 如果未水平对齐,执行滚轮操作 - await keyMouseScript.runFile(`assets/滚轮下翻.json`); - await sleep(1000); - - // 检查是否超过最大滚轮操作次数 - scrollAttempts++; - if (scrollAttempts >= maxScrollAttempts) { - log.error(`滚轮操作次数已达上限 ${maxScrollAttempts} 次,退出循环`); - break; // 超过最大滚轮操作次数,终止循环 - } - - // 重新检查 F 图标和 NPC 名称是否对齐 - let ra = captureGameRegion(); - let fRes = ra.find(fDialogueRo); - ra.dispose(); - if (!fRes.isExist()) { - log.warn("未找到 F 图标"); - continue; // 如果未找到 F 图标,继续下一次循环 - } - - // 获取 F 图标的中心点 Y 坐标 - let centerYF = fRes.y + fRes.height / 2; - - // 在 F 图标右侧水平方向上识别 NPC 名称 - let ocrResult = await performOcr(npcName, npcxRange, { min: fRes.y, max: fRes.y + fRes.height }, tolerance); - if (!ocrResult.success) { - log.warn(`OCR 识别未找到 NPC: ${npcName}`); - continue; // 如果未找到 NPC 名称,继续下一次循环 - } - - // 获取 NPC 名称的中心点 Y 坐标 - let centerYnpcName = ocrResult.y + ocrResult.height / 2; - - // 检查 NPC 名称和 F 图标的中心点 Y 坐标是否在容错范围内 - if (Math.abs(centerYnpcName - centerYF) <= npctolerance) { - isAligned = true; - log.info(`NPC '${npcName}' 和 F 图标水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); - } else { - log.info(`NPC '${npcName}' 和 F 图标未水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); - } - } - - // 如果水平对齐,执行交互操作 - if (isAligned) { - keyPress("F"); - await sleep(2500); - -// 首次执行点击操作 - await performClickOperations(filePath); - let ComfirmRoResult = null; - let C_maxAttempts = 2; // 最大尝试次数 - let C_attempts = 0; // 当前尝试次数 - - while (!ComfirmRoResult && C_attempts < C_maxAttempts) { - // 调用 recognizeImage 检测 ComfirmRo - ComfirmRoResult = await recognizeImage("assets/Comfirm.png", 1585, 1005, 31, 31, 2000); - - if (ComfirmRoResult) { - log.info("识别到购买按钮,执行食材选择"); - break; // 如果识别到,退出循环 - } else { - log.warn("未识别到购买按钮,尝试重新识别"); - } - - await sleep(500); // 等待一段时间后再次检测 - // 如果未识别到 ComfirmRo,再次执行点击操作 - await performClickOperations(filePath); - - C_attempts++; // 增加尝试次数 - } - - if (!ComfirmRoResult) { - log.warn("未在规定时间内完成对话"); - return; // 退出函数 -} - - // 只有在成功对齐并交互后,才执行后续的食材购买操作 - // 记录已购买的食材 - let purchasedIngredients = new Set(); - - let allIngredientsFound = false; // 标记是否所有食材都已找到 - let scrollAttemptsForIngredients = 0; - const maxScrollAttemptsForIngredients = 3; // 最大翻页次数 - - while (!allIngredientsFound && scrollAttemptsForIngredients < maxScrollAttemptsForIngredients) { - allIngredientsFound = true; // 假设本轮所有食材都已找到,若后续发现未找到则修改为 false - - for (const ingredient of selectedIngredients) { - if (purchasedIngredients.has(ingredient)) { - log.info(`跳过已购买的食材: ${ingredient}`); - continue; // 跳过已购买的食材 - } - // await sleep(1000); - - // 尝试识别食材 - let recognized = await recognizeIngredient(ingredient); - if (recognized) { - log.info(`识别到 '${ingredient}',执行购买操作`); - await purchaseIngredient(ingredient); - purchasedIngredients.add(ingredient); - } else { - // log.error(`未能识别到食材: ${ingredient}`); - allIngredientsFound = false; // 本轮有食材未找到 - } - } - - if (!allIngredientsFound) { - log.info(`在当前页面未找到所有食材,尝试翻页`); - await PageScroll(1); // 每轮翻页滑动1次 - await sleep(1000); - scrollAttemptsForIngredients++; - } - } - - if (!allIngredientsFound) { - log.error(`在所有页面中未找到所有食材,跳过该路径`); - } - - // 最后点击退出按钮 - log.info("点击退出按钮..."); - await click(1845, 45); // 退出 - await sleep(2000); - - // 如果成功购买了所有食材,记录成功信息 - if (allIngredientsFound) { - log.info("该处所需食材已完成购买!"); - } else { - log.error("未能购买所有食材,部分食材可能未找到或未成功购买。"); - } - - return; // 结束函数,后续逻辑不再执行 - } else { - // 如果未水平对齐且超过最大滚轮操作次数,记录错误信息并跳过该 NPC - log.error(`未能找到正确的 NPC '${npcName}' 或未成功交互,跳过该 NPC`); - } - } - - // 如果没有找到任何 NPC 或未成功交互,则记录错误信息并退出 - log.error("未能找到正确的 NPC 或未成功交互,跳过该路径"); -} - -// 自动执行划页操作 -async function PageScroll(scrollCount) { - try { - const clickX = 1200; // 假设点击的起始坐标 - const clickY = 900; - const totalDistance = 500; // 假设每次滑动的总距离 - const stepDistance = 15; // 每步移动的距离 - - for (let i = 0; i < scrollCount; ++i) { - log.info(`开始第 ${i + 1} 次滑动`); - - // 如果点击坐标为 (0, 0),则跳过点击 - if (clickX !== 0 || clickY !== 0) { - moveMouseTo(clickX, clickY); // 移动到指定坐标 - await sleep(100); - } - - // 按住鼠标左键 - leftButtonDown(); - - // 将鼠标移动到目标位置,模拟更自然的拖动操作 - const steps = totalDistance / stepDistance; // 分成若干步移动 - - for (let j = 0; j < steps; j++) { - moveMouseBy(0, -stepDistance); // 每次移动 stepDistance 像素 - await sleep(10); // 每次移动后延迟10毫秒 - } - - // 释放鼠标左键 - await sleep(700); - leftButtonUp(); - await sleep(100); - } - } catch (error) { - log.error(`执行滑动操作时发生错误:${error.message}`); - } -} - -// 主函数 -async function AutoPath() { - log.info("开始执行自动寻路任务"); - - // 加载路径文件和 NPC 名称 - for (let [path, ingredients] of selectedPaths) { - let npcName = npcNames[path]; - await clickSelectedIngredients(ingredients, path, npcName); - } -} - -// 执行主函数 -(async function () { - setGameMetrics(1920, 1080, 1); - await genshin.returnMainUi(); - await AutoPath(); -})(); +// 定义所有食材的图像识别对象 +let FengdaRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FengdaRo.png")); +let SaltRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/SaltRo.png")); +let PepperRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/PepperRo.png")); +let OnionRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/OnionRo.png")); +let MilkRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/MilkRo.png")); +let TomatoRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/TomatoRo.png")); +let SpicesRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/SpicesRo.png")); +let CabbageRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CabbageRo.png")); +let PotatoRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/PotatoRo.png")); +let WheatRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/WheatRo.png")); +let RiceRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/RiceRo.png")); +let TofuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/TofuRo.png")); +let AlmondRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/AlmondRo.png")); +let FishRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FishRo.png")); +let CrabRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CrabRo.png")); +let ShrimpRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/ShrimpRo.png")); +let CoffeeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/CoffeeRo.png")); +let ToutuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/ToutuRo.png")); +let FermentRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/Picture/FermentRo.png")); + +// 定义所有可能的食材,注意料理名字长度可能超过识图范围 +const ingredients = [ + "枫达", "盐", "胡椒", "洋葱", "牛奶", "番茄", "香辛料", "卷心菜", "土豆", "小麦", "稻米", "豆腐", "杏仁", "鱼肉", "螃蟹", "虾仁", "咖啡豆", "秃秃豆", "发酵果实汁", "黑麦" +]; + +// 定义所有食材及其对应的路径文件和 NPC +const mondstadtGroceryFilePath = `assets/Pathing/蒙德百货销售员布兰琪.json`; +const liyueGroceryFilePath = `assets/Pathing/璃月荣发商铺店主东升.json`; +const liyueWanminFilePath = `assets/Pathing/璃月万民堂老板卯师傅.json`; +const groceryFilePath = `assets/Pathing/稻妻九十九物店主葵.json`; +const charcoalFilePath = `assets/Pathing/稻妻志村屋店主志村勘兵卫.json`; +const fengdanGroceryFilePath = `assets/Pathing/枫丹达莫维百货店主布希柯.json`; +const cafeLuzheFilePath = `assets/Pathing/枫丹咖啡厅露泽店主阿鲁埃.json`; +const sumiCitycafeFilePath = `assets/Pathing/须弥城咖啡馆代理店长恩忒卡.json`; +const sumiCityFishPath = `assets/Pathing/须弥城鱼贩珀姆.json`; +const sumiGroceryFilePath = `assets/Pathing/须弥杂货铺哈马维.json`; +const omosPortFishPath = `assets/Pathing/须弥奥摩斯港鱼贩布特罗斯.json`; +const azaleVillMerPath = `assets/Pathing/须弥阿如村商人阿扎莱.json`; +const natlanGroceryFilePath = `assets/Pathing/纳塔杂货铺布纳马.json`; +const nodKraiGroceryFilePath = `assets/Pathing/挪德卡莱杂货铺采若.json`; + +const ingredientPaths = { + "枫达": [fengdanGroceryFilePath, cafeLuzheFilePath], + "盐": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "洋葱": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "牛奶": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "番茄": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "卷心菜": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "土豆": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "小麦": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "胡椒": [mondstadtGroceryFilePath, liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, fengdanGroceryFilePath, natlanGroceryFilePath, nodKraiGroceryFilePath], + "稻米": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath],// + "虾仁": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath, sumiCityFishPath, omosPortFishPath], + "豆腐": [liyueGroceryFilePath, groceryFilePath, sumiGroceryFilePath], + "杏仁": [liyueGroceryFilePath, fengdanGroceryFilePath], + "鱼肉": [liyueWanminFilePath, charcoalFilePath, sumiCityFishPath, omosPortFishPath, azaleVillMerPath], + "螃蟹": [liyueWanminFilePath, charcoalFilePath, sumiCityFishPath, omosPortFishPath], + "秃秃豆": [fengdanGroceryFilePath, azaleVillMerPath, natlanGroceryFilePath], + "咖啡豆": [sumiCitycafeFilePath, cafeLuzheFilePath], + "香辛料": [azaleVillMerPath], + "发酵果实汁": [fengdanGroceryFilePath], + "黑麦": [nodKraiGroceryFilePath], +}; + +// 定义食材名称和图片文件名的映射表 +const ingredientImageMap = { + "枫达": "FengdaRo.png", + "盐": "SaltRo.png", + "洋葱": "OnionRo.png", + "牛奶": "MilkRo.png", + "番茄": "TomatoRo.png", + "卷心菜": "CabbageRo.png", + "土豆": "PotatoRo.png", + "小麦": "WheatRo.png", + "胡椒": "PepperRo.png", + "稻米": "RiceRo.png", + "虾仁": "ShrimpRo.png", + "豆腐": "TofuRo.png", + "杏仁": "AlmondRo.png", + "鱼肉": "FishRo.png", + "螃蟹": "CrabRo.png", + "秃秃豆": "ToutuRo.png", + "咖啡豆": "CoffeeRo.png", + "香辛料": "SpicesRo.png", + "发酵果实汁": "FermentRo.png", + // 可以继续添加更多食材的映射 +}; + +// 定义替换映射表 +const replacementMap = { + "监": "盐", + "卵": "卯" +}; +// 定义所有NPC名,注意名字长度可能超过识图范围 +const npcNames = { + [mondstadtGroceryFilePath]: ["布兰琪"], + [liyueGroceryFilePath]: ["东升"], + [liyueWanminFilePath]: ["卯师傅", "师傅"],// ["卯师傅", "卵师傅"] + [groceryFilePath]: ["葵"], + [charcoalFilePath]: ["志村勘"], + [fengdanGroceryFilePath]: ["布希柯"], + [cafeLuzheFilePath]: ["阿鲁埃"], + [sumiCityFishPath]: ["珀姆"], + [sumiCitycafeFilePath]: ["恩忒卡"], + [omosPortFishPath]: ["布特罗斯"], + [azaleVillMerPath]: ["阿扎莱"], + [sumiGroceryFilePath]: ["哈马维"], + [natlanGroceryFilePath]: ["布纳马"], + [nodKraiGroceryFilePath]: ["采若"], +}; + +// 筛选出用户选择的食材及其对应的路径文件和 NPC +let selectedIngredients = []; // 在函数外部声明一次 +let selectedPaths = new Map(); + +for (let ingredient of ingredients) { + if (settings[ingredient]) { + selectedIngredients.push(ingredient); + ingredientPaths[ingredient].forEach(path => { + if (!selectedPaths.has(path)) { + selectedPaths.set(path, []); + } + selectedPaths.get(path).push(ingredient); + }); + } +} + +if (selectedIngredients.length === 0) { + log.error("未选择任何食材,退出任务"); + throw new Error("未选择任何食材,任务终止"); // 抛出异常以终止任务 +} +// 汇总即将购买的食材信息 +let purchaseSummary = selectedIngredients.join(", "); +log.info(`即将购买: ${purchaseSummary}`); + +// 定义一个函数用于模拟按键操作 +async function simulateKeyOperations(key, duration) { + keyDown(key); + await sleep(duration); + keyUp(key); + await sleep(500); // 释放按键后等待 500 毫秒 +} + +// 定义一个函数用于购买食材 +async function purchaseIngredient(ingredient) { + log.info(`购买食材: ${ingredient}`); + // 在购买前进行识别 + let ComfirmRoResult1 = await recognizeImage("assets/Comfirm.png", 1585, 1005, 31, 31, 2000); + if (ComfirmRoResult1) { + // 模拟购买操作的后续点击 + await click(1600, 1020); + await sleep(1000); // 购买 + } else { + log.warn(`食材: ${ingredient}已售罄或背包已满`); + return; // 退出操作 + } + + // 在点击选择100个之前进行识别 + let ComfirmRoResult2 = await recognizeImage("assets/Comfirm.png", 995, 766, 31, 31, 2000); + if (ComfirmRoResult2) { + log.info("选择100个的"); + await click(1181, 600); + await sleep(200); // 选择100个 + } else { + log.warn("尝试重新点击购买"); + await click(1600, 1020); + await sleep(1000); // 购买 + return; // 退出操作 + } + + await click(1320, 780); + await sleep(1000); // 最终确认 + await click(1320, 780); + await sleep(1000); // 点击空白 +} + + +// 定义一个通用的图像识别函数 +function recognizeImage(templatePath, xMin, yMin, width, height, timeout = 2000) { + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + let template = file.ReadImageMatSync(templatePath); + let recognitionObject = RecognitionObject.TemplateMatch(template, xMin, yMin, width, height); + let ra = captureGameRegion(); + let result = ra.find(recognitionObject); + template.dispose(); + ra.dispose(); + if (result.isExist()) { + return { success: true, x: result.x, y: result.y, width: result.width, height: result.height }; + } + + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + return null; + } + } + log.warn("图像识别超时"); + return null; +} + +// 定义一个函数用于执行OCR识别 +function performOcr(targetText, xRange, yRange, tolerance, timeout = 2000) { + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 调整区域范围以包含容错区间 + let adjustedXMin = xRange.min - tolerance; + let adjustedXMax = xRange.max + tolerance; + let adjustedYMin = yRange.min - tolerance; + let adjustedYMax = yRange.max + tolerance; + + // 在捕获的区域内进行OCR识别 + let ra = captureGameRegion(); + let resList = ra.findMulti(RecognitionObject.ocr( + adjustedXMin, adjustedYMin, + adjustedXMax - adjustedXMin, adjustedYMax - adjustedYMin + )); + ra.dispose(); + + // 遍历识别结果,检查是否找到目标文本 + for (let i = 0; i < resList.count; i++) { + let res = resList[i]; + // log.info("0CR结果-"+ res.text); + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = res.text; + for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); + } + + if (correctedText.includes(targetText)) { + // 如果找到目标文本,直接返回坐标 + return { success: true, x: res.x, y: res.y, width: res.width, height: res.height }; + } + } + } catch (error) { + log.error(`识别文字时发生异常: ${error.message}`); + return { success: false }; + } + } + log.warn("OCR识别超时"); + return { success: false }; +} + +// 定义一个函数用于识别食材 +async function recognizeIngredient(ingredient) { + let recognized = false; + const clickOffset = 30; // 点击坐标偏移 + + // 尝试 OCR 识别 + let ocrResult = await performOcr(ingredient, { min: 210, max: 390 }, { min: 105, max: 920 }, 10); + if (ocrResult.success) { + log.info(`通过 OCR 识别找到食材: ${ingredient}`); + // log.info(`坐标: x=${ocrResult.x}, y=${ocrResult.y}`); + await click(ocrResult.x, ocrResult.y + clickOffset); + await sleep(1000); + recognized = true; + } else { + // OCR 识别失败,尝试图像识别 + let imagePath = `assets/Picture/${ingredientImageMap[ingredient]}`; + if (!imagePath) { + log.warn(`未找到食材 '${ingredient}' 的图片文件`); + return recognized; + } + let imageResult = recognizeImage(imagePath, 120, 90, 95, 865, 1000); + if (imageResult) { + log.info(`通过图像识别找到食材: ${ingredient}`); + // log.debug(`imageResult: ${JSON.stringify(imageResult)}`); + let x = Math.round(imageResult.x); + let y = Math.round(imageResult.y); + await click(x, y);await sleep(1000); + recognized = true; + } else { + log.warn(`未能识别到食材: ${ingredient}`); + } + } + + return recognized; +} + +// 定义一个函数用于识别并点击用户选择的食材 +async function clickSelectedIngredients(selectedIngredients, filePath, npcNames) { + log.info(`加载路径文件: ${filePath}`); + await pathingScript.runFile(filePath); + await sleep(1000); + + // 识别并交互 NPC + const npcxRange = { min: 1190, max: 1320 }; // npc X轴区间 + const FxRange = { min: 1050, max: 1150 }; // F X轴坐标 + const FyRange = { min: 400, max: 800 }; // F Y轴坐标 + let fDialogueRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/F_Dialogue.png"), FxRange.min, FyRange.min, FxRange.max - FxRange.min, FyRange.max - FyRange.min); + const tolerance = 12; // 容错区间 + const npctolerance = 5; // 容错区间 + + // 执行点击操作 + async function performClickOperations(filePath) { + if (filePath === liyueGroceryFilePath || filePath === groceryFilePath || filePath === sumiCityFishPath) { + log.info("执行璃月稻妻杂货商等的点击操作"); + await click(1300, 650); await sleep(500); // 双击增加低帧点击成功率 + await click(1300, 650); await sleep(500); + await click(1300, 650); await sleep(1000); + await click(1320, 780); await sleep(1000); + } else if (filePath === sumiGroceryFilePath) { + log.info("执行须弥杂货商等的点击操作"); + await click(1300, 660); await sleep(1000); + await click(1300, 660); await sleep(1000); + await click(1300, 660); await sleep(1000); + await click(1300, 660); await sleep(1000); + } else if (filePath === natlanGroceryFilePath) { + log.info("执行纳塔杂货商等的点击操作"); + await click(1300, 580); await sleep(1000); + await click(1300, 580); await sleep(1000); + await click(1300, 580); await sleep(1000); + await click(1300, 580); await sleep(1000); + } else if (filePath === nodKraiGroceryFilePath) { + log.info("执行挪德卡莱杂货商等的点击操作"); + await click(1300, 430); await sleep(1000); + await click(1300, 430); await sleep(1000); + await click(1300, 430); await sleep(1000); + } else { + log.info("执行其他路径文件的点击操作"); + await click(1300, 580); await sleep(500); + await click(1300, 580); await sleep(500); + await click(1300, 580); await sleep(1000); + await click(1320, 780); await sleep(1000); + } + } + +// 检查 F 图标和右边水平对齐的文字 +async function checkNpcAndFAlignment(npcName, fDialogueRo) { + let ra = captureGameRegion(); + let fRes = ra.find(fDialogueRo); + ra.dispose(); + if (!fRes.isExist()) { + let f_attempts = null; // 初始化尝试次数 + while (f_attempts < 5) { // 最多尝试 4 次 + f_attempts++; + log.info(`当前尝试次数:${f_attempts}`); + + if (f_attempts <= 3) { + // 第 1-3 次尝试 + await simulateKeyOperations("S", 200); // 后退 200 毫秒 + await sleep(200); + await simulateKeyOperations("W", 400); // 前进 400 毫秒 + await sleep(500); + } else if (f_attempts === 4) { + // 第 4 次尝试 + log.info("重新加载路径文件"); + await pathingScript.runFile(filePath); + await sleep(500); + } else { + // 第 5 次尝试,尝试次数已达上限 + log.warn("尝试次数已达上限"); + break; // 找到后退出循环 + } + + // 检查是否找到 F 图标 + ra = captureGameRegion(); + fRes = ra.find(fDialogueRo); // 重新查找 F 图标 + ra.dispose(); + if (fRes.isExist()) { + log.info("找到 F 图标"); + break; // 找到后退出循环 + } + log.warn(`尝试 ${f_attempts}:寻找 F 图标`); + } + + // 如果尝试次数用完仍未找到 F 图标,返回 false + if (!fRes.isExist()) { + log.warn("经过多次尝试后仍未找到 F 图标"); + return false; + } + } + + // 获取 F 图标的中心点 Y 坐标 + let centerYF = fRes.y + fRes.height / 2; + + // 在 F 图标右侧水平方向上识别 NPC 名称 + let ocrResult = await performOcr(npcName, npcxRange, { min: fRes.y, max: fRes.y + fRes.height }, tolerance); + if (!ocrResult.success) { + log.warn(`OCR 识别未找到 NPC: ${npcName},尝试滚动`); + return false; + } + + // 获取 NPC 名称的中心点 Y 坐标 + let centerYnpcName = ocrResult.y + ocrResult.height / 2; + + // 检查 NPC 名称和 F 图标的中心点 Y 坐标是否在容错范围内 + if (Math.abs(centerYnpcName - centerYF) <= npctolerance) { + return true; + } else { + log.info(`NPC '${npcName}' 和 F 图标未水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); + return false; + } +} + + // 新增变量用于记录滚轮操作次数 + let scrollAttempts = 0; + const maxScrollAttempts = 5; // 最大滚轮操作次数限制 + + for (const npcName of npcNames) { + log.info(`尝试识别 NPC: ${npcName}`); + let isAligned = await checkNpcAndFAlignment(npcName, fDialogueRo); + while (!isAligned && scrollAttempts < maxScrollAttempts) { + // 如果未水平对齐,执行滚轮操作 + await keyMouseScript.runFile(`assets/滚轮下翻.json`); + await sleep(1000); + + // 检查是否超过最大滚轮操作次数 + scrollAttempts++; + if (scrollAttempts >= maxScrollAttempts) { + log.error(`滚轮操作次数已达上限 ${maxScrollAttempts} 次,退出循环`); + break; // 超过最大滚轮操作次数,终止循环 + } + + // 重新检查 F 图标和 NPC 名称是否对齐 + let ra = captureGameRegion(); + let fRes = ra.find(fDialogueRo); + ra.dispose(); + if (!fRes.isExist()) { + log.warn("未找到 F 图标"); + continue; // 如果未找到 F 图标,继续下一次循环 + } + + // 获取 F 图标的中心点 Y 坐标 + let centerYF = fRes.y + fRes.height / 2; + + // 在 F 图标右侧水平方向上识别 NPC 名称 + let ocrResult = await performOcr(npcName, npcxRange, { min: fRes.y, max: fRes.y + fRes.height }, tolerance); + if (!ocrResult.success) { + log.warn(`OCR 识别未找到 NPC: ${npcName}`); + continue; // 如果未找到 NPC 名称,继续下一次循环 + } + + // 获取 NPC 名称的中心点 Y 坐标 + let centerYnpcName = ocrResult.y + ocrResult.height / 2; + + // 检查 NPC 名称和 F 图标的中心点 Y 坐标是否在容错范围内 + if (Math.abs(centerYnpcName - centerYF) <= npctolerance) { + isAligned = true; + log.info(`NPC '${npcName}' 和 F 图标水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); + } else { + log.info(`NPC '${npcName}' 和 F 图标未水平对齐,NPC: ${centerYnpcName}, F 图标: ${centerYF}`); + } + } + + // 如果水平对齐,执行交互操作 + if (isAligned) { + keyPress("F"); + await sleep(2500); + +// 首次执行点击操作 + await performClickOperations(filePath); + let ComfirmRoResult = null; + let C_maxAttempts = 2; // 最大尝试次数 + let C_attempts = 0; // 当前尝试次数 + + while (!ComfirmRoResult && C_attempts < C_maxAttempts) { + // 调用 recognizeImage 检测 ComfirmRo + ComfirmRoResult = await recognizeImage("assets/Comfirm.png", 1585, 1005, 31, 31, 2000); + + if (ComfirmRoResult) { + log.info("识别到购买按钮,执行食材选择"); + break; // 如果识别到,退出循环 + } else { + log.warn("未识别到购买按钮,尝试重新识别"); + } + + await sleep(500); // 等待一段时间后再次检测 + // 如果未识别到 ComfirmRo,再次执行点击操作 + await performClickOperations(filePath); + + C_attempts++; // 增加尝试次数 + } + + if (!ComfirmRoResult) { + log.warn("未在规定时间内完成对话"); + return; // 退出函数 +} + + // 只有在成功对齐并交互后,才执行后续的食材购买操作 + // 记录已购买的食材 + let purchasedIngredients = new Set(); + + let allIngredientsFound = false; // 标记是否所有食材都已找到 + let scrollAttemptsForIngredients = 0; + const maxScrollAttemptsForIngredients = 3; // 最大翻页次数 + + while (!allIngredientsFound && scrollAttemptsForIngredients < maxScrollAttemptsForIngredients) { + allIngredientsFound = true; // 假设本轮所有食材都已找到,若后续发现未找到则修改为 false + + for (const ingredient of selectedIngredients) { + if (purchasedIngredients.has(ingredient)) { + log.info(`跳过已购买的食材: ${ingredient}`); + continue; // 跳过已购买的食材 + } + // await sleep(1000); + + // 尝试识别食材 + let recognized = await recognizeIngredient(ingredient); + if (recognized) { + log.info(`识别到 '${ingredient}',执行购买操作`); + await purchaseIngredient(ingredient); + purchasedIngredients.add(ingredient); + } else { + // log.error(`未能识别到食材: ${ingredient}`); + allIngredientsFound = false; // 本轮有食材未找到 + } + } + + if (!allIngredientsFound) { + log.info(`在当前页面未找到所有食材,尝试翻页`); + await PageScroll(1); // 每轮翻页滑动1次 + await sleep(1000); + scrollAttemptsForIngredients++; + } + } + + if (!allIngredientsFound) { + log.error(`在所有页面中未找到所有食材,跳过该路径`); + } + + // 最后点击退出按钮 + log.info("点击退出按钮..."); + await click(1845, 45); // 退出 + await sleep(2000); + + // 如果成功购买了所有食材,记录成功信息 + if (allIngredientsFound) { + log.info("该处所需食材已完成购买!"); + } else { + log.error("未能购买所有食材,部分食材可能未找到或未成功购买。"); + } + + return; // 结束函数,后续逻辑不再执行 + } else { + // 如果未水平对齐且超过最大滚轮操作次数,记录错误信息并跳过该 NPC + log.error(`未能找到正确的 NPC '${npcName}' 或未成功交互,跳过该 NPC`); + } + } + + // 如果没有找到任何 NPC 或未成功交互,则记录错误信息并退出 + log.error("未能找到正确的 NPC 或未成功交互,跳过该路径"); +} + +// 自动执行划页操作 +async function PageScroll(scrollCount) { + try { + const clickX = 1200; // 假设点击的起始坐标 + const clickY = 900; + const totalDistance = 500; // 假设每次滑动的总距离 + const stepDistance = 15; // 每步移动的距离 + + for (let i = 0; i < scrollCount; ++i) { + log.info(`开始第 ${i + 1} 次滑动`); + + // 如果点击坐标为 (0, 0),则跳过点击 + if (clickX !== 0 || clickY !== 0) { + moveMouseTo(clickX, clickY); // 移动到指定坐标 + await sleep(100); + } + + // 按住鼠标左键 + leftButtonDown(); + + // 将鼠标移动到目标位置,模拟更自然的拖动操作 + const steps = totalDistance / stepDistance; // 分成若干步移动 + + for (let j = 0; j < steps; j++) { + moveMouseBy(0, -stepDistance); // 每次移动 stepDistance 像素 + await sleep(10); // 每次移动后延迟10毫秒 + } + + // 释放鼠标左键 + await sleep(700); + leftButtonUp(); + await sleep(100); + } + } catch (error) { + log.error(`执行滑动操作时发生错误:${error.message}`); + } +} + +// 主函数 +async function AutoPath() { + log.info("开始执行自动寻路任务"); + + // 加载路径文件和 NPC 名称 + for (let [path, ingredients] of selectedPaths) { + let npcName = npcNames[path]; + await clickSelectedIngredients(ingredients, path, npcName); + } +} + +// 执行主函数 +(async function () { + setGameMetrics(1920, 1080, 1); + await genshin.returnMainUi(); + await AutoPath(); +})(); diff --git a/repo/js/OCR购买食材/manifest.json b/archive/js/OCR购买食材/manifest.json similarity index 100% rename from repo/js/OCR购买食材/manifest.json rename to archive/js/OCR购买食材/manifest.json diff --git a/repo/js/OCR购买食材/settings.json b/archive/js/OCR购买食材/settings.json similarity index 100% rename from repo/js/OCR购买食材/settings.json rename to archive/js/OCR购买食材/settings.json diff --git a/repo/js/ParametricTrans/README.md b/archive/js/ParametricTrans/README.md similarity index 96% rename from repo/js/ParametricTrans/README.md rename to archive/js/ParametricTrans/README.md index 523f340de..c0d0916eb 100644 --- a/repo/js/ParametricTrans/README.md +++ b/archive/js/ParametricTrans/README.md @@ -1,66 +1,66 @@ -# 参量质变仪使用说明 - -## 一、使用前准备 - -- **设置队伍**:使用前请在配置中设置要切换的队伍(必填),否则脚本会自动结束任务。 - -## 二、脚本使用 - -- **芭芭拉充能**:脚本使用芭芭拉的攻击动作充能参量质变仪,请确保切换的队伍4号位为芭芭拉。 - -## 三、自定义放入材料 - -1. **截图保存**:自行截图所需图片,保存在“`\assets`”目录下。(建议在1080P下进行截图,推荐PNG或BMP格式)。 - -2. **默认材料**:默认参量质变仪选取物料为“薄荷”。 - -3. **自定义材料选择**:在“材料”选项中,如自定义材料,请在配置“选填,质变的材料在哪一类物品中(默认材料)”中选择所在类目。 - -4. **常用材料**:“`\assets`”目录下已截图了一些常用的材料,将对应图地址配置到设置中即可。 - -5. **新材料地址**:在配置中填入新的材料图片地址,例如:`assets/niujiao.png`。 - -## 四、调度与执行 - -- **建议**:建议直接加入每日执行的调度器,如果参量质变仪在冷却中(CD),脚本会自动结束任务。 - -## 五、后言 - -1. **测试阶段反馈**:目前处于测试阶段,如有错误,请通过QQ:119996800联系反馈。 - -2. **API封装**:官方刚释放了图片和文字识别的API,一些用法还在学习中,已在此基础上进行了封装,方便后续复用。 - -## 六、更新说明 - -### v.1.6 20251223 - -- 新增传送至安全点功能 - -### v.1.5 20251021 - -- 新增过期物品处理。 - -### v.1.4 20250727 - -- 优化当输入队伍名为空时的错误处理(设置过一次队伍再删除会判断为空而非未定义,之前没有触发错误提示)。 -- 当质变仪在已经放入材料后,重新运行仍然尝试进行芭芭拉攻击流程。 - -### v.1.3 20250629 - -- 更改下来滚动条方式,防止鼠标超出边界。 -- 规范化脚本名称,添加README.md文件。 - -### v.1.2 20250512 - -- 更改UID识别方法,适配原神UI改变。 - -### v.1.1 20250426 - -- 修改下拉菜单次数,适配4K分辨率。 - - - - - - - +# 参量质变仪使用说明 + +## 一、使用前准备 + +- **设置队伍**:使用前请在配置中设置要切换的队伍(必填),否则脚本会自动结束任务。 + +## 二、脚本使用 + +- **芭芭拉充能**:脚本使用芭芭拉的攻击动作充能参量质变仪,请确保切换的队伍4号位为芭芭拉。 + +## 三、自定义放入材料 + +1. **截图保存**:自行截图所需图片,保存在“`\assets`”目录下。(建议在1080P下进行截图,推荐PNG或BMP格式)。 + +2. **默认材料**:默认参量质变仪选取物料为“薄荷”。 + +3. **自定义材料选择**:在“材料”选项中,如自定义材料,请在配置“选填,质变的材料在哪一类物品中(默认材料)”中选择所在类目。 + +4. **常用材料**:“`\assets`”目录下已截图了一些常用的材料,将对应图地址配置到设置中即可。 + +5. **新材料地址**:在配置中填入新的材料图片地址,例如:`assets/niujiao.png`。 + +## 四、调度与执行 + +- **建议**:建议直接加入每日执行的调度器,如果参量质变仪在冷却中(CD),脚本会自动结束任务。 + +## 五、后言 + +1. **测试阶段反馈**:目前处于测试阶段,如有错误,请通过QQ:119996800联系反馈。 + +2. **API封装**:官方刚释放了图片和文字识别的API,一些用法还在学习中,已在此基础上进行了封装,方便后续复用。 + +## 六、更新说明 + +### v.1.6 20251223 + +- 新增传送至安全点功能 + +### v.1.5 20251021 + +- 新增过期物品处理。 + +### v.1.4 20250727 + +- 优化当输入队伍名为空时的错误处理(设置过一次队伍再删除会判断为空而非未定义,之前没有触发错误提示)。 +- 当质变仪在已经放入材料后,重新运行仍然尝试进行芭芭拉攻击流程。 + +### v.1.3 20250629 + +- 更改下来滚动条方式,防止鼠标超出边界。 +- 规范化脚本名称,添加README.md文件。 + +### v.1.2 20250512 + +- 更改UID识别方法,适配原神UI改变。 + +### v.1.1 20250426 + +- 修改下拉菜单次数,适配4K分辨率。 + + + + + + + diff --git a/repo/js/ParametricTrans/assets/ConfirmButton.png b/archive/js/ParametricTrans/assets/ConfirmButton.png similarity index 100% rename from repo/js/ParametricTrans/assets/ConfirmButton.png rename to archive/js/ParametricTrans/assets/ConfirmButton.png diff --git a/repo/js/ParametricTrans/assets/baikuan.png b/archive/js/ParametricTrans/assets/baikuan.png similarity index 100% rename from repo/js/ParametricTrans/assets/baikuan.png rename to archive/js/ParametricTrans/assets/baikuan.png diff --git a/repo/js/ParametricTrans/assets/bh.png b/archive/js/ParametricTrans/assets/bh.png similarity index 100% rename from repo/js/ParametricTrans/assets/bh.png rename to archive/js/ParametricTrans/assets/bh.png diff --git a/repo/js/ParametricTrans/assets/cai.png b/archive/js/ParametricTrans/assets/cai.png similarity index 100% rename from repo/js/ParametricTrans/assets/cai.png rename to archive/js/ParametricTrans/assets/cai.png diff --git a/repo/js/ParametricTrans/assets/cha.png b/archive/js/ParametricTrans/assets/cha.png similarity index 100% rename from repo/js/ParametricTrans/assets/cha.png rename to archive/js/ParametricTrans/assets/cha.png diff --git a/repo/js/ParametricTrans/assets/cl.png b/archive/js/ParametricTrans/assets/cl.png similarity index 100% rename from repo/js/ParametricTrans/assets/cl.png rename to archive/js/ParametricTrans/assets/cl.png diff --git a/repo/js/ParametricTrans/assets/jit.png b/archive/js/ParametricTrans/assets/jit.png similarity index 100% rename from repo/js/ParametricTrans/assets/jit.png rename to archive/js/ParametricTrans/assets/jit.png diff --git a/repo/js/ParametricTrans/assets/jx.png b/archive/js/ParametricTrans/assets/jx.png similarity index 100% rename from repo/js/ParametricTrans/assets/jx.png rename to archive/js/ParametricTrans/assets/jx.png diff --git a/repo/js/ParametricTrans/assets/mg.png b/archive/js/ParametricTrans/assets/mg.png similarity index 100% rename from repo/js/ParametricTrans/assets/mg.png rename to archive/js/ParametricTrans/assets/mg.png diff --git a/repo/js/ParametricTrans/assets/nd.png b/archive/js/ParametricTrans/assets/nd.png similarity index 100% rename from repo/js/ParametricTrans/assets/nd.png rename to archive/js/ParametricTrans/assets/nd.png diff --git a/repo/js/ParametricTrans/assets/nj1.png b/archive/js/ParametricTrans/assets/nj1.png similarity index 100% rename from repo/js/ParametricTrans/assets/nj1.png rename to archive/js/ParametricTrans/assets/nj1.png diff --git a/repo/js/ParametricTrans/assets/nj2.png b/archive/js/ParametricTrans/assets/nj2.png similarity index 100% rename from repo/js/ParametricTrans/assets/nj2.png rename to archive/js/ParametricTrans/assets/nj2.png diff --git a/repo/js/ParametricTrans/assets/nj3.png b/archive/js/ParametricTrans/assets/nj3.png similarity index 100% rename from repo/js/ParametricTrans/assets/nj3.png rename to archive/js/ParametricTrans/assets/nj3.png diff --git a/repo/js/ParametricTrans/assets/qr.png b/archive/js/ParametricTrans/assets/qr.png similarity index 100% rename from repo/js/ParametricTrans/assets/qr.png rename to archive/js/ParametricTrans/assets/qr.png diff --git a/repo/js/ParametricTrans/assets/shuijink.png b/archive/js/ParametricTrans/assets/shuijink.png similarity index 100% rename from repo/js/ParametricTrans/assets/shuijink.png rename to archive/js/ParametricTrans/assets/shuijink.png diff --git a/repo/js/ParametricTrans/assets/tth.png b/archive/js/ParametricTrans/assets/tth.png similarity index 100% rename from repo/js/ParametricTrans/assets/tth.png rename to archive/js/ParametricTrans/assets/tth.png diff --git a/repo/js/ParametricTrans/assets/zhibian.png b/archive/js/ParametricTrans/assets/zhibian.png similarity index 100% rename from repo/js/ParametricTrans/assets/zhibian.png rename to archive/js/ParametricTrans/assets/zhibian.png diff --git a/repo/js/ParametricTrans/main.js b/archive/js/ParametricTrans/main.js similarity index 98% rename from repo/js/ParametricTrans/main.js rename to archive/js/ParametricTrans/main.js index 5ea2b85ea..250aab530 100644 --- a/repo/js/ParametricTrans/main.js +++ b/archive/js/ParametricTrans/main.js @@ -1,290 +1,290 @@ -(async function () { - - //初始化配置====================================================================================== - const version ="v 1.6"; - var MATERIAL = typeof settings.MATERIAL === 'string' && settings.MATERIAL.trim() !== '' ? settings.MATERIAL : "assets/bh.png"; - var ZHIBIANYI = typeof settings.ZHIBIANY === 'string' && settings.ZHIBIANYI.trim() !== '' ? settings.ZHIBIANYI : "assets/zhibian.png"; - var actiontime = settings.actiontime != undefined && ~~settings.actiontime > 0 ? ~~settings.actiontime : 50; - var CHA = "assets/cha.png" - var outTimeStuff = "assets/ConfirmButton.png" - var TEAM - const ITEM = settings.ITEM !== undefined ? ( - settings.ITEM === "1养成道具" ? 1 : - settings.ITEM === "2食物" ? 2 : - settings.ITEM === "3材料" ? 3 : - 3 ) : 3; // 如果settings.ITEM完全未定义,也赋予ITEM为3 - const toSafePoint= settings.toSafePoint ? settings.toSafePoint : false; - const safePointName= settings.safePointName ? settings.safePointName : "枫丹"; - //获取安全点 - const safePointMap=new Map([ - ["蒙德",{x:-867,y:2281}], - ["璃月",{x:267,y:-665}], - ["稻妻",{x:-4402,y:-3052}], - ["须弥",{x:2787,y:-503}], - ["枫丹",{x:4508,y:3630}], - ["纳塔",{x:9060,y:-1847}], - ["挪德卡莱",{x:9458,y:1660}], - ]); - /** - * 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑) - * @param text 要识别的文字,默认为"空参数" - * @param timeout 超时时间,单位为秒,默认为10秒 - * @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0 - * @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0 - * @param x OCR识别区域的起始X坐标,默认为0 - * @param y OCR识别区域的起始Y坐标,默认为0 - * @param w OCR识别区域的宽度,默认为1920 - * @param h OCR识别区域的高度,默认为1080 - * @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果 - */ - async function textOCR(text="空参数",timeout=10,afterBehavior=0,debugmodel=0,x=0,y=0,w=1920,h=1080) { - const startTime = new Date(); - var Outcheak = 0 - for (var ii = 0; ii < 10; ii++) - { - // 获取一张截图 - var captureRegion = captureGameRegion(); - var res1 - var res2 - var conuntcottimecot=1; - var conuntcottimecomp=1; - // 对整个区域进行 OCR - var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); - captureRegion.dispose(); - //log.info("OCR 全区域识别结果数量 {len}", resList.count); - if (resList.count !== 0) { - for (let i = 0; i < resList.count; i++) - { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length - let res = resList[i]; - res1=res.text - conuntcottimecomp++; - if (res.text.includes(text) && debugmodel !==2 ) { - conuntcottimecot ++; - log.info(`“${res1}”找到`); - if (debugmodel===1 & x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{log.info("文本OCR完成'{text}'", res.text);} - if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & x===0 & y===0){log.info("点击模式:关")}} - if (afterBehavior===2){log.info("F模式:开");await sleep(100);keyPress("F");}else{if (debugmodel===1 & x===0 & y===0){log.info("F模式:关");}} - if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};} - } - if (debugmodel ===2 ){ - if (res1 === res2){conuntcottimecot ++;res2=res1;} - log.info("输出模式:全图代码位置:({x},{y},{h},{w},{string})", res.x-10, res.y-10, res.width+10, res.Height+10, res.text); - if (Outcheak===1){ if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}} - }}}else{ if (debugmodel===3 && (ii % 2) === 1){await keyPress("W");}} - const NowTime = new Date(); - if ((NowTime - startTime)>timeout*1000){if (debugmodel===2){ if (resList.count === 0){return result = {found: false};} else{Outcheak=1;ii=2;} } else {Outcheak=0;if (debugmodel===1 & x===0 & y===0){log.info(`${timeout}秒超时退出,"${text}"未找到`)};return result = {found: false };}} - else{ii=2;if (debugmodel===1 & x===0 & y===0){log.info(`"${text}"识别中……`); } } - await sleep(100); - } - } - - /** - * 封装函数,执行图片识别及点击操作(测试中,未封装完成,后续会优化逻辑) - * - * @param filePath 图片路径,默认为"空参数" - * @param timeout 超时时间,单位为秒,默认为10秒 - * @param afterBehavior 点击模式,0为关闭点击,1为开启点击,2为开启F键点击,默认为0 - * @param debugmodel 调试代码模式,0为关闭调试模式,1为开启调试模式,默认为0 - * @param xa 识别区域的x轴偏移量,默认为0 - * @param ya 识别区域的y轴偏移量,默认为0 - * @param wa 识别区域的宽度,默认为1920 - * @param ha 识别区域的高度,默认为1080 - * @returns 返回识别结果,包括图片的x轴坐标、y轴坐标、宽度、高度及是否找到图片 - */ - async function imageRecognition(filePath="空参数",timeout=10,afterBehavior=0,debugmodel=0,xa=0,ya=0,wa=1920,ha=1080) { - const startTime = new Date(); - const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath)); - for (let ii = 0; ii < 10; ii++) { - captureRegion = captureGameRegion(); // 获取一张截图 - let dc = captureRegion.DeriveCrop(xa, ya, wa, ha); - let res = dc.Find(Imagidentify); - captureRegion.dispose(); - dc.dispose(); - if (res.isEmpty()) { - if (debugmodel===1 & xa===0 & ya===0){log.info("识别图片中")}; - } else { - if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} - if (afterBehavior===2){log.info("F模式:开");await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} - if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{ log.info("识别到图片");} - return result = { x: res.x, y: res.y, w:res.width,h:res.Height,found: true } - } - const NowTime = new Date(); - if ((NowTime - startTime)>timeout*1000){if (debugmodel===1 & xa===0 & ya===0){log.info(`${timeout}秒超时退出,未找到图片`);}return result = {found: false };}else{ii=8} - await sleep(200); - } - await sleep(1200); - } - -/**====================================================================================== - * 执行质变仪的部署动作,未找到质变仪时返回false结束,找到质变仪时返回true - */ -async function deployTransformer(){ - - await sleep(500); - await keyPress("B"); - await sleep(1000); - - let outTime = await imageRecognition(outTimeStuff,0.5,1,0,760, 700, 100, 100); - if (outTime.found){ - log.info("过期物品处理完成,继续执行"); - await sleep(1000); - } - - await click(1067,57);//点开背包,可做图像识别优化 - - await textOCR("小道具",3,0,0,126,17,99,53);if (!result.found){throw new Error("未打开'小道具'页面");}//确认在小道具界面 - await sleep(500); - await imageRecognition(ZHIBIANYI,1,1,0);//识别质变仪图片 - if (!result.found){await genshin.returnMainUi();throw new Error("'质变仪CD中'或'未找到质变仪!'");}//没找到质变仪退出流程 - else{await sleep(1000);await click(1699,1004);await sleep(1000);await genshin.returnMainUi();return true} //点击部署操作 - -} - - -/**====================================================================================== - * 游戏内“参量质变仪”的放入材料交互流程 - */ -async function insertMaterial(){ - - //检测并进入质变仪界面 - await middleButtonClick(); - await sleep(500); - let Fmeun = await textOCR("参量质变仪",2,2,3,1205,508,140,53);//单条F检测 - await keyPress("F"); - let CHAx = await imageRecognition(CHA,3,0,0,1766,3,140,90); - if (!Fmeun.found && !CHAx.found){return false;} - - //检测是否到达材料页面 - await textOCR("进行质变",3,0,0,1675,994,150,50);if (!result.found){throw new Error("质变仪页面未打开");}//单条F检测 - await sleep(500); - switch (ITEM) { - case 1: - await click(863,47); // 初始化与'1养成道具'相关的设置或资源 - await textOCR("养成道具",3,0,0,120,19,240,50);if (!result.found){throw new Error("'养成道具'页面未打开");} - break; - case 2: - await click(959,45);// 初始化与'2食物'相关的设置或资源 - await textOCR("食物",3,0,0,124,16,93,63);if (!result.found){throw new Error("'食物'页面未打开");} - break; - case 3: - await click(1050,50); // 初始化与'3材料'相关的设置或资源 - await textOCR("材料",3,0,0,124,16,93,63);if (!result.found){throw new Error("'材料'页面未打开");} - break; - default: - // 处理未知ITEM值的情况 - break; - } - - //滚轮预操作 - await moveMouseTo(1287,131); - await sleep(100); - await leftButtonDown(); - await sleep(100); - await moveMouseTo(1287,161); - // 质变材料图片检测 - let YOffset = 0; // Y轴偏移量,根据需要调整 - const maxRetries = 20; // 最大重试次数 - let retries = 0; // 当前重试次数 - while (retries < maxRetries) { - await imageRecognition(MATERIAL, 1, 0, 0); - if (result.found) { - await leftButtonUp(); - await sleep(500); - await click(result.x,result.y); - await sleep(1000); - await click(440,1008); //选择最大数量 - await sleep(1000); - await click(1792,1019); //质变按钮 - await textOCR("参量质变仪",3,0,0,828,253,265,73);if (!result.found){throw new Error("单种材料不足,退出!");} - await sleep(1000); - await click(1183,764); //确认 ; - await sleep(1000); - await genshin.returnMainUi(); - return true - } - retries++; // 重试次数加1 - //滚轮操作 - YOffset += 50; - await sleep(500); - if (retries === maxRetries || 161+YOffset > 1080) { - await leftButtonUp(); - await sleep(100); - await moveMouseTo(1287,131); - await genshin.returnMainUi(); - throw new Error("未找到材料(默认薄荷,自定义请看'注意使用事项.txt')!"); - } - await moveMouseTo(1287,161+YOffset); - await sleep(300); - } -} - - -/**====================================================================================== - * 执行芭芭拉攻击指令,并等待质变仪完成提示出现。 若超时则强制结束流程。 - */ -async function executeAttack(){ - - await genshin.SwitchParty(TEAM); //切换到指定队伍,必须进行配置,4号位放芭芭拉 - await sleep(1000); - await keyPress("4"); - await sleep(1200); - await middleButtonClick(); - await sleep(1000); - log.info(`攻击动作开始,${actiontime}秒后超时退出!一般20秒左右完成!`) - - var startTime = new Date(); - await sleep(500); - var NowTime = new Date(); - //芭芭拉攻击指令,等待质变仪完成提示出现,若超时则强制结束流程。 - while ((NowTime - startTime) 0 ? ~~settings.actiontime : 50; + var CHA = "assets/cha.png" + var outTimeStuff = "assets/ConfirmButton.png" + var TEAM + const ITEM = settings.ITEM !== undefined ? ( + settings.ITEM === "1养成道具" ? 1 : + settings.ITEM === "2食物" ? 2 : + settings.ITEM === "3材料" ? 3 : + 3 ) : 3; // 如果settings.ITEM完全未定义,也赋予ITEM为3 + const toSafePoint= settings.toSafePoint ? settings.toSafePoint : false; + const safePointName= settings.safePointName ? settings.safePointName : "枫丹"; + //获取安全点 + const safePointMap=new Map([ + ["蒙德",{x:-867,y:2281}], + ["璃月",{x:267,y:-665}], + ["稻妻",{x:-4402,y:-3052}], + ["须弥",{x:2787,y:-503}], + ["枫丹",{x:4508,y:3630}], + ["纳塔",{x:9060,y:-1847}], + ["挪德卡莱",{x:9458,y:1660}], + ]); + /** + * 文字OCR识别封装函数(测试中,未封装完成,后续会优化逻辑) + * @param text 要识别的文字,默认为"空参数" + * @param timeout 超时时间,单位为秒,默认为10秒 + * @param afterBehavior 点击模式,0表示不点击,1表示点击识别到文字的位置,2表示输出模式,默认为0 + * @param debugmodel 调试代码,0表示输入判断模式,1表示输出位置信息,2表示输出判断模式,默认为0 + * @param x OCR识别区域的起始X坐标,默认为0 + * @param y OCR识别区域的起始Y坐标,默认为0 + * @param w OCR识别区域的宽度,默认为1920 + * @param h OCR识别区域的高度,默认为1080 + * @returns 包含识别结果的对象,包括识别的文字、坐标和是否找到的结果 + */ + async function textOCR(text="空参数",timeout=10,afterBehavior=0,debugmodel=0,x=0,y=0,w=1920,h=1080) { + const startTime = new Date(); + var Outcheak = 0 + for (var ii = 0; ii < 10; ii++) + { + // 获取一张截图 + var captureRegion = captureGameRegion(); + var res1 + var res2 + var conuntcottimecot=1; + var conuntcottimecomp=1; + // 对整个区域进行 OCR + var resList = captureRegion.findMulti(RecognitionObject.ocr(x,y,w,h)); + captureRegion.dispose(); + //log.info("OCR 全区域识别结果数量 {len}", resList.count); + if (resList.count !== 0) { + for (let i = 0; i < resList.count; i++) + { // 遍历的是 C# 的 List 对象,所以要用 count,而不是 length + let res = resList[i]; + res1=res.text + conuntcottimecomp++; + if (res.text.includes(text) && debugmodel !==2 ) { + conuntcottimecot ++; + log.info(`“${res1}”找到`); + if (debugmodel===1 & x===0 & y===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{log.info("文本OCR完成'{text}'", res.text);} + if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & x===0 & y===0){log.info("点击模式:关")}} + if (afterBehavior===2){log.info("F模式:开");await sleep(100);keyPress("F");}else{if (debugmodel===1 & x===0 & y===0){log.info("F模式:关");}} + if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};} + } + if (debugmodel ===2 ){ + if (res1 === res2){conuntcottimecot ++;res2=res1;} + log.info("输出模式:全图代码位置:({x},{y},{h},{w},{string})", res.x-10, res.y-10, res.width+10, res.Height+10, res.text); + if (Outcheak===1){ if (conuntcottimecot>=conuntcottimecomp/2){return result = { text: res.text, x: res.x, y: res.y, found: true };}else{return result = { found: false};}} + }}}else{ if (debugmodel===3 && (ii % 2) === 1){await keyPress("W");}} + const NowTime = new Date(); + if ((NowTime - startTime)>timeout*1000){if (debugmodel===2){ if (resList.count === 0){return result = {found: false};} else{Outcheak=1;ii=2;} } else {Outcheak=0;if (debugmodel===1 & x===0 & y===0){log.info(`${timeout}秒超时退出,"${text}"未找到`)};return result = {found: false };}} + else{ii=2;if (debugmodel===1 & x===0 & y===0){log.info(`"${text}"识别中……`); } } + await sleep(100); + } + } + + /** + * 封装函数,执行图片识别及点击操作(测试中,未封装完成,后续会优化逻辑) + * + * @param filePath 图片路径,默认为"空参数" + * @param timeout 超时时间,单位为秒,默认为10秒 + * @param afterBehavior 点击模式,0为关闭点击,1为开启点击,2为开启F键点击,默认为0 + * @param debugmodel 调试代码模式,0为关闭调试模式,1为开启调试模式,默认为0 + * @param xa 识别区域的x轴偏移量,默认为0 + * @param ya 识别区域的y轴偏移量,默认为0 + * @param wa 识别区域的宽度,默认为1920 + * @param ha 识别区域的高度,默认为1080 + * @returns 返回识别结果,包括图片的x轴坐标、y轴坐标、宽度、高度及是否找到图片 + */ + async function imageRecognition(filePath="空参数",timeout=10,afterBehavior=0,debugmodel=0,xa=0,ya=0,wa=1920,ha=1080) { + const startTime = new Date(); + const Imagidentify = RecognitionObject.TemplateMatch(file.ReadImageMatSync(filePath)); + for (let ii = 0; ii < 10; ii++) { + captureRegion = captureGameRegion(); // 获取一张截图 + let dc = captureRegion.DeriveCrop(xa, ya, wa, ha); + let res = dc.Find(Imagidentify); + captureRegion.dispose(); + dc.dispose(); + if (res.isEmpty()) { + if (debugmodel===1 & xa===0 & ya===0){log.info("识别图片中")}; + } else { + if (afterBehavior===1){log.info("点击模式:开");await sleep(1000);click(res.x, res.y);}else{if (debugmodel===1 & xa===0 & ya===0){log.info("点击模式:关")}} + if (afterBehavior===2){log.info("F模式:开");await sleep(1000);keyPress("F");}else{if (debugmodel===1 & xa===0 & ya===0){log.info("F模式:关")}} + if (debugmodel===1 & xa===0 & ya===0){log.info("全图代码位置:({x},{y},{h},{w})", res.x-10, res.y-10, res.width+10, res.Height+10);}else{ log.info("识别到图片");} + return result = { x: res.x, y: res.y, w:res.width,h:res.Height,found: true } + } + const NowTime = new Date(); + if ((NowTime - startTime)>timeout*1000){if (debugmodel===1 & xa===0 & ya===0){log.info(`${timeout}秒超时退出,未找到图片`);}return result = {found: false };}else{ii=8} + await sleep(200); + } + await sleep(1200); + } + +/**====================================================================================== + * 执行质变仪的部署动作,未找到质变仪时返回false结束,找到质变仪时返回true + */ +async function deployTransformer(){ + + await sleep(500); + await keyPress("B"); + await sleep(1000); + + let outTime = await imageRecognition(outTimeStuff,0.5,1,0,760, 700, 100, 100); + if (outTime.found){ + log.info("过期物品处理完成,继续执行"); + await sleep(1000); + } + + await click(1067,57);//点开背包,可做图像识别优化 + + await textOCR("小道具",3,0,0,126,17,99,53);if (!result.found){throw new Error("未打开'小道具'页面");}//确认在小道具界面 + await sleep(500); + await imageRecognition(ZHIBIANYI,1,1,0);//识别质变仪图片 + if (!result.found){await genshin.returnMainUi();throw new Error("'质变仪CD中'或'未找到质变仪!'");}//没找到质变仪退出流程 + else{await sleep(1000);await click(1699,1004);await sleep(1000);await genshin.returnMainUi();return true} //点击部署操作 + +} + + +/**====================================================================================== + * 游戏内“参量质变仪”的放入材料交互流程 + */ +async function insertMaterial(){ + + //检测并进入质变仪界面 + await middleButtonClick(); + await sleep(500); + let Fmeun = await textOCR("参量质变仪",2,2,3,1205,508,140,53);//单条F检测 + await keyPress("F"); + let CHAx = await imageRecognition(CHA,3,0,0,1766,3,140,90); + if (!Fmeun.found && !CHAx.found){return false;} + + //检测是否到达材料页面 + await textOCR("进行质变",3,0,0,1675,994,150,50);if (!result.found){throw new Error("质变仪页面未打开");}//单条F检测 + await sleep(500); + switch (ITEM) { + case 1: + await click(863,47); // 初始化与'1养成道具'相关的设置或资源 + await textOCR("养成道具",3,0,0,120,19,240,50);if (!result.found){throw new Error("'养成道具'页面未打开");} + break; + case 2: + await click(959,45);// 初始化与'2食物'相关的设置或资源 + await textOCR("食物",3,0,0,124,16,93,63);if (!result.found){throw new Error("'食物'页面未打开");} + break; + case 3: + await click(1050,50); // 初始化与'3材料'相关的设置或资源 + await textOCR("材料",3,0,0,124,16,93,63);if (!result.found){throw new Error("'材料'页面未打开");} + break; + default: + // 处理未知ITEM值的情况 + break; + } + + //滚轮预操作 + await moveMouseTo(1287,131); + await sleep(100); + await leftButtonDown(); + await sleep(100); + await moveMouseTo(1287,161); + // 质变材料图片检测 + let YOffset = 0; // Y轴偏移量,根据需要调整 + const maxRetries = 20; // 最大重试次数 + let retries = 0; // 当前重试次数 + while (retries < maxRetries) { + await imageRecognition(MATERIAL, 1, 0, 0); + if (result.found) { + await leftButtonUp(); + await sleep(500); + await click(result.x,result.y); + await sleep(1000); + await click(440,1008); //选择最大数量 + await sleep(1000); + await click(1792,1019); //质变按钮 + await textOCR("参量质变仪",3,0,0,828,253,265,73);if (!result.found){throw new Error("单种材料不足,退出!");} + await sleep(1000); + await click(1183,764); //确认 ; + await sleep(1000); + await genshin.returnMainUi(); + return true + } + retries++; // 重试次数加1 + //滚轮操作 + YOffset += 50; + await sleep(500); + if (retries === maxRetries || 161+YOffset > 1080) { + await leftButtonUp(); + await sleep(100); + await moveMouseTo(1287,131); + await genshin.returnMainUi(); + throw new Error("未找到材料(默认薄荷,自定义请看'注意使用事项.txt')!"); + } + await moveMouseTo(1287,161+YOffset); + await sleep(300); + } +} + + +/**====================================================================================== + * 执行芭芭拉攻击指令,并等待质变仪完成提示出现。 若超时则强制结束流程。 + */ +async function executeAttack(){ + + await genshin.SwitchParty(TEAM); //切换到指定队伍,必须进行配置,4号位放芭芭拉 + await sleep(1000); + await keyPress("4"); + await sleep(1200); + await middleButtonClick(); + await sleep(1000); + log.info(`攻击动作开始,${actiontime}秒后超时退出!一般20秒左右完成!`) + + var startTime = new Date(); + await sleep(500); + var NowTime = new Date(); + //芭芭拉攻击指令,等待质变仪完成提示出现,若超时则强制结束流程。 + while ((NowTime - startTime)