改写战斗中替换group的逻辑

This commit is contained in:
Elaina 2024-10-13 01:24:58 +08:00
commit 7f89eb0db8
3890 changed files with 82290 additions and 0 deletions

View file

@ -0,0 +1,31 @@
from . import (
extra,
friend,
index,
mission,
navbar,
operation,
recruit,
riic,
shop,
sss,
terminal,
)
from .utils import DG, SceneGraphSolver, edge
__all__ = [
"SceneGraphSolver",
"DG",
"edge",
"extra",
"friend",
"index",
"mission",
"navbar",
"operation",
"recruit",
"riic",
"shop",
"sss",
"terminal",
]

View file

@ -0,0 +1,46 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 其它场景
@edge(Scene.UNDEFINED, Scene.INDEX)
def get_scene(solver: BaseSolver):
solver.scene()
@edge(Scene.LOGIN_START, Scene.LOGIN_QUICKLY)
def login_start(solver: BaseSolver):
solver.tap((665, 741))
@edge(Scene.CONFIRM, Scene.LOGIN_START)
def confirm(solver: BaseSolver):
solver.tap_element("confirm")
@edge(Scene.NOTICE, Scene.INDEX)
def close_notice(solver: BaseSolver):
solver.tap_element("notice")
@edge(Scene.NETWORK_CHECK, Scene.LOGIN_START)
def network_check_cancel(solver: BaseSolver):
solver.tap_element("confirm")
@edge(Scene.MOON_FESTIVAL, Scene.SIGN_IN_DAILY)
def moon_festival(solver: BaseSolver):
solver.back()
@edge(Scene.STORY, Scene.STORY_SKIP)
def skip_story(solver: BaseSolver):
solver.tap((1655, 781))
@edge(Scene.STORY_SKIP, Scene.OPERATOR_BEFORE)
def skip_story_confirm(solver: BaseSolver):
solver.tap_element("story_skip_confirm_dialog", x_rate=0.94)

View file

@ -0,0 +1,26 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 好友
@edge(Scene.BUSINESS_CARD, Scene.FRIEND_LIST)
def friend_list(solver: BaseSolver):
solver.tap((194, 333))
@edge(Scene.FRIEND_LIST, Scene.BUSINESS_CARD)
def business_card(solver: BaseSolver):
solver.tap((188, 198))
@edge(Scene.FRIEND_VISITING, Scene.BACK_TO_FRIEND_LIST)
def friend_visiting_back(solver: BaseSolver):
solver.back()
@edge(Scene.BACK_TO_FRIEND_LIST, Scene.BUSINESS_CARD)
def back_to_friend_confirm(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1)

129
mower/utils/graph/index.py Normal file
View file

