改写战斗中替换group的逻辑
This commit is contained in:
commit
7f89eb0db8
3890 changed files with 82290 additions and 0 deletions
31
mower/utils/graph/__init__.py
Normal file
31
mower/utils/graph/__init__.py
Normal 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",
|
||||
]
|
46
mower/utils/graph/extra.py
Normal file
46
mower/utils/graph/extra.py
Normal 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)
|
26
mower/utils/graph/friend.py
Normal file
26
mower/utils/graph/friend.py
Normal 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
129
mower/utils/graph/index.py
Normal 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")
|
17
mower/utils/graph/mission.py
Normal file
17
mower/utils/graph/mission.py
Normal 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")
|
90
mower/utils/graph/navbar.py
Normal file
90
mower/utils/graph/navbar.py
Normal 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")
|
38
mower/utils/graph/operation.py
Normal file
38
mower/utils/graph/operation.py
Normal 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))
|
26
mower/utils/graph/recruit.py
Normal file
26
mower/utils/graph/recruit.py
Normal 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
75
mower/utils/graph/riic.py
Normal 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
29
mower/utils/graph/shop.py
Normal 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
29
mower/utils/graph/sss.py
Normal 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)
|
30
mower/utils/graph/terminal.py
Normal file
30
mower/utils/graph/terminal.py
Normal 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))
|
81
mower/utils/graph/utils.py
Normal file
81
mower/utils/graph/utils.py
Normal 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)
|
Loading…
Add table
Add a link
Reference in a new issue