Skip to content

Commit 083fe9d

Browse files
committed
fix: 取消预选的预备编队
1 parent 02244b6 commit 083fe9d

1 file changed

Lines changed: 85 additions & 7 deletions

File tree

src/zzz_od/operation/choose_predefined_team.py

Lines changed: 85 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)