@ -0,0 +1,129 @@
from mower.utils import config
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 首页
@edge(Scene.INFRA_MAIN, Scene.INDEX)
@edge(Scene.MISSION_DAILY, Scene.INDEX)
@edge(Scene.MISSION_WEEKLY, Scene.INDEX)
@edge(Scene.MISSION_TRAINEE, Scene.INDEX)
@edge(Scene.BUSINESS_CARD, Scene.INDEX)
@edge(Scene.FRIEND_LIST, Scene.INDEX)
@edge(Scene.RECRUIT_MAIN, Scene.INDEX)
@edge(Scene.SHOP_OTHERS, Scene.INDEX)
@edge(Scene.SHOP_CREDIT, Scene.INDEX)
@edge(Scene.SHOP_TOKEN, Scene.INDEX)
@edge(Scene.TERMINAL_MAIN, Scene.INDEX)
@edge(Scene.TERMINAL_MAIN_THEME, Scene.INDEX)
@edge(Scene.TERMINAL_EPISODE, Scene.INDEX)
@edge(Scene.TERMINAL_BIOGRAPHY, Scene.INDEX)
@edge(Scene.TERMINAL_COLLECTION, Scene.INDEX)
@edge(Scene.TERMINAL_REGULAR, Scene.INDEX)
@edge(Scene.TERMINAL_LONGTERM, Scene.INDEX)
@edge(Scene.DEPOT, Scene.INDEX)
@edge(Scene.HEADHUNTING, Scene.INDEX)
@edge(Scene.MAIL, Scene.INDEX)
@edge(Scene.SIGN_IN_DAILY, Scene.INDEX)
@edge(Scene.INDEX_ORIGINITE, Scene.INDEX)
@edge(Scene.INDEX_SANITY, Scene.INDEX)
def back_to_index(solver: BaseSolver):
solver.back()
@edge(Scene.LEAVE_INFRASTRUCTURE, Scene.INDEX)
def leave_infrastructure(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1)
@edge(Scene.DOWNLOAD_VOICE_RESOURCES, Scene.INDEX)
def dont_download_voice(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0)
@edge(Scene.LOGIN_QUICKLY, Scene.INDEX)
def login_quickly(solver: BaseSolver):
solver.tap_element("login_awake")
@edge(Scene.LOGIN_CAPTCHA, Scene.INDEX)
def login_captcha(solver: BaseSolver):
solver.solve_captcha()
solver.sleep(5)
@edge(Scene.LOGIN_BILIBILI, Scene.INDEX)
def login_bilibili(solver: BaseSolver):
solver.tap((1000, 600))
@edge(Scene.EXIT_GAME, Scene.INDEX)
def exit_cancel(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0)
@edge(Scene.MATERIEL, Scene.INDEX)
def materiel(solver: BaseSolver):
solver.tap((960, 960))
@edge(Scene.ANNOUNCEMENT, Scene.INDEX)
def announcement(solver: BaseSolver):
solver.tap(config.recog.check_announcement())
@edge(Scene.AGREEMENT_UPDATE, Scene.INDEX)
def agreement(solver: BaseSolver):
if pos := solver.find("read_and_agree"):
solver.tap(pos)
else:
solver.tap((791, 728))
solver.tap((959, 828))
@edge(Scene.INDEX, Scene.INFRA_MAIN)
def index_to_infra(solver: BaseSolver):
solver.tap_index_element("infrastructure")
@edge(Scene.INDEX, Scene.BUSINESS_CARD)
def index_to_friend(solver: BaseSolver):
solver.tap_index_element("friend")
@edge(Scene.INDEX, Scene.MISSION_DAILY)
def index_to_mission(solver: BaseSolver):
solver.tap_index_element("mission")
@edge(Scene.INDEX, Scene.RECRUIT_MAIN)
def index_to_recruit(solver: BaseSolver):
solver.tap_index_element("recruit")
@edge(Scene.INDEX, Scene.SHOP_OTHERS)
def index_to_shop(solver: BaseSolver):
solver.tap_index_element("shop")
@edge(Scene.INDEX, Scene.TERMINAL_MAIN)
def index_to_terminal(solver: BaseSolver):
solver.tap_index_element("terminal")
@edge(Scene.INDEX, Scene.DEPOT)
def index_to_depot(solver: BaseSolver):
solver.tap_index_element("warehouse")
@edge(Scene.INDEX, Scene.MAIL)
def index_to_mail(solver: BaseSolver):
solver.tap_index_element("mail")
@edge(Scene.INDEX, Scene.HEADHUNTING)
def index_to_headhunting(solver: BaseSolver):
solver.tap_index_element("headhunting")

View file

@ -0,0 +1,17 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 任务
@edge(Scene.MISSION_DAILY, Scene.MISSION_WEEKLY)
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_WEEKLY)
def mission_to_weekly(solver: BaseSolver):
solver.tap_element("mission_weekly")
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_DAILY)
def mission_trainee_to_daily(solver: BaseSolver):
solver.tap_element("mission_daily")

View file

