(
self,
context: Context,
argv: CustomRecognition.AnalyzeArg,
)
| 251 | cls._seen_non_map = False |
| 252 | |
| 253 | def analyze( |
| 254 | self, |
| 255 | context: Context, |
| 256 | argv: CustomRecognition.AnalyzeArg, |
| 257 | ) -> CustomRecognition.AnalyzeResult | RectType | None: |
| 258 | |
| 259 | try: |
| 260 | params = parse_params(argv.custom_recognition_param) |
| 261 | except ValueError as e: |
| 262 | logger.error(f"[AutoPromotion] 导航参数解析失败({e}),使用默认值") |
| 263 | params = {} |
| 264 | query = params.get("query", "nav") |
| 265 | self.apply_param_overrides(params) |
| 266 | |
| 267 | target = self.CARD_NAME.strip() |
| 268 | |
| 269 | if query == "nav": |
| 270 | if not target or target == "当前页面": |
| 271 | return None |
| 272 | APCardFinder.reset_nav_state() |
| 273 | logger.info(f"[AutoPromotion] 开始导航至「{target}」") |
| 274 | return CustomRecognition.AnalyzeResult(box=[0, 0, 0, 0], detail={}) |
| 275 | |
| 276 | if query == "arrived": |
| 277 | # 必须先离开过地图页再回到地图页才算到达:启动时若已在某张 |
| 278 | # 地图页(可能是别的活动的),直接判到达会在错误的地图上推图 |
| 279 | if not is_stage_map(context, argv.image): |
| 280 | APCardFinder._seen_non_map = True |
| 281 | return None |
| 282 | # 活动入口界面(有「步入剧情」按钮)被 APExploreAnchorOCR 误判为地图页时的防御: |
| 283 | # 入口界面不是关卡地图,需先点「步入剧情」才进入地图 |
| 284 | if is_hit(context.run_recognition("AP_NavStoryEnter", argv.image)): |
| 285 | APCardFinder._seen_non_map = True |
| 286 | return None |
| 287 | # 卡片详情页(有「活动正篇/主线正篇」按钮)被 APStageNumberOCR 误判为地图页时的防御: |
| 288 | # 详情页标题含活动编号(如「77号往事」),OCR 把「77」误读为关卡号; |
| 289 | # 需先点「活动正篇」才进入关卡地图 |
| 290 | if is_hit(context.run_recognition("AP_NavMainEntry", argv.image)): |
| 291 | APCardFinder._seen_non_map = True |
| 292 | return None |
| 293 | if not APCardFinder._seen_non_map: |
| 294 | return None |
| 295 | logger.info("[AutoPromotion] 已到达关卡地图页,导航完成") |
| 296 | APCardFinder.reset_nav_state() |
| 297 | return CustomRecognition.AnalyzeResult(box=[0, 0, 0, 0], detail={}) |
| 298 | |
| 299 | if query == "pv": |
| 300 | if APCardFinder._pv_taps >= self.PV_TAP_LIMIT: |
| 301 | return None |
| 302 | detail = context.run_recognition("APNavFullOCR", argv.image) |
| 303 | tokens = [r for r in ocr_results(detail) if len(r.text.strip()) >= 2] |
| 304 | if len(tokens) > self.PV_MAX_TOKENS: |
| 305 | return None |
| 306 | APCardFinder._pv_taps += 1 |
| 307 | logger.info( |
| 308 | f"[AutoPromotion] 疑似 PV 播放中(第 {APCardFinder._pv_taps} 次)," |
| 309 | "点击唤出跳过按钮" |
| 310 | ) |
nothing calls this directly
no test coverage detected