Skip to content

Commit 574223d

Browse files
authored
Merge pull request #166 from Luoya-any/feature/auto-exploration-map-selection
增添自动探险地图选择功能
2 parents 60e3034 + 3892785 commit 574223d

1 file changed

Lines changed: 174 additions & 94 deletions

File tree

src/tasks/fullauto/AutoExploration_Fast.py

Lines changed: 174 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@
1414
DEFAULT_ACTION_TIMEOUT = 10
1515

1616

17+
class MapDetectionError(Exception):
18+
"""地图识别错误异常"""
19+
pass
20+
21+
1722
class AutoExploration_Fast(DNAOneTimeTask, CommissionsTask, BaseCombatTask):
1823
"""全自动探险/无尽,感谢群友的行动逻辑"""
1924
def __init__(self, *args, **kwargs):
@@ -27,134 +32,209 @@ def __init__(self, *args, **kwargs):
2732
'轮次': 3,
2833
'超时时间': 120,
2934
'解密失败自动重开': True,
35+
'地图选择': '全部地图',
3036
})
3137
self.config_description.update({
3238
'轮次': '打几个轮次',
3339
'超时时间': '超时后将发出提示',
3440
'解密失败自动重开': '不重开时会发出声音提示',
41+
'地图选择': '选择要自动执行的地图类型',
3542
})
3643
self.setup_commission_config()
3744
keys_to_remove = ["启用自动穿引共鸣"]
3845
for key in keys_to_remove:
3946
self.default_config.pop(key, None)
47+
48+
# 设置地图选择为下拉选择
49+
self.config_type["地图选择"] = {
50+
"type": "drop_down",
51+
"options": ["全部地图", "探险电梯", "探险高台", "探险平地"],
52+
}
4053
self.action_timeout = DEFAULT_ACTION_TIMEOUT
4154
self.quick_move_task = QuickMoveTask(self)
55+
56+
# 地图检测点和执行函数的映射字典
57+
self.map_configs = {
58+
"探险电梯": {
59+
"track_point": (0.50, 0.69, 0.56, 0.77),
60+
"execute_func": self.execute_elevator_map
61+
},
62+
"探险高台": {
63+
"track_point": (0.29, 0.54, 0.34, 0.62),
64+
"execute_func": self.execute_platform_map
65+
},
66+
"探险平地": {
67+
"track_point": (0.44, 0.28, 0.49, 0.34),
68+
"execute_func": self.execute_ground_map
69+
}
70+
}
4271

4372
def run(self):
4473
DNAOneTimeTask.run(self)
4574
self.move_mouse_to_safe_position(save_current_pos=False)
4675
self.set_check_monthly_card()
47-
_to_do_task = self
4876
try:
4977
_to_do_task = self.get_task_by_class(AutoExploration)
5078
_to_do_task.config_external_movement(self.walk_to_aim, self.config)
51-
return _to_do_task.do_run()
79+
while True:
80+
try:
81+
return _to_do_task.do_run()
82+
except MapDetectionError as e:
83+
# 地图识别错误,记录日志并重试
84+
self.log_info(f"地图识别错误: {e},重新开始任务")
5285
except TaskDisabledException:
5386
pass
5487
except Exception as e:
5588
logger.error('AutoDefence error', e)
5689
raise
5790