@ -0,0 +1,90 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 导航栏
@edge(Scene.INFRA_MAIN, Scene.NAVIGATION_BAR)
@edge(Scene.RECRUIT_MAIN, Scene.NAVIGATION_BAR)
@edge(Scene.RECRUIT_TAGS, Scene.NAVIGATION_BAR)
@edge(Scene.MISSION_DAILY, Scene.NAVIGATION_BAR)
@edge(Scene.MISSION_WEEKLY, Scene.NAVIGATION_BAR)
@edge(Scene.MISSION_TRAINEE, Scene.NAVIGATION_BAR)
@edge(Scene.BUSINESS_CARD, Scene.NAVIGATION_BAR)
@edge(Scene.FRIEND_LIST, Scene.NAVIGATION_BAR)
@edge(Scene.SHOP_OTHERS, Scene.NAVIGATION_BAR)
@edge(Scene.SHOP_CREDIT, Scene.NAVIGATION_BAR)
@edge(Scene.SHOP_TOKEN, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_MAIN, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_MAIN_THEME, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_EPISODE, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_BIOGRAPHY, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_COLLECTION, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_REGULAR, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_LONGTERM, Scene.NAVIGATION_BAR)
@edge(Scene.TERMINAL_PERIODIC, Scene.NAVIGATION_BAR)
@edge(Scene.OPERATOR_CHOOSE_LEVEL, Scene.NAVIGATION_BAR)
@edge(Scene.OPERATOR_BEFORE, Scene.NAVIGATION_BAR)
@edge(Scene.OPERATOR_SELECT, Scene.NAVIGATION_BAR)
@edge(Scene.OPERATOR_SUPPORT, Scene.NAVIGATION_BAR)
@edge(Scene.INFRA_TODOLIST, Scene.NAVIGATION_BAR)
@edge(Scene.INFRA_CONFIDENTIAL, Scene.NAVIGATION_BAR)
@edge(Scene.INFRA_ARRANGE, Scene.NAVIGATION_BAR)
@edge(Scene.INFRA_DETAILS, Scene.NAVIGATION_BAR)
@edge(Scene.CTRLCENTER_ASSISTANT, Scene.NAVIGATION_BAR)
@edge(Scene.CLUE_DAILY, Scene.NAVIGATION_BAR)
@edge(Scene.CLUE_RECEIVE, Scene.NAVIGATION_BAR)
@edge(Scene.CLUE_PLACE, Scene.NAVIGATION_BAR)
@edge(Scene.ORDER_LIST, Scene.NAVIGATION_BAR)
@edge(Scene.FACTORY_ROOMS, Scene.NAVIGATION_BAR)
@edge(Scene.OPERATOR_ELIMINATE, Scene.NAVIGATION_BAR)
@edge(Scene.DEPOT, Scene.NAVIGATION_BAR)
@edge(Scene.FRIEND_VISITING, Scene.NAVIGATION_BAR)
@edge(Scene.HEADHUNTING, Scene.NAVIGATION_BAR)
@edge(Scene.UNKNOWN_WITH_NAVBAR, Scene.NAVIGATION_BAR)
@edge(Scene.SSS_MAIN, Scene.NAVIGATION_BAR)
@edge(Scene.SSS_START, Scene.NAVIGATION_BAR)
@edge(Scene.ACTIVITY_MAIN, Scene.NAVIGATION_BAR)
@edge(Scene.ACTIVITY_CHOOSE_LEVEL, Scene.NAVIGATION_BAR)
def index_nav(solver: BaseSolver):
solver.tap_element("nav_button")
# 不加从导航栏到基建首页的边,防止在基建内循环
@edge(Scene.NAVIGATION_BAR, Scene.MISSION_DAILY)
def nav_mission(solver: BaseSolver):
solver.tap_nav_element("mission")
@edge(Scene.NAVIGATION_BAR, Scene.INDEX)
def nav_index(solver: BaseSolver):
solver.tap_nav_element("index")
@edge(Scene.NAVIGATION_BAR, Scene.TERMINAL_MAIN)
def nav_terminal(solver: BaseSolver):
solver.tap_nav_element("terminal")
@edge(Scene.NAVIGATION_BAR, Scene.RECRUIT_MAIN)
def nav_recruit(solver: BaseSolver):
solver.tap_nav_element("recruit")
@edge(Scene.NAVIGATION_BAR, Scene.SHOP_OTHERS)
def nav_shop(solver: BaseSolver):
solver.tap_nav_element("shop")
@edge(Scene.NAVIGATION_BAR, Scene.HEADHUNTING)
def nav_headhunting(solver: BaseSolver):
solver.tap_nav_element("headhunting")
@edge(Scene.NAVIGATION_BAR, Scene.BUSINESS_CARD)
def nav_friend(solver: BaseSolver):
solver.tap_nav_element("friend")

