From 006bd9d301d3c60c7d43db0013b22353789f8799 Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 20:38:35 +0800 Subject: [PATCH 01/11] fix(decisive): extend recognize_stage to chapters 1-3 with manual calibration points --- autowsgr/ui/decisive/battle_page.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/autowsgr/ui/decisive/battle_page.py b/autowsgr/ui/decisive/battle_page.py index e49ae43f..71fbc780 100644 --- a/autowsgr/ui/decisive/battle_page.py +++ b/autowsgr/ui/decisive/battle_page.py @@ -107,11 +107,14 @@ """章节导航最大尝试次数。""" MAX_CHAPTER: int = 6 -MIN_CHAPTER: int = 4 +MIN_CHAPTER: int = 1 # ── recognize_stage 检测点 ── _STAGE_CHECK_POINTS: dict[int, list[tuple[float, float]]] = { + 1: [(0.4115, 0.4019), (0.6604, 0.4630), (0.8396, 0.7093)], + 2: [(0.4354, 0.3852), (0.5792, 0.6648), (0.8187, 0.5889)], + 3: [(0.4219, 0.6648), (0.6531, 0.3944), (0.8042, 0.7444)], 4: [(0.381, 0.436), (0.596, 0.636), (0.778, 0.521)], 5: [(0.418, 0.378), (0.760, 0.477), (0.550, 0.750)], 6: [(0.606, 0.375), (0.532, 0.703), (0.862, 0.644)], From d5cd75e9fac6cb70a805411892362771f83b9e0d Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 21:05:15 +0800 Subject: [PATCH 02/11] fix(decisive): use ship-icon detection to skip node recognition when no overlay --- autowsgr/ops/decisive/handlers.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index e59a59f0..b7dd4014 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -17,6 +17,8 @@ import time from typing import TYPE_CHECKING +import cv2 + from autowsgr.combat.engine import run_combat from autowsgr.combat.plan import CombatMode, CombatPlan, NodeDecision from autowsgr.infra.logger import get_logger @@ -259,7 +261,14 @@ def _handle_prepare_combat(self) -> None: self._state.node = 'A' _log.info('[决战] 首次进入第 1 小节,跳过节点识别并默认使用节点 A') else: - self._state.node = self._map.recognize_node() + # 智能判定:检测舰标是否已在地图上,若存在则直接默认节点 A + bgr = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) + icon_x = self._map._locate_ship_icon(bgr) + if icon_x is not None: + _log.info('[决战] 检测到舰标已在地图上,无 overlay,默认节点 A') + self._state.node = 'A' + else: + self._state.node = self._map.recognize_node() _log.info( '[决战] 出征准备 (小关 {} 节点 {})', self._state.stage, From 4df5801da4a5dfccfe5024e782528b40cfad5cdf Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 21:35:01 +0800 Subject: [PATCH 03/11] fix(decisive): use ship-icon absence to correct PREPARE_COMBAT to CHOOSE_FLEET in waiting_for_map --- autowsgr/ops/decisive/handlers.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index b7dd4014..d43a8bd9 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -155,11 +155,18 @@ def _handle_waiting_for_map(self) -> None: phase == DecisivePhase.PREPARE_COMBAT and self._state.stage == 1 and not self._has_chosen_fleet - and self._state.node != 'U' # 排除暂离后重进的情况 ): - _log.warning('[决战] 首进第 1 小节将 PREPARE_COMBAT 修正为 CHOOSE_FLEET') - self._state.phase = DecisivePhase.CHOOSE_FLEET - return + if self._state.node != 'U': + _log.warning('[决战] 首进第 1 小节将 PREPARE_COMBAT 修正为 CHOOSE_FLEET') + self._state.phase = DecisivePhase.CHOOSE_FLEET + return + # node == 'U' 时,通过舰标检测区分暂离重进与 overlay 延迟加载 + bgr = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) + icon_x = self._map._locate_ship_icon(bgr) + if icon_x is None: + _log.warning('[决战] 首进第 1 小节未检测到舰标,将 PREPARE_COMBAT 修正为 CHOOSE_FLEET') + self._state.phase = DecisivePhase.CHOOSE_FLEET + return if phase is not None: self._state.phase = phase From 8f4ed6156bbfc2bf1621a5e9ac5e6868c14c1111 Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 21:50:17 +0800 Subject: [PATCH 04/11] fix(decisive): return to WAITING_FOR_MAP after skill use when fleet not yet chosen --- autowsgr/ops/decisive/handlers.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index d43a8bd9..8824306e 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -316,6 +316,14 @@ def _handle_prepare_combat(self) -> None: else: _log.debug('[决战] 跳过技能使用: 节点={}, 技能已使用={}', current_node, skill_used) + # 首次进入且尚未选择过舰队时,使用技能后可能出现战备舰队获取 overlay, + # 先切回 WAITING_FOR_MAP 等待 overlay 稳定,避免直接点击编队超时。 + if not self._has_chosen_fleet: + _log.info('[决战] 首次进入,使用技能后等待 overlay 稳定') + self._wait_deadline = time.monotonic() + 10.0 + self._state.phase = DecisivePhase.WAITING_FOR_MAP + return + # ── 恢复模式: 扫描当前舰队与可用舰船 ───────────────────────── # 对齐 legacy: if fleet.empty() and not is_begin(): _check_fleet() if self._resume_mode: From 7f26d3925852ecdcc17b388f7830ca4709f20ec0 Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 22:37:33 +0800 Subject: [PATCH 05/11] fix(decisive): fix stage clear reward popup acknowledgment position and add extra confirm --- autowsgr/ui/decisive/map_controller.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autowsgr/ui/decisive/map_controller.py b/autowsgr/ui/decisive/map_controller.py index 17498005..d3b2e3e9 100644 --- a/autowsgr/ui/decisive/map_controller.py +++ b/autowsgr/ui/decisive/map_controller.py @@ -626,7 +626,7 @@ def confirm_stage_clear(self) -> list[str]: # 掉落处理结束后,继续等待回到决战入口页,避免奖励弹窗残留导致后续状态识别超时 settle_deadline = time.monotonic() + 12.0 - reward_ack_pos = (0.5, 0.5) + reward_ack_pos = (0.953, 0.954) while time.monotonic() < settle_deadline: screen = self._ctrl.screenshot() if ImageChecker.find_any(screen, entry_templates, confidence=0.8) is not None: @@ -639,6 +639,7 @@ def confirm_stage_clear(self) -> list[str]: self._ctrl.click(*reward_ack_pos) time.sleep(0.35) confirm_operation(self._ctrl, timeout=0.8) + confirm_operation(self._ctrl, timeout=0.8) continue if confirm_operation(self._ctrl, timeout=0.8): From 71696311249ef2863ea32e5e757204b133a44d53 Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 23:10:48 +0800 Subject: [PATCH 06/11] fix(decisive): add fallback to return to entry page after stage clear --- autowsgr/ui/decisive/map_controller.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/autowsgr/ui/decisive/map_controller.py b/autowsgr/ui/decisive/map_controller.py index d3b2e3e9..0d569277 100644 --- a/autowsgr/ui/decisive/map_controller.py +++ b/autowsgr/ui/decisive/map_controller.py @@ -649,6 +649,18 @@ def confirm_stage_clear(self) -> list[str]: else: _log.warning('[地图控制器] 小关通关后未能确认已回到决战入口页') + # settle 循环结束后,如果仍未回到入口页,尝试从地图页返回 + for _ in range(5): + screen = self._ctrl.screenshot() + if ImageChecker.find_any(screen, entry_templates, confidence=0.8) is not None: + _log.info('[地图控制器] 通过返回按钮回到决战入口页') + break + _log.debug('[地图控制器] 尝试点击返回按钮回到决战入口页') + self._ctrl.click(0.03, 0.06) + time.sleep(1.0) + else: + _log.warning('[地图控制器] 多次尝试后仍未能回到决战入口页') + if collected: _log.info('[地图控制器] 小关通关共收集 {} 个掉落', len(collected)) return collected From 98af051c2eff0710dc23e701a507a74ef574d6b3 Mon Sep 17 00:00:00 2001 From: syokounya Date: Sat, 11 Apr 2026 23:24:57 +0800 Subject: [PATCH 07/11] chore: ignore debug screenshots and temporary debug scripts --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 5666d094..ebb9af70 100644 --- a/.gitignore +++ b/.gitignore @@ -131,3 +131,7 @@ Cargo.lock # MSVC Windows builds of rustc generate these, which store debugging information *.pdb + +# Debug screenshots and temporary debug scripts +Screenshots/ +tools/debug_*.py From b9f81e291e0ea169c241dd649f6040c8e3d1fa52 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 15:39:15 +0000 Subject: [PATCH 08/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- autowsgr/ops/decisive/handlers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index 8824306e..1f2ce9bc 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -164,7 +164,9 @@ def _handle_waiting_for_map(self) -> None: bgr = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) icon_x = self._map._locate_ship_icon(bgr) if icon_x is None: - _log.warning('[决战] 首进第 1 小节未检测到舰标,将 PREPARE_COMBAT 修正为 CHOOSE_FLEET') + _log.warning( + '[决战] 首进第 1 小节未检测到舰标,将 PREPARE_COMBAT 修正为 CHOOSE_FLEET' + ) self._state.phase = DecisivePhase.CHOOSE_FLEET return From 76c4ece3b27c40974f052243f84ac154c62beaa1 Mon Sep 17 00:00:00 2001 From: KUAI Date: Sun, 12 Apr 2026 13:10:00 +0800 Subject: [PATCH 09/11] Update .gitignore --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index ebb9af70..5666d094 100644 --- a/.gitignore +++ b/.gitignore @@ -131,7 +131,3 @@ Cargo.lock # MSVC Windows builds of rustc generate these, which store debugging information *.pdb - -# Debug screenshots and temporary debug scripts -Screenshots/ -tools/debug_*.py From ebd3c52e78997ab0343cef900a4dc6f5ac17c60c Mon Sep 17 00:00:00 2001 From: KUAI Date: Sun, 12 Apr 2026 13:51:37 +0800 Subject: [PATCH 10/11] Update handlers.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中途进入决战时,舰标也在地图上,不需要智能判定 --- autowsgr/ops/decisive/handlers.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index 1f2ce9bc..e34af4d2 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -270,14 +270,7 @@ def _handle_prepare_combat(self) -> None: self._state.node = 'A' _log.info('[决战] 首次进入第 1 小节,跳过节点识别并默认使用节点 A') else: - # 智能判定:检测舰标是否已在地图上,若存在则直接默认节点 A - bgr = cv2.cvtColor(screen, cv2.COLOR_RGB2BGR) - icon_x = self._map._locate_ship_icon(bgr) - if icon_x is not None: - _log.info('[决战] 检测到舰标已在地图上,无 overlay,默认节点 A') - self._state.node = 'A' - else: - self._state.node = self._map.recognize_node() + self._state.node = self._map.recognize_node() _log.info( '[决战] 出征准备 (小关 {} 节点 {})', self._state.stage, From 80c6a2be4091f2696f559b0fc1296c8e351e18ef Mon Sep 17 00:00:00 2001 From: KUAI Date: Sun, 12 Apr 2026 13:53:05 +0800 Subject: [PATCH 11/11] Update handlers.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中途进入节点会卡在这里 --- autowsgr/ops/decisive/handlers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/autowsgr/ops/decisive/handlers.py b/autowsgr/ops/decisive/handlers.py index e34af4d2..1b00c66f 100644 --- a/autowsgr/ops/decisive/handlers.py +++ b/autowsgr/ops/decisive/handlers.py @@ -291,6 +291,7 @@ def _handle_prepare_combat(self) -> None: # 先使用技能,再注册舰船,如果是未知节点,也判定一下技能是否使用 current_node = self._state.node + time.sleep(0.5) # 等待动画稳定后截图判定 skill_used = self._map.is_skill_used() _log.debug('[决战] 节点: {}, 技能已使用检测: {}', current_node, skill_used) @@ -313,7 +314,7 @@ def _handle_prepare_combat(self) -> None: # 首次进入且尚未选择过舰队时,使用技能后可能出现战备舰队获取 overlay, # 先切回 WAITING_FOR_MAP 等待 overlay 稳定,避免直接点击编队超时。 - if not self._has_chosen_fleet: + if not skill_used not self._has_chosen_fleet: _log.info('[决战] 首次进入,使用技能后等待 overlay 稳定') self._wait_deadline = time.monotonic() + 10.0 self._state.phase = DecisivePhase.WAITING_FOR_MAP