5891
def walk_to_aim(self):
59-
if self.find_track_point(0.50,0.69,0.56,0.77):
60-
#30探险-电梯
61-
self.reset_and_transport()
62-
self.send_key_down("lalt")
63-
self.sleep(0.05)
64-
self.send_key_down("a")
65-
self.sleep(0.1)
66-
self.send_key_down(self.get_dodge_key())
67-
self.sleep(0.8)
68-
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.8)
69-
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=1.6)
70-
self.send_key_down("s")
71-
self.send_key_up("a")
72-
self.sleep(0.3)
73-
self.send_key("space", down_time=0.1,after_sleep=0.4)
74-
self.send_key("space", down_time=0.1,after_sleep=0.4)
75-
self.send_key("space", down_time=0.1,after_sleep=0.7)
76-
self.send_key_up(self.get_dodge_key())
77-
self.send_key_up("s")
78-
self.sleep(0.6)
79-
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
80-
if not self.try_solving_puzzle():
81-
return True
82-
self.send_key_down("a")
83-
self.sleep(0.1)
84-
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.6)
85-
self.send_key_down(self.get_dodge_key())
86-
self.sleep(0.9)
87-
self.send_key_down("w")
88-
self.sleep(0.2)
89-
self.send_key_up("a")
90-
self.sleep(0.1)
91-
self.send_key_up(self.get_dodge_key())
92-
self.send_key_up("w")
93-
self.sleep(0.2)
94-
self.send_key_up("lalt")
92+
map_selection = self.config.get("地图选择", "全部地图")
93+
94+
# 检测当前地图类型
95+
current_map = self.detect_current_map()
96+
97+
# 如果检测到未知地图,抛出地图识别错误
98+
if current_map == "未知地图":
99+
raise MapDetectionError("无法识别当前地图类型")
100+
101+
# 如果选择了特定地图,但当前不是该地图,抛出地图识别错误
102+
if map_selection != "全部地图" and current_map != map_selection:
103+
raise MapDetectionError(f"当前地图({current_map})不匹配选择的地图({map_selection})")
104+
105+
# 执行对应地图的移动逻辑
106+
if current_map in self.map_configs:
107+
self.log_info(f"识别到地图类型:{current_map},开始执行移动逻辑")
108+
return self.map_configs[current_map]["execute_func"]()
109+
else:
110+
# 这种情况理论上不应该发生,因为current_map是从map_configs中检测出来的
111+
raise MapDetectionError(f"地图配置不一致,检测到地图({current_map})但找不到对应的执行函数")
112+
113+
def detect_current_map(self):
114+
"""检测当前地图类型"""
115+
detected_maps = []
116+
117+
for map_name, config in self.map_configs.items():
118+
x1, y1, x2, y2 = config["track_point"]
119+
if self.find_track_point(x1, y1, x2, y2):
120+
detected_maps.append(map_name)
121+
self.log_info(f"检测到地图标记:{map_name} at ({x1}, {y1}, {x2}, {y2})")
122+
123+
if len(detected_maps) == 0:
124+
logger.warning("地图检测失败:未检测到任何已知的地图标记")
125+
return "未知地图"
126+
elif len(detected_maps) == 1:
127+
return detected_maps[0]
128+
else:
129+
# 检测到多个地图标记,记录日志并返回第一个检测到的
130+
logger.warning(f"地图检测冲突:同时检测到多个地图标记 {detected_maps},使用第一个检测到的地图")
131+
return detected_maps[0]
132+
133+
def execute_elevator_map(self):
134+
"""执行探险电梯地图的移动逻辑"""
135+
self.log_info("执行探险电梯地图移动")
136+
self.reset_and_transport()
137+
self.send_key_down("lalt")
138+
self.sleep(0.05)
139+
self.send_key_down("a")
140+
self.sleep(0.1)
141+
self.send_key_down(self.get_dodge_key())
142+
self.sleep(0.8)
143+
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.8)
144+
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=1.6)
145+
self.send_key_down("s")
146+
self.send_key_up("a")
147+
self.sleep(0.3)
148+
self.send_key("space", down_time=0.1,after_sleep=0.4)
149+
self.send_key("space", down_time=0.1,after_sleep=0.4)
150+
self.send_key("space", down_time=0.1,after_sleep=0.7)
151+
self.send_key_up(self.get_dodge_key())
152+
self.send_key_up("s")
153+
self.sleep(0.6)
154+
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
155+
if not self.try_solving_puzzle():
95156
return True
96-
97-
if self.find_track_point(0.29,0.54,0.34,0.62):
98-
#40探险-高台
99-
self.send_key_down("lalt")
100-
self.sleep(0.05)
101-
self.send_key_down("w")
102-
self.sleep(0.1)
103-
self.send_key_down(self.get_dodge_key())
104-
self.sleep(1.2)
105-
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.3)
106-
self.send_key_down(self.get_dodge_key())
107-
self.sleep(0.1)
108-
self.send_key_down("a")
109-
self.sleep(0.1)
110-
self.send_key("space", down_time=0.1,after_sleep=0.1)
111-
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.3)
112-
self.send_key("space", down_time=0.1,after_sleep=0.7)
113-
self.send_key_up(self.get_dodge_key())
114-
self.send_key_up("w")
115-
self.sleep(0.1)
116-
self.send_key_up("a")
117-
self.sleep(0.6)
118-
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
119-
if not self.try_solving_puzzle():
120-
return True
121-
self.send_key_down("d")
122-
self.sleep(0.1)
123-
self.send_key(self.get_dodge_key(), down_time=0.2)
124-
self.sleep(0.1)
125-
self.send_key_up("d")
126-
self.sleep(0.1)
127-
self.send_key_down("s")
128-
self.sleep(0.1)
129-
self.send_key_up(self.get_dodge_key())
130-
self.send_key_up("s")
131-
self.sleep(0.2)
132-
self.middle_click()
133-
self.send_key_up("lalt")
157+
self.send_key_down("a")
158+
self.sleep(0.1)
159+
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.6)
160+
self.send_key_down(self.get_dodge_key())
161+
self.sleep(0.9)
162+
self.send_key_down("w")
163+
self.sleep(0.2)
164+
self.send_key_up("a")
165+
self.sleep(0.1)
166+
self.send_key_up(self.get_dodge_key())
167+
self.send_key_up("w")
168+
self.sleep(0.2)
169+
self.send_key_up("lalt")
170+
return True
171+
172+
def execute_platform_map(self):
173+
"""执行探险高台地图的移动逻辑"""
174+
self.log_info("执行探险高台地图移动")
175+
self.send_key_down("lalt")
176+
self.sleep(0.05)
177+
self.send_key_down("w")
178+
self.sleep(0.1)
179+
self.send_key_down(self.get_dodge_key())
180+
self.sleep(1.2)
181+
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.3)
182+
self.send_key_down(self.get_dodge_key())
183+
self.sleep(0.1)
184+
self.send_key_down("a")
185+
self.sleep(0.1)
186+
self.send_key("space", down_time=0.1,after_sleep=0.1)
187+
self.send_key(self.get_dodge_key(), down_time=0.2,after_sleep=0.3)
188+
self.send_key("space", down_time=0.1,after_sleep=0.7)
189+
self.send_key_up(self.get_dodge_key())
190+
self.send_key_up("w")
191+
self.sleep(0.1)
192+
self.send_key_up("a")
193+
self.sleep(0.6)
194+
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
195+
if not self.try_solving_puzzle():
134196
return True
135-
136-
if self.find_track_point(0.44,0.28,0.49,0.34):
137-
#40探险-平地
138-
self.reset_and_transport()
139-
self.send_key_down("lalt")
140-
self.sleep(0.05)
141-
self.send_key_down("a")
142-
self.sleep(0.1)
143-
self.send_key(self.get_dodge_key(), down_time=1.1)
144-
self.send_key_up("a")
145-
self.sleep(0.6)
146-
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
147-
if not self.try_solving_puzzle():
148-
return True
149-
self.send_key('d',down_time=0.8,after_sleep=0.1)
150-
self.middle_click()
151-
self.send_key_up("lalt")
197+
self.send_key_down("d")
198+
self.sleep(0.1)
199+
self.send_key(self.get_dodge_key(), down_time=0.2)
200+
self.sleep(0.1)
201+
self.send_key_up("d")
202+
self.sleep(0.1)
203+
self.send_key_down("s")
204+
self.sleep(0.1)
205+
self.send_key_up(self.get_dodge_key())
206+
self.send_key_up("s")
207+
self.sleep(0.2)
208+
self.middle_click()
209+
self.send_key_up("lalt")
210+
return True
211+
212+
def execute_ground_map(self):
213+
"""执行探险平地地图的移动逻辑"""
214+
self.log_info("执行探险平地地图移动")
215+
self.reset_and_transport()
216+
self.send_key_down("lalt")
217+
self.sleep(0.05)
218+
self.send_key_down("a")
219+
self.sleep(0.1)
220+
self.send_key(self.get_dodge_key(), down_time=1.1)
221+
self.send_key_up("a")
222+
self.sleep(0.6)
223+
self.send_key(self.get_interact_key(), down_time=0.1,after_sleep=0.8)
224+
if not self.try_solving_puzzle():
152225
return True
226+
self.send_key('d',down_time=0.8,after_sleep=0.1)
227+
self.middle_click()
228+
self.send_key_up("lalt")
229+
return True
153230

154231

155232
def find_track_point(self, x1, y1, x2, y2) -> bool:
156233
box = self.box_of_screen_scaled(2560, 1440, 2560*x1, 1440*y1, 2560*x2, 1440*y2, name="find_track_point", hcenter=True)
157-
return super().find_track_point(threshold=0.7, box=box)
234+
result = super().find_track_point(threshold=0.7, box=box)
235+
# 调试信息:记录检测结果
236+
logger.debug(f"地图检测点 ({x1}, {y1}, {x2}, {y2}) 检测结果: {result}")
237+
return result
158238

159239
def try_solving_puzzle(self):
160240
maze_task = self.get_task_by_class(AutoMazeTask)

0 commit comments

Comments
 (0)