@@ -79,6 +79,7 @@ def __init__(
7979 self .scanned_team_name_set : set [str ] = set ()
8080 self .shiyu_team_selected : bool = shiyu_target_list is None
8181 self .pending_select_button_center : Point | None = None
82+ self .pending_cancel_button_center : Point | None = None
8283 self .start_at_team_list : bool = start_at_team_list
8384 self .finish_without_confirm : bool = finish_without_confirm
8485
@@ -132,6 +133,21 @@ def choose_team(self) -> OperationRoundResult:
132133 return self .round_fail ('预备编队不足以完成自动配队' )
133134 self .shiyu_team_selected = True
134135
136+ if self .pending_cancel_button_center is not None :
137+ ocr_result_map = self .ctx .ocr .run_ocr (self .last_screenshot )
138+ if not self ._is_select_button_visible (ocr_result_map ):
139+ log .info ('预备编队取消等待:原选中态尚未恢复为SELECT' )
140+ return self .round_wait (
141+ ChoosePredefinedTeam .STATUS_CONTINUE_CHOOSE ,
142+ wait = 0.5 ,
143+ )
144+ log .info ('预备编队取消完成:已恢复SELECT' )
145+ self .pending_cancel_button_center = None
146+ return self .round_wait (
147+ ChoosePredefinedTeam .STATUS_CONTINUE_CHOOSE ,
148+ wait = 0.2 ,
149+ )
150+
135151 if self .pending_select_button_center is not None :
136152 ocr_result_map = self .ctx .ocr .run_ocr (self .last_screenshot )
137153 if not self ._is_team_selected (ocr_result_map ):
@@ -186,8 +202,20 @@ def choose_team(self) -> OperationRoundResult:
186202
187203 select_button_mr = self ._find_select_button (ocr_result_map , team_name_mr )
188204 if select_button_mr is None :
189- return self .round_fail (f'当前编队未找到+ SELECT { target_team .name } ' )
205+ selected_button_mr = self ._find_selected_button (ocr_result_map , team_name_mr )
206+ if selected_button_mr is None :
207+ return self .round_fail (f'当前编队未找到SELECT { target_team .name } ' )
208+ log .info ('预备编队取消选择:队伍:%s 当前状态非SELECT' , target_team .name )
209+ self .ctx .controller .click (
210+ team_name_mr .center + ChoosePredefinedTeam .TEAM_NAME_CLICK_OFFSET
211+ )
212+ self .pending_cancel_button_center = selected_button_mr .center
213+ return self .round_wait (
214+ ChoosePredefinedTeam .STATUS_CONTINUE_CHOOSE ,
215+ wait = 0.5 ,
216+ )
190217
218+ log .info ('预备编队选择:队伍:%s 已找到SELECT' , target_team .name )
191219 self .ctx .controller .click (
192220 team_name_mr .center + ChoosePredefinedTeam .TEAM_NAME_CLICK_OFFSET
193221 )
@@ -351,6 +379,61 @@ def _find_select_button(
351379 ),
352380 )
353381
382+ def _find_selected_button (
383+ self ,
384+ ocr_result_map : dict [str , MatchResultList ],
385+ team_name_mr : MatchResult ,
386+ ) -> MatchResult | None :
387+ candidate_list : list [MatchResult ] = []
388+ for text , mr_list in ocr_result_map .items ():
389+ if not self ._is_selected_text (text .replace (' ' , '' ).upper ()):
390+ continue
391+ for mr in mr_list :
392+ x_offset = mr .center .x - team_name_mr .center .x
393+ y_offset = mr .center .y - team_name_mr .center .y
394+ if 300 <= x_offset <= 850 and 40 <= y_offset <= 250 :
395+ candidate_list .append (mr )
396+
397+ if len (candidate_list ) == 0 :
398+ return None
399+ return min (
400+ candidate_list ,
401+ key = lambda mr : (
402+ abs (mr .center .x - team_name_mr .center .x - 650 )
403+ + abs (mr .center .y - team_name_mr .center .y - 130 )
404+ ),
405+ )
406+
407+ def _is_select_button_visible (
408+ self ,
409+ ocr_result_map : dict [str , MatchResultList ],
410+ ) -> bool :
411+ if self .pending_cancel_button_center is None :
412+ return False
413+
414+ center = self .pending_cancel_button_center
415+ for text , mr_list in ocr_result_map .items ():
416+ if not text .replace (' ' , '' ).upper ().endswith ('SELECT' ):
417+ continue
418+ for mr in mr_list :
419+ if (
420+ abs (mr .center .x - center .x )
421+ <= ChoosePredefinedTeam .SELECT_BUTTON_FEEDBACK_HALF_WIDTH
422+ and abs (mr .center .y - center .y )
423+ <= ChoosePredefinedTeam .SELECT_BUTTON_FEEDBACK_HALF_HEIGHT
424+ ):
425+ return True
426+ return False
427+
428+ @staticmethod
429+ def _is_selected_text (normalized_text : str ) -> bool :
430+ return (
431+ normalized_text == 'SELECTED'
432+ or normalized_text == 'TEAM'
433+ or normalized_text .startswith ('TEAM' )
434+ or re .fullmatch (r'\d{2}' , normalized_text ) is not None
435+ )
436+
354437 def _is_team_selected (
355438 self ,
356439 ocr_result_map : dict [str , MatchResultList ],
@@ -371,12 +454,7 @@ def _is_team_selected(
371454 continue
372455 if normalized_text .endswith ('SELECT' ):
373456 return False
374- if (
375- normalized_text == 'SELECTED'
376- or normalized_text == 'TEAM'
377- or normalized_text .startswith ('TEAM' )
378- or re .fullmatch (r'\d{2}' , normalized_text ) is not None
379- ):
457+ if self ._is_selected_text (normalized_text ):
380458 return True
381459
382460 return False
0 commit comments