View file

@ -0,0 +1,38 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 作战
@edge(Scene.OPERATOR_RECOVER_POTION, Scene.OPERATOR_BEFORE)
@edge(Scene.OPERATOR_RECOVER_ORIGINITE, Scene.OPERATOR_BEFORE)
@edge(Scene.OPERATOR_BEFORE, Scene.OPERATOR_CHOOSE_LEVEL)
@edge(Scene.OPERATOR_CHOOSE_LEVEL, Scene.TERMINAL_MAIN_THEME)
@edge(Scene.OPERATOR_CHOOSE_LEVEL, Scene.TERMINAL_BIOGRAPHY)
@edge(Scene.OPERATOR_CHOOSE_LEVEL, Scene.TERMINAL_COLLECTION)
@edge(Scene.ACTIVITY_MAIN, Scene.TERMINAL_MAIN)
@edge(Scene.ACTIVITY_CHOOSE_LEVEL, Scene.ACTIVITY_MAIN)
@edge(Scene.OPERATOR_SUPPORT, Scene.OPERATOR_SELECT)
@edge(Scene.OPERATOR_AGENT_SELECT, Scene.OPERATOR_SELECT)
@edge(Scene.OPERATOR_SUPPORT_AGENT, Scene.OPERATOR_SUPPORT)
@edge(Scene.OPERATOR_ELIMINATE_AGENCY, Scene.OPERATOR_ELIMINATE)
def operation_back(solver: BaseSolver):
solver.back()
@edge(Scene.OPERATOR_GIVEUP, Scene.OPERATOR_FAILED)
def operation_give_up(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1)
@edge(Scene.OPERATOR_FINISH, Scene.OPERATOR_BEFORE)
@edge(Scene.OPERATOR_FAILED, Scene.OPERATOR_BEFORE)
def operation_finish(solver: BaseSolver):
solver.tap((310, 330))
@edge(Scene.UPGRADE, Scene.OPERATOR_FINISH)
def upgrade(solver: BaseSolver):
solver.tap((960, 540))

View file

@ -0,0 +1,26 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 公招
@edge(Scene.RECRUIT_AGENT, Scene.RECRUIT_MAIN)
def recruit_result(solver: BaseSolver):
solver.tap((960, 540))
@edge(Scene.REFRESH_TAGS, Scene.RECRUIT_TAGS)
def refresh_cancel(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0)
@edge(Scene.RECRUIT_TAGS, Scene.RECRUIT_MAIN)
def recruit_back(solver: BaseSolver):
solver.back()
@edge(Scene.SKIP, Scene.RECRUIT_AGENT)
def skip(solver: BaseSolver):
solver.tap_element("skip")

75
mower/utils/graph/riic.py Normal file
View file

