Skip to content

[Bug] 游戏处于登录界面时,非 Restart 任务因 page_login 为页面图孤立节点而陷入死循环 #1665

Description

@justforgetyou

在提问之前...

  • 我已经搜索了现有的 issues
  • 我在提问题之前至少花费了 5 分钟来思考和准备
  • 我已经阅读了文档中的 常见问题(FAQ)
  • 这个问题出现了至少三次,不是偶发的
  • 我使用 OAS 的 dev 分支

描述你的问题

游戏停在登录界面时,启动任意非 Restart 任务(如 RyouToppa),脚本在 ui_goto 中死循环,
反复检测到 page_login 却无法登录,直至 60s 超时。日志如下:

script.py:0473 | INFO | module_path: .../tasks/RyouToppa/script_task.py
game_ui.py:0102 | INFO | UI get current page
logger.py:0320 | INFO | [UI] page_login
logger.py:0312 | INFO | <<< UI GOTO PAGE_KEKKAI_TOPPA >>>
game_ui.py:0102 | INFO | UI get current page
logger.py:0320 | INFO | [UI] page_login
game_ui.py:0102 | INFO | UI get current page
logger.py:0320 | INFO | [UI] page_login
... (一直循环到超时)

如何复现

  1. 启动游戏,停在登录界面。
  2. 运行非 Restart 任务(例如寮突破 RyouToppa)。
  3. 观察日志:出现 <<< UI GOTO ... >>> 后,UI get current page / [UI] page_login 反复循环,无法登录。

预期行为

No response

相关 Logs


报错时游戏的截图/别的截图

No response

还有别的吗?

claude原因分析

  • page_logintasks/GameUi/page.py 中定义为 page_login = Page(G.I_CHECK_LOGIN_FORM),没有任何 .link(),在页面跳转图中是一个孤立节点。
  • ui_goto 通过 build_reverse_path_dict(destination) 反向 BFS 构建路径,page_login 没有出边,不会被加入路径字典,因此 path_dict.get(page_login) 永远返回 None
  • 于是 ui_goto 走入 if not path: self.ui_get_current_page() 分支反复重检测,形成死循环。
  • 而真正负责点"进入游戏"的 LoginHandler.app_handle_login()(tasks/Restart/login.py)只被 Restart 任务和 SwitchAccount 调用,通用导航 ui_goto/ui_get_current_page 从不调用它。
  • 结果:任何非 Restart 任务若在登录页启动(例如调度器首个 Restart 被 is_first_task 跳过、或运行中游戏掉线回到登录页),都会卡死。
    claude建议修复(claude已帮助我在本机完成修复)
    ui_goto 中遇到 page_login 时,先调用 Restart 的登录流程回到 page_main,再继续导航。
    (放在 ui_goto 而非 ui_get_current_page,因为 SwitchAccount 依赖 ui_get_current_page 原样返回 page_login 以自行处理登录。)
--- a/tasks/GameUi/game_ui.py
+++ b/tasks/GameUi/game_ui.py
@@ from tasks.GameUi.page import
-from tasks.GameUi.page import Page, PageRegistry, page_main, random_click
+from tasks.GameUi.page import Page, PageRegistry, page_login, page_main, random_click

@@ class GameUi:
         found = False
         while not timeout_timer.reached():
             if found:
                 confirm_timer.wait()
                 return True
+            # 登录界面在页面跳转图中是孤立节点(无link), 无法通过路径规划导航,
+            # 需先执行登录流程回到主页(page_main)再继续导航
+            if self.ui_current == page_login:
+                self._ensure_login()
+                timeout_timer.reset()  # 登录耗时较长, 重置导航超时
+                continue
             confirm_timer.reset()
             path = path_dict.get(self.ui_current, None)
             ...

+    def _ensure_login(self):
+        """遇到 page_login 时调用 Restart 登录流程, 完成后回到 page_main。"""
+        from tasks.Restart.login import LoginHandler
+        logger.info('At login page, run app login before navigation')
+        login_handler = LoginHandler(config=self.config, device=self.device)
+        login_handler.app_handle_login()
+        self.ui_current = page_main

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions