1414DEFAULT_ACTION_TIMEOUT = 10
1515
1616
17+ class MapDetectionError (Exception ):
18+ """地图识别错误异常"""
19+ pass
20+
21+
1722class 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