@ -0,0 +1,75 @@
from mower.utils import config
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 基建
@edge(Scene.INFRA_TODOLIST, Scene.INFRA_MAIN)
def todo_complete(solver: BaseSolver):
solver.tap((1840, 140))
@edge(Scene.INFRA_CONFIDENTIAL, Scene.INFRA_MAIN)
@edge(Scene.INFRA_ARRANGE, Scene.INFRA_MAIN)
@edge(Scene.INFRA_DETAILS, Scene.INFRA_MAIN)
@edge(Scene.CTRLCENTER_ASSISTANT, Scene.INFRA_MAIN)
@edge(Scene.RIIC_OPERATOR_SELECT, Scene.INFRA_DETAILS)
@edge(Scene.CLUE_DAILY, Scene.INFRA_CONFIDENTIAL)
@edge(Scene.CLUE_RECEIVE, Scene.INFRA_CONFIDENTIAL)
@edge(Scene.CLUE_GIVE_AWAY, Scene.INFRA_CONFIDENTIAL)
@edge(Scene.CLUE_SUMMARY, Scene.INFRA_CONFIDENTIAL)
@edge(Scene.CLUE_PLACE, Scene.INFRA_CONFIDENTIAL)
@edge(Scene.ORDER_LIST, Scene.INFRA_DETAILS)
@edge(Scene.FACTORY_ROOMS, Scene.INFRA_DETAILS)
@edge(Scene.CHOOSE_PRODUCT, Scene.FACTORY_ROOMS)
@edge(Scene.DRONE_ACCELERATE, Scene.ORDER_LIST)
def infra_back(solver: BaseSolver):
solver.cback(1, config.screenshot_avg / 1000)
@edge(Scene.INFRA_ARRANGE_CONFIRM, Scene.RIIC_OPERATOR_SELECT)
def infra_arrange_confirm(solver: BaseSolver):
solver.tap((1452, 1029))
@edge(Scene.INFRA_ARRANGE_ORDER, Scene.RIIC_OPERATOR_SELECT)
def infra_arrange_order(solver: BaseSolver):
solver.tap_element("arrange_blue_yes", x_rate=0.66)
@edge(Scene.RIIC_REPORT, Scene.CTRLCENTER_ASSISTANT)
def riic_back(solver: BaseSolver):
solver.tap((30, 55))
@edge(Scene.CTRLCENTER_ASSISTANT, Scene.RIIC_REPORT)
def riic(solver: BaseSolver):
solver.tap_element("control_central_assistants")
@edge(Scene.INFRA_MAIN, Scene.CTRLCENTER_ASSISTANT)
def control_central(solver: BaseSolver):
solver.tap_element("control_central")
@edge(Scene.SANITY_CHARGE, Scene.INFRA_MAIN)
def sanity_charge(solver: BaseSolver):
solver.tap((1200, 15))
@edge(Scene.SANITY_CHARGE_DIALOG, Scene.SANITY_CHARGE)
def sanity_charge_dialog(solver: BaseSolver):
solver.tap((480, 925))
@edge(Scene.SWITCH_ORDER, Scene.ORDER_LIST)
def switch_order(solver: BaseSolver):
solver.tap((1900, 1000))
@edge(Scene.PRODUCT_SWITCHING_CONFIRM, Scene.FACTORY_ROOMS)
def product_switching_confirm(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0)

29
mower/utils/graph/shop.py Normal file
View file

@ -0,0 +1,29 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 商店
@edge(Scene.SHOP_OTHERS, Scene.SHOP_CREDIT)
@edge(Scene.SHOP_TOKEN, Scene.SHOP_CREDIT)
def shop_credit(solver: BaseSolver):
solver.switch_shop("credit")
@edge(Scene.SHOP_OTHERS, Scene.SHOP_TOKEN)
@edge(Scene.SHOP_CREDIT, Scene.SHOP_TOKEN)
def shop_token(solver: BaseSolver):
solver.switch_shop("token")
@edge(Scene.SHOP_CREDIT_CONFIRM, Scene.SHOP_CREDIT)
@edge(Scene.SHOP_UNLOCK_SCHEDULE, Scene.SHOP_CREDIT)
def shop_back(solver: BaseSolver):
solver.back()
@edge(Scene.SHOP_TRADE_TOKEN, Scene.SHOP_TOKEN)
def trade_cancel(solver: BaseSolver):
solver.tap_element("shop/trade_token_dialog", x_rate=0)

29
mower/utils/graph/sss.py Normal file
View file

@ -0,0 +1,29 @@
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import edge
# 保全
@edge(Scene.TERMINAL_REGULAR, Scene.SSS_MAIN)
def enter_sss(solver: BaseSolver):
solver.tap((1548, 870))
@edge(Scene.SSS_MAIN, Scene.TERMINAL_REGULAR)
@edge(Scene.SSS_START, Scene.SSS_MAIN)
@edge(Scene.SSS_DEPLOY, Scene.SSS_MAIN)
@edge(Scene.SSS_EC, Scene.SSS_EXIT_CONFIRM)
@edge(Scene.SSS_DEVICE, Scene.SSS_EXIT_CONFIRM)
@edge(Scene.SSS_SQUAD, Scene.SSS_EXIT_CONFIRM)
@edge(Scene.SSS_DEPLOY, Scene.SSS_MAIN)
@edge(Scene.SSS_REDEPLOY, Scene.SSS_MAIN)
@edge(Scene.SSS_TERMINATED, Scene.SSS_START)
def sss_back(solver: BaseSolver):
solver.back()
@edge(Scene.SSS_EXIT_CONFIRM, Scene.SSS_TERMINATED)
def sss_exit(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1)

View file

@ -0,0 +1,30 @@
from mower.utils.solver import BaseSolver
from .utils import DG
# 终端
terminal_button = {
501: "main",
502: "main_theme",
503: "intermezzi",
504: "biography",
505: "collection",
506: "regular",
507: "longterm",
508: "contract",
}
def terminal_transition_factory(t):
def terminal_transition(solver: BaseSolver):
solver.tap_terminal_button(terminal_button[t])
return terminal_transition
for s in range(501, 509):
for t in range(501, 509):
if t == s:
continue
DG.add_edge(s, t, transition=terminal_transition_factory(t))

View file

@ -0,0 +1,81 @@
import functools
import networkx as nx
from mower.utils.csleep import MowerExit
from mower.utils.log import logger
from mower.utils.scene import Scene, SceneComment
from mower.utils.solver import BaseSolver
DG = nx.DiGraph()
def edge(v_from: int, v_to: int, interval: int | None = None):
if interval is None:
if Scene.INDEX in [v_from, v_to]:
interval = 5
else:
interval = 1
def decorator(func):
DG.add_edge(v_from, v_to, weight=interval, transition=func)
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
return wrapper
return decorator
class SceneGraphSolver(BaseSolver):
def scene_graph_navigation(self, scene: int):
"""按场景图跳转到指定场景"""
while self.scene() != scene:
self.scene_graph_step(scene)
def scene_graph_step(self, scene: int):
"""waiting_solver()或按场景图跳转到指定场景只操作一步"""
if scene not in DG.nodes:
logger.error(f"{SceneComment[scene]}不在场景图中")
self.sleep()
return
if (current := self.scene()) in self.waiting_scene:
if self.waiting_solver():
return
else:
current = self.scene()
if current == scene:
return
if current not in DG.nodes:
logger.debug(f"{SceneComment[current]}不在场景图中")
self.sleep(10)
return
try:
sp = nx.shortest_path(DG, current, scene, weight="weight")
except Exception as e:
logger.exception(f"场景图路径计算异常:{e}")
self.sleep(10)
return
logger.debug(sp)
next_scene = sp[1]
transition = DG.edges[current, next_scene]["transition"]
try:
transition(self)
except MowerExit:
raise
except Exception as e:
logger.exception(f"场景转移异常:{e}")
self.sleep()
def back_to_index(self):
self.scene_graph_navigation(Scene.INDEX)
def back_to_infrastructure(self):
self.scene_graph_navigation(Scene.INFRA_MAIN)