场景图导航改写为solver
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful

This commit is contained in:
zhbaor 2025-01-30 10:14:54 +08:00
parent 8bfc70d7c3
commit c86e7ac651
80 changed files with 225 additions and 184 deletions

View file

@ -42,10 +42,11 @@ from mower.utils.scheduler_task import (
scheduling, scheduling,
try_add_release_dorm, try_add_release_dorm,
) )
from mower.utils.solver import BaseSolver
from mower.utils.translate import translate_room from mower.utils.translate import translate_room
class BaseSchedulerSolver(SceneGraphSolver, BaseMixin): class BaseSchedulerSolver(BaseSolver, BaseMixin):
solver_name = "经典版" solver_name = "经典版"
def __init__(self) -> None: def __init__(self) -> None:
@ -198,7 +199,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
elif scene == Scene.RIIC_OPERATOR_SELECT: elif scene == Scene.RIIC_OPERATOR_SELECT:
self.tap("confirm_blue") self.tap("confirm_blue")
else: else:
self.scene_graph_navigation(Scene.INFRA_MAIN) SceneGraphSolver().navigation(Scene.INFRA_MAIN)
def enter_room(self, room): def enter_room(self, room):
EnterRoomSolver().run(room) EnterRoomSolver().run(room)
@ -669,7 +670,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
and config.conf.run_order_buffer_time > 0 and config.conf.run_order_buffer_time > 0
): ):
logger.info("跑单前返回主界面以保持登录状态") logger.info("跑单前返回主界面以保持登录状态")
self.back_to_index() SceneGraphSolver().navigation(Scene.INDEX)
self.refresh_connecting = True self.refresh_connecting = True
return return
self.refresh_connecting = False self.refresh_connecting = False
@ -1001,7 +1002,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
unknown_cnt += 1 unknown_cnt += 1
if unknown_cnt > 5: if unknown_cnt > 5:
unknown_cnt = 0 unknown_cnt = 0
self.back_to_infrastructure() SceneGraphSolver.navigation(Scene.INFRA_MAIN)
self.enter_room("train") self.enter_room("train")
else: else:
self.sleep() self.sleep()
@ -1039,7 +1040,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
unknown_cnt += 1 unknown_cnt += 1
if unknown_cnt > 5: if unknown_cnt > 5:
unknown_cnt = 0 unknown_cnt = 0
self.back_to_infrastructure() SceneGraphSolver.navigation(Scene.INFRA_MAIN)
self.enter_room("train") self.enter_room("train")
else: else:
self.sleep() self.sleep()
@ -1653,7 +1654,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
- timedelta(seconds=(60 * config.conf.run_order_delay)) - timedelta(seconds=(60 * config.conf.run_order_delay))
) )
logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S")) logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S"))
self.scene_graph_navigation(Scene.INFRA_MAIN) SceneGraphSolver().navigation(Scene.INFRA_MAIN)
return execute_time return execute_time
def adjust_order_time(self, accelerate, room): def adjust_order_time(self, accelerate, room):
@ -2180,13 +2181,13 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
if "检测到安排干员未成功" in str(e): if "检测到安排干员未成功" in str(e):
skip_enter = True skip_enter = True
continue continue
self.scene_graph_navigation(Scene.INFRA_MAIN) SceneGraphSolver().navigation(Scene.INFRA_MAIN)
continue continue
if len(new_plan) != 1: if len(new_plan) != 1:
self.scene_graph_navigation(Scene.INFRA_MAIN) SceneGraphSolver().navigation(Scene.INFRA_MAIN)
else: else:
if config.conf.run_order_buffer_time <= 0: if config.conf.run_order_buffer_time <= 0:
self.scene_graph_navigation(Scene.INFRA_MAIN) SceneGraphSolver().navigation(Scene.INFRA_MAIN)
return new_plan return new_plan
def move_free_to_end(self, input_list): def move_free_to_end(self, input_list):

View file

@ -11,10 +11,11 @@ from mower.utils.image import crop2content, cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va from mower.utils.vector import sa, va
class CreditSolver(SceneGraphSolver): class CreditSolver(BaseSolver):
solver_name = "访问好友" solver_name = "访问好友"
def run(self) -> None: def run(self) -> None:
@ -94,4 +95,4 @@ class CreditSolver(SceneGraphSolver):
else: else:
return True return True
else: else:
self.scene_graph_step(Scene.FRIEND_LIST) SceneGraphSolver().step(Scene.FRIEND_LIST)

View file

@ -15,6 +15,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import loadimg from mower.utils.image import loadimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
# 向下x变大 = 0 # 向下x变大 = 0
# 向右y变大 = 0 # 向右y变大 = 0
@ -154,7 +155,7 @@ def 经验卡分类(物品):
pass pass
class depotREC(SceneGraphSolver): class depotREC(BaseSolver):
solver_name = "仓库识别" solver_name = "仓库识别"
def __init__(self) -> None: def __init__(self) -> None:
@ -255,7 +256,7 @@ class depotREC(SceneGraphSolver):
return # 正确结束 return # 正确结束
else: else:
self.scene_graph_step(Scene.DEPOT) SceneGraphSolver().step(Scene.DEPOT)
return return
def 对比截图(self, image1, image2): def 对比截图(self, image1, image2):

View file

@ -4,12 +4,13 @@ from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.tile_pos import Calc, find_level from mower.utils.tile_pos import Calc, find_level
from .mixin import FightMixin from .mixin import FightMixin
class AutoFight(SceneGraphSolver, FightMixin): class AutoFight(BaseSolver, FightMixin):
solver_name = "自动战斗" solver_name = "自动战斗"
def run( def run(
@ -52,7 +53,7 @@ class AutoFight(SceneGraphSolver, FightMixin):
def breach_solver(self): def breach_solver(self):
if (strategy := config.conf.work.enemy_breach_strategy) == "give_up": if (strategy := config.conf.work.enemy_breach_strategy) == "give_up":
self.scene_graph_navigation(Scene.OPERATOR_FAILED) SceneGraphSolver().navigation(Scene.OPERATOR_FAILED)
elif strategy == "restart_game": elif strategy == "restart_game":
config.device.exit() config.device.exit()
self.success = False self.success = False

View file

@ -1,7 +1,7 @@
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .battle_agent_choose import BattleAgentChooseSolver from .battle_agent_choose import BattleAgentChooseSolver
from .battle_fill_choose import BattleFillChooseSolver from .battle_fill_choose import BattleFillChooseSolver
@ -9,7 +9,7 @@ from .check_current_team import CheckCurrentTeamSolver
from .choose_squad import ChooseSquadSolver from .choose_squad import ChooseSquadSolver
class BattleChooseSolver(SceneGraphSolver): class BattleChooseSolver(BaseSolver):
solver_name = "战斗选人" solver_name = "战斗选人"
def run( def run(

View file

@ -8,13 +8,13 @@ from mower.utils import config
from mower.utils.character_recognize import ( from mower.utils.character_recognize import (
operator_team_select, operator_team_select,
) )
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg, diff_ratio from mower.utils.image import cropimg, diff_ratio
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class BattleAgentChooseSolver(SceneGraphSolver): class BattleAgentChooseSolver(BaseSolver):
solver_name = "战斗选择指定干员" solver_name = "战斗选择指定干员"
def run(self, agents: list) -> list: def run(self, agents: list) -> list:

View file

@ -2,14 +2,14 @@ from mower.solvers.fight.battle_choose.battle_filter import BattleFilterSolver
from mower.solvers.fight.battle_choose.battle_tag_choose import BattleTagChoose from mower.solvers.fight.battle_choose.battle_tag_choose import BattleTagChoose
from mower.utils import config from mower.utils import config
from mower.utils.character_recognize import operator_team_select from mower.utils.character_recognize import operator_team_select
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg, diff_ratio from mower.utils.image import cropimg, diff_ratio
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
# 按需填充干员 # 按需填充干员
class BattleFillChooseSolver(SceneGraphSolver): class BattleFillChooseSolver(BaseSolver):
solver_name = "标签填充干员" solver_name = "标签填充干员"
def run(self, label: str, number: int, black_list: list = []): def run(self, label: str, number: int, black_list: list = []):

View file

@ -4,12 +4,12 @@ import cv2
import numpy as np import numpy as np
from mower.utils import config from mower.utils import config
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class BattleFilterSolver(SceneGraphSolver): class BattleFilterSolver(BaseSolver):
def run(self, tag: str, ascending: bool = True) -> None: def run(self, tag: str, ascending: bool = True) -> None:
self.labels = [ self.labels = [
"获取时间", "获取时间",

View file

@ -1,9 +1,9 @@
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class BattleTagChoose(SceneGraphSolver): class BattleTagChoose(BaseSolver):
def run(self, tag) -> None: def run(self, tag) -> None:
self.tag = tag self.tag = tag
self.first_tag = None self.first_tag = None

View file

@ -4,17 +4,17 @@ from skimage.metrics import structural_similarity
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.character_recognize import operator_team from mower.utils.character_recognize import operator_team
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, load_static from mower.utils.image import cmatch, cropimg, load_static
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa from mower.utils.vector import sa
from .choose_skill import ChooseSkillSolver from .choose_skill import ChooseSkillSolver
from .choose_support import ChooseSupportSolver from .choose_support import ChooseSupportSolver
class CheckCurrentTeamSolver(SceneGraphSolver): class CheckCurrentTeamSolver(BaseSolver):
solver_name = "检测当前编队" solver_name = "检测当前编队"
def run(self, opers: tp.Opers = [], groups: tp.Groups = [], support: bool = True): def run(self, opers: tp.Opers = [], groups: tp.Groups = [], support: bool = True):

View file

@ -2,13 +2,13 @@ import cv2
from scipy.signal import argrelmax from scipy.signal import argrelmax
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ChooseSkillSolver(SceneGraphSolver): class ChooseSkillSolver(BaseSolver):
solver_name = "选择干员技能" solver_name = "选择干员技能"
def run(self, skill: int): def run(self, skill: int):

View file

@ -1,13 +1,13 @@
import cv2 import cv2
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ChooseSquadSolver(SceneGraphSolver): class ChooseSquadSolver(BaseSolver):
solver_name = "选择编队" solver_name = "选择编队"
def run(self, squad: int): def run(self, squad: int):

View file

@ -12,6 +12,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres, thres2 from mower.utils.image import cmatch, cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
profession_pos = { profession_pos = {
"PIONEER": ((30, 150), (40, 160)), "PIONEER": ((30, 150), (40, 160)),
@ -30,7 +31,7 @@ skill_pos = (
) )
class ChooseSupportSolver(SceneGraphSolver): class ChooseSupportSolver(BaseSolver):
solver_name = "选择助战干员" solver_name = "选择助战干员"
def run(self, opers: list = [], mode: Literal["normal", "rogue"] = "normal"): def run(self, opers: list = [], mode: Literal["normal", "rogue"] = "normal"):
@ -150,7 +151,7 @@ class ChooseSupportSolver(SceneGraphSolver):
if self.animation(): if self.animation():
return return
if self.retry_times < 0: if self.retry_times < 0:
self.scene_graph_step(Scene.OPERATOR_SELECT) SceneGraphSolver().step(Scene.OPERATOR_SELECT)
return return
if not self.check_profession_focus(): if not self.check_profession_focus():
self.tap(profession_pos[self.profession]) self.tap(profession_pos[self.profession])

View file

@ -5,12 +5,12 @@ from mower.solvers.fight.battle_choose import BattleChooseSolver
from mower.solvers.navigation import NavigationSolver from mower.solvers.navigation import NavigationSolver
from mower.utils import config from mower.utils import config
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class CopyWorksSolver(SceneGraphSolver): class CopyWorksSolver(BaseSolver):
solver_name = "自动抄作业列表" solver_name = "自动抄作业列表"
def run(self): def run(self):

View file

@ -7,16 +7,16 @@ from skimage.metrics import structural_similarity
from mower.solvers.navigation import NavigationSolver from mower.solvers.navigation import NavigationSolver
from mower.utils import config from mower.utils import config
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .auto_fight import AutoFight from .auto_fight import AutoFight
from .battle_choose import BattleChooseSolver from .battle_choose import BattleChooseSolver
class CreditFight(SceneGraphSolver): class CreditFight(BaseSolver):
solver_name = "信用作战" solver_name = "信用作战"
def run(self): def run(self):

View file

@ -12,9 +12,10 @@ from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin): class RIIC_ChooseSolver(BaseSolver, BaseMixin):
solver_name = "基建选人" solver_name = "基建选人"
def run(self, room: str, agents: list, wait_time: float = 0) -> bool: def run(self, room: str, agents: list, wait_time: float = 0) -> bool:
@ -221,9 +222,9 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
else: else:
self.tap((500, 970)) self.tap((500, 970))
elif scene == Scene.INFRA_ARRANGE_ORDER: elif scene == Scene.INFRA_ARRANGE_ORDER:
self.scene_graph_step(Scene.RIIC_OPERATOR_SELECT) SceneGraphSolver().step(Scene.RIIC_OPERATOR_SELECT)
elif scene == Scene.INFRA_ARRANGE_CONFIRM: elif scene == Scene.INFRA_ARRANGE_CONFIRM:
self.scene_graph_step(Scene.RIIC_OPERATOR_SELECT) SceneGraphSolver().step(Scene.RIIC_OPERATOR_SELECT)
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -1,13 +1,13 @@
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils import clue_cls from .utils import clue_cls
class DailySolver(SceneGraphSolver, BaseMixin): class DailySolver(BaseSolver, BaseMixin):
solver_name = "每日线索领取" solver_name = "每日线索领取"
def run(self) -> None: def run(self) -> None:

View file

@ -1,12 +1,12 @@
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class GetClueCountSolver(SceneGraphSolver, BaseMixin): class GetClueCountSolver(BaseSolver, BaseMixin):
solver_name = "线索数量" solver_name = "线索数量"
def run(self) -> int: def run(self) -> int:

View file

@ -1,17 +1,17 @@
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, crop2content, cropimg, loadres, thres2 from mower.utils.image import cmatch, crop2content, cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
from .utils import clue_cls, clue_scope from .utils import clue_cls, clue_scope
class GiveAwaySolver(SceneGraphSolver, BaseMixin): class GiveAwaySolver(BaseSolver, BaseMixin):
solver_name = "传递线索" solver_name = "传递线索"
def run(self, clue_count) -> None: def run(self, clue_count) -> None:

View file

@ -3,11 +3,11 @@ from datetime import timedelta
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class MessageBoard(SceneGraphSolver, BaseMixin): class MessageBoard(BaseSolver, BaseMixin):
solver_name = "留言板" solver_name = "留言板"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)

View file

@ -3,14 +3,14 @@ from datetime import timedelta
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
class PartyTimeSolver(SceneGraphSolver, BaseMixin): class PartyTimeSolver(BaseSolver, BaseMixin):
solver_name = "线索交流结束时间" solver_name = "线索交流结束时间"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)

View file

@ -3,11 +3,11 @@ import cv2
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import crop2content, cropimg, loadres, thres2 from mower.utils.image import crop2content, cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
from .utils import ( from .utils import (
@ -27,7 +27,7 @@ filter_receive = (1900, 45)
filter_self = (1610, 70) filter_self = (1610, 70)
class PlaceSolver(SceneGraphSolver, BaseMixin): class PlaceSolver(BaseSolver, BaseMixin):
solver_name = "放置线索" solver_name = "放置线索"
def run(self) -> None: def run(self) -> None:

View file

@ -1,16 +1,16 @@
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils import clue_cls, exit_pos from .utils import clue_cls, exit_pos
class ReceiveSolver(SceneGraphSolver, BaseMixin): class ReceiveSolver(BaseSolver, BaseMixin):
solver_name = "接收好友线索" solver_name = "接收好友线索"
def run(self): def run(self):

View file

@ -3,12 +3,12 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.digit_reader import get_drone from mower.utils.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class DroneSolver(SceneGraphSolver, BaseMixin): class DroneSolver(BaseSolver, BaseMixin):
solver_name = "无人机加速" solver_name = "无人机加速"
def run( def run(

View file

@ -6,6 +6,7 @@ from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.translate import translate_room from mower.utils.translate import translate_room
from mower.utils.vector import sm, va from mower.utils.vector import sm, va
@ -85,7 +86,7 @@ facility = {
} }
class EnterRoomSolver(SceneGraphSolver, BaseMixin): class EnterRoomSolver(BaseSolver, BaseMixin):
solver_name = "进入房间" solver_name = "进入房间"
def run(self, room: str, detail: bool = True): def run(self, room: str, detail: bool = True):
@ -154,4 +155,4 @@ class EnterRoomSolver(SceneGraphSolver, BaseMixin):
): ):
self.ctap(pos, 1, id="enter_room") self.ctap(pos, 1, id="enter_room")
else: else:
self.scene_graph_step(Scene.INFRA_MAIN) SceneGraphSolver().step(Scene.INFRA_MAIN)

View file

@ -2,12 +2,12 @@ import cv2
import numpy as np import numpy as np
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_Filter(SceneGraphSolver): class RIIC_Filter(BaseSolver):
solver_name = "排序" solver_name = "排序"
def run(self, tag: str, ascending: bool = True) -> None: def run(self, tag: str, ascending: bool = True) -> None:

View file

@ -6,8 +6,8 @@ from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2 from mower.utils.image import cropimg, thres2
from mower.utils.solver import BaseSolver
name_x = (1288, 1869) name_x = (1288, 1869)
name_y = [(135, 326), (344, 535), (553, 744), (532, 723), (741, 932)] name_y = [(135, 326), (344, 535), (553, 744), (532, 723), (741, 932)]
@ -20,7 +20,7 @@ time_y = [(270, 305), (480, 515), (690, 725), (668, 703), (877, 912)]
time_p = [tuple(zip(time_x, y)) for y in time_y] time_p = [tuple(zip(time_x, y)) for y in time_y]
class GetAgentFromRoomSolver(SceneGraphSolver, BaseMixin): class GetAgentFromRoomSolver(BaseSolver, BaseMixin):
solver_name = "读取干员信息" solver_name = "读取干员信息"
def run(self, room: str, read_agent_time=False): def run(self, room: str, read_agent_time=False):

View file

@ -4,12 +4,12 @@ from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class GetOrderRemainingTimeSolver(SceneGraphSolver, BaseMixin): class GetOrderRemainingTimeSolver(BaseSolver, BaseMixin):
solver_name = "订单剩余时间" solver_name = "订单剩余时间"
def run(self, room: str) -> int: def run(self, room: str) -> int:

View file

@ -3,9 +3,10 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import diff_ratio from mower.utils.image import diff_ratio
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class Overview(SceneGraphSolver): class Overview(BaseSolver):
solver_name = "进驻总览" solver_name = "进驻总览"
def transition(self): def transition(self):
@ -22,4 +23,4 @@ class Overview(SceneGraphSolver):
return True return True
self.solver_update_before_transition = False self.solver_update_before_transition = False
else: else:
self.scene_graph_step(Scene.INFRA_ARRANGE) SceneGraphSolver().step(Scene.INFRA_ARRANGE)

View file

@ -5,12 +5,12 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ReloadSolver(SceneGraphSolver, BaseMixin): class ReloadSolver(BaseSolver, BaseMixin):
solver_name = "搓玉补货" solver_name = "搓玉补货"
def run(self, room) -> None: def run(self, room) -> None:

View file

@ -13,6 +13,7 @@ from mower.utils.image import cropimg, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.path import get_path from mower.utils.path import get_path
from mower.utils.recognize import Scene, tp from mower.utils.recognize import Scene, tp
from mower.utils.solver import BaseSolver
Base = declarative_base() Base = declarative_base()
@ -31,7 +32,7 @@ class Report(Base):
合成玉订单数量 = Column(Integer) 合成玉订单数量 = Column(Integer)
class ReportSolver(SceneGraphSolver): class ReportSolver(BaseSolver):
solver_name = "基报读取" solver_name = "基报读取"
def __init__(self) -> None: def __init__(self) -> None:
@ -67,7 +68,7 @@ class ReportSolver(SceneGraphSolver):
if (scene := self.scene()) == Scene.RIIC_REPORT: if (scene := self.scene()) == Scene.RIIC_REPORT:
return self.read_report() return self.read_report()
elif scene == Scene.CTRLCENTER_ASSISTANT: elif scene == Scene.CTRLCENTER_ASSISTANT:
self.scene_graph_step(Scene.RIIC_REPORT) SceneGraphSolver().step(Scene.RIIC_REPORT)
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -4,13 +4,13 @@ from mower.solvers.infra.filter import RIIC_Filter
from mower.solvers.infra.riic_tag_choose import RIICTagChoose from mower.solvers.infra.riic_tag_choose import RIICTagChoose
from mower.utils import config from mower.utils import config
from mower.utils.character_recognize import operator_room_select from mower.utils.character_recognize import operator_room_select
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_FreeFillSolver(SceneGraphSolver): class RIIC_FreeFillSolver(BaseSolver):
def run(self) -> bool: def run(self) -> bool:
self.agent = None self.agent = None
self.filterd = False self.filterd = False

View file

@ -1,6 +1,6 @@
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
professions = [ professions = [
"PIONEER", "PIONEER",
@ -14,7 +14,7 @@ professions = [
] ]
class RIICTagChoose(SceneGraphSolver): class RIICTagChoose(BaseSolver):
def run(self, tag) -> None: def run(self, tag) -> None:
self.tag = tag self.tag = tag
self.first_tag = None self.first_tag = None

View file

@ -6,8 +6,8 @@ from mower.solvers.infra.get_order_remaining_time import (
) )
from mower.utils import config from mower.utils import config
from mower.utils.digit_reader import get_drone from mower.utils.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.solver import BaseSolver
from .read_original_order_remaining_time import ReadOriginalOrderRemainTimeSolver from .read_original_order_remaining_time import ReadOriginalOrderRemainTimeSolver
from .wait_for_order import WaitForOrderSolver from .wait_for_order import WaitForOrderSolver
@ -15,7 +15,7 @@ from .wait_for_order import WaitForOrderSolver
limit_time = 1800 limit_time = 1800
class RunOrderSolver(SceneGraphSolver): class RunOrderSolver(BaseSolver):
solver_name = "跑单" solver_name = "跑单"
def run( def run(

View file

@ -2,11 +2,11 @@ from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ReadOriginalOrderRemainTimeSolver(SceneGraphSolver, BaseMixin): class ReadOriginalOrderRemainTimeSolver(BaseSolver, BaseMixin):
""" """
返回剩余时间,换算为秒 返回剩余时间,换算为秒
""" """

View file

@ -2,11 +2,11 @@ from datetime import datetime, timedelta
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class WaitForOrderSolver(SceneGraphSolver, BaseMixin): class WaitForOrderSolver(BaseSolver, BaseMixin):
def run(self, room, wait_time) -> None: def run(self, room, wait_time) -> None:
self.room = room self.room = room
self.wait_start() self.wait_start()

View file

@ -4,14 +4,14 @@ from mower.solvers.fight.battle_choose.battle_fill_choose import BattleFillChoos
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.utils import config from mower.utils import config
from mower.utils.character_recognize import match_portrait from mower.utils.character_recognize import match_portrait
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import ss from mower.utils.vector import ss
from .enter_activity import EnterActivitySolver from .enter_activity import EnterActivitySolver
class SwitchActivityUsersSolver(SceneGraphSolver, BaseMixin): class SwitchActivityUsersSolver(BaseSolver, BaseMixin):
solver_name = "切换活动室使用者" solver_name = "切换活动室使用者"
def run(self): def run(self):

View file

@ -6,9 +6,10 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class EnterActivitySolver(SceneGraphSolver, BaseMixin): class EnterActivitySolver(BaseSolver, BaseMixin):
solver_name = "进入活动室" solver_name = "进入活动室"
activity_scope = { activity_scope = {
1: ((1521, 410), (1620, 443)), 1: ((1521, 410), (1620, 443)),
@ -61,4 +62,4 @@ class EnterActivitySolver(SceneGraphSolver, BaseMixin):
return True return True
else: else:
self.scene_graph_step(Scene.INFRA_MAIN) SceneGraphSolver().step(Scene.INFRA_MAIN)

View file

@ -8,6 +8,7 @@ from mower.utils.email import assistants_template, send_message
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
pos_name = ["控制中枢", "B1", "B2", "B3", "B4"] pos_name = ["控制中枢", "B1", "B2", "B3", "B4"]
@ -28,7 +29,7 @@ portrait_scope = [
] ]
class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin): class SwitchAssistantsSolver(BaseSolver, BaseMixin):
solver_name = "基建副手" solver_name = "基建副手"
def run(self) -> None: def run(self) -> None:
@ -110,7 +111,7 @@ class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin):
self.ctap("choose_agent/battle_confirm", 3) self.ctap("choose_agent/battle_confirm", 3)
elif scene == Scene.CTRLCENTER_ASSISTANT: elif scene == Scene.CTRLCENTER_ASSISTANT:
self.scene_graph_step(Scene.RIIC_REPORT) SceneGraphSolver().step(Scene.RIIC_REPORT)
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -3,11 +3,12 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
check_order_scope = {"lmb": ((750, 796), (803, 849)), "oru": ((1111, 796), (1164, 849))} check_order_scope = {"lmb": ((750, 796), (803, 849)), "oru": ((1111, 796), (1164, 849))}
class SwitchOrderSolver(SceneGraphSolver, BaseMixin): class SwitchOrderSolver(BaseSolver, BaseMixin):
def run(self, room: str, tar_order: str): def run(self, room: str, tar_order: str):
""" """
Args: Args:
@ -33,7 +34,7 @@ class SwitchOrderSolver(SceneGraphSolver, BaseMixin):
self.tap((1500, 1000)) self.tap((1500, 1000))
elif scene == Scene.SWITCH_ORDER: elif scene == Scene.SWITCH_ORDER:
if self.find("switch_order/check", scope=self.scope): if self.find("switch_order/check", scope=self.scope):
self.scene_graph_step(Scene.ORDER_LIST) SceneGraphSolver().step(Scene.ORDER_LIST)
else: else:
self.tap(self.scope) self.tap(self.scope)

View file

@ -8,9 +8,9 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.digit_reader import get_drone from mower.utils.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2 from mower.utils.image import cropimg, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.solver import BaseSolver
from .check_current_product import CheckCurrentProductSolver from .check_current_product import CheckCurrentProductSolver
from .choose_product import ChooseProductSolver from .choose_product import ChooseProductSolver
@ -32,7 +32,7 @@ production_time = {
} }
class SwitchProductSolver(SceneGraphSolver, BaseMixin): class SwitchProductSolver(BaseSolver, BaseMixin):
solver_name = "切换产物" solver_name = "切换产物"
def run(self, room, tar_product, only_get_time=False): def run(self, room, tar_product, only_get_time=False):

View file

@ -2,13 +2,13 @@ from datetime import datetime, timedelta
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils import product from .utils import product
class CheckCurrentProductSolver(SceneGraphSolver, BaseMixin): class CheckCurrentProductSolver(BaseSolver, BaseMixin):
solver_name = "检查当前产物" solver_name = "检查当前产物"
def run(self, room) -> None: def run(self, room) -> None:

View file

@ -5,10 +5,10 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
production_index = { production_index = {
"经验": [0, 1], "经验": [0, 1],
@ -28,7 +28,7 @@ first_pos = [((180, 215 + 140 * i), (190, 225 + 140 * i)) for i in range(4)]
second_pos = [(500 + 742 * j, 200 + 270 * i) for j in range(2) for i in range(4)] second_pos = [(500 + 742 * j, 200 + 270 * i) for j in range(2) for i in range(4)]
class ChooseProductSolver(SceneGraphSolver, BaseMixin): class ChooseProductSolver(BaseSolver, BaseMixin):
solver_name = "选择产物" solver_name = "选择产物"
def run(self, room, tar_product) -> bool: def run(self, room, tar_product) -> bool:

View file

@ -2,11 +2,11 @@ from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class GetRemainTimeSolver(SceneGraphSolver, BaseMixin): class GetRemainTimeSolver(BaseSolver, BaseMixin):
solver_name = "获取剩余时间" solver_name = "获取剩余时间"
def run( def run(

View file

@ -2,11 +2,11 @@ from datetime import datetime, timedelta
from mower.solvers.infra.base_mixin import BaseMixin from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class WaitForProductSolver(SceneGraphSolver, BaseMixin): class WaitForProductSolver(BaseSolver, BaseMixin):
solver_name = "等待产物完成" solver_name = "等待产物完成"
def run(self, room, wait_time) -> None: def run(self, room, wait_time) -> None:

View file

@ -2,11 +2,12 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
collect = {"bill": "订单", "factory": "制造站产物", "trust": "信赖"} collect = {"bill": "订单", "factory": "制造站产物", "trust": "信赖"}
class TodoListSolver(SceneGraphSolver): class TodoListSolver(BaseSolver):
solver_name = "收取产物" solver_name = "收取产物"
def run(self): def run(self):
@ -25,7 +26,7 @@ class TodoListSolver(SceneGraphSolver):
elif scene == Scene.INFRA_TODOLIST: elif scene == Scene.INFRA_TODOLIST:
if self.success: if self.success:
self.scene_graph_step(Scene.INFRA_MAIN) SceneGraphSolver().step(Scene.INFRA_MAIN)
for res, name in collect.items(): for res, name in collect.items():
score, pos = config.recog.match(f"todo_list/{res}") score, pos = config.recog.match(f"todo_list/{res}")
if score > 0.8: if score > 0.8:
@ -35,4 +36,4 @@ class TodoListSolver(SceneGraphSolver):
self.success = True self.success = True
else: else:
self.scene_graph_step(Scene.INFRA_MAIN) SceneGraphSolver().step(Scene.INFRA_MAIN)

View file

@ -4,9 +4,10 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class MailSolver(SceneGraphSolver): class MailSolver(BaseSolver):
solver_name = "领取邮件" solver_name = "领取邮件"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)
@ -34,4 +35,4 @@ class MailSolver(SceneGraphSolver):
else: else:
return True return True
else: else:
self.scene_graph_step(Scene.MAIL) SceneGraphSolver().step(Scene.MAIL)

View file

@ -2,9 +2,10 @@ from datetime import timedelta
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class MissionSolver(SceneGraphSolver): class MissionSolver(BaseSolver):
solver_name = "每日/每周任务" solver_name = "每日/每周任务"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)
@ -35,4 +36,4 @@ class MissionSolver(SceneGraphSolver):
return return
return True return True
else: else:
self.scene_graph_step(Scene.MISSION_DAILY) SceneGraphSolver().step(Scene.MISSION_DAILY)

View file

@ -9,6 +9,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres from mower.utils.image import cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va, vs from mower.utils.vector import va, vs
from .activity import ActivityNavigation from .activity import ActivityNavigation
@ -430,7 +431,7 @@ difficulty_str = [
] ]
class NavigationSolver(SceneGraphSolver): class NavigationSolver(BaseSolver):
solver_name = "关卡导航" solver_name = "关卡导航"
def run(self, name: str, mode: Literal["auto", "copy"] = "auto") -> bool: def run(self, name: str, mode: Literal["auto", "copy"] = "auto") -> bool:
@ -677,7 +678,7 @@ class NavigationSolver(SceneGraphSolver):
if self.change_to is not None: if self.change_to is not None:
logger.info(f"{self.name} 无法代理") logger.info(f"{self.name} 无法代理")
self.success = False self.success = False
self.back_to_index() SceneGraphSolver.navigation(Scene.INDEX)
return True return True
if self.find("ope_agency_lock"): if self.find("ope_agency_lock"):
self.change_to = self.now_difficulty ^ 1 self.change_to = self.now_difficulty ^ 1
@ -713,4 +714,4 @@ class NavigationSolver(SceneGraphSolver):
elif scene == Scene.STORY_STAGE: elif scene == Scene.STORY_STAGE:
self.tap("start_story") self.tap("start_story")
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -7,6 +7,7 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va, vs from mower.utils.vector import va, vs
from .utils import generate_name from .utils import generate_name
@ -24,7 +25,7 @@ class classproperty:
return self return self
class ActivityNavigation(SceneGraphSolver): class ActivityNavigation(BaseSolver):
solver_name = "活动关卡导航" solver_name = "活动关卡导航"
_location = { _location = {
@ -143,4 +144,4 @@ class ActivityNavigation(SceneGraphSolver):
self.tap("start_story") self.tap("start_story")
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -7,12 +7,13 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, template from mower.utils.image import cropimg, loadres, template
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, vs from mower.utils.vector import sa, vs
from .utils import generate_name from .utils import generate_name
class ActivityNavigation(SceneGraphSolver): class ActivityNavigation(BaseSolver):
solver_name = "活动关卡导航" solver_name = "活动关卡导航"
prefix = "RS" prefix = "RS"
@ -141,4 +142,4 @@ class ActivityNavigation(SceneGraphSolver):
self.tap("start_story") self.tap("start_story")
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -7,11 +7,12 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2 from mower.utils.image import cropimg, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import last_letters from .utils import last_letters
class LastStageNavigation(SceneGraphSolver): class LastStageNavigation(BaseSolver):
def run( def run(
self, name: str, mode: Literal["auto", "copy"] = "auto", switch_to_ex=False self, name: str, mode: Literal["auto", "copy"] = "auto", switch_to_ex=False
) -> bool: ) -> bool:
@ -20,7 +21,7 @@ class LastStageNavigation(SceneGraphSolver):
self.mode = mode self.mode = mode
self.success = True self.success = True
if self.name != "": if self.name != "":
self.scene_graph_navigation(Scene.TERMINAL_MAIN) SceneGraphSolver().navigation(Scene.TERMINAL_MAIN)
super().run() super().run()
return self.success return self.success
@ -92,4 +93,4 @@ class LastStageNavigation(SceneGraphSolver):
return True return True
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -13,6 +13,7 @@ from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
profession_list = [ profession_list = [
@ -38,7 +39,7 @@ for name, data in agent_list.items():
templates[data["profession"]][name] = tpl, msk, eng templates[data["profession"]][name] = tpl, msk, eng
class OperatorSolver(SceneGraphSolver): class OperatorSolver(BaseSolver):
def run(self): def run(self):
self.last_operator = "" self.last_operator = ""
self.repeat_count = 2 self.repeat_count = 2
@ -203,4 +204,4 @@ class OperatorSolver(SceneGraphSolver):
else: else:
if self.in_progress and scene != Scene.CONNECTING: if self.in_progress and scene != Scene.CONNECTING:
self.wait += 0.01 self.wait += 0.01
self.scene_graph_step(Scene.OPERATOR_MANAGEMENT) SceneGraphSolver().step(Scene.OPERATOR_MANAGEMENT)

View file

@ -9,12 +9,12 @@ import numpy as np
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.csleep import MowerExit from mower.utils.csleep import MowerExit
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, thres2 from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.matcher import Matcher from mower.utils.matcher import Matcher
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
src_pts = np.float32([[0, 97], [1920, 97], [-400, 1080], [2320, 1080]]) src_pts = np.float32([[0, 97], [1920, 97], [-400, 1080], [2320, 1080]])
dst_pts = np.float32([[0, 0], [1920, 0], [0, 1000], [1920, 1000]]) dst_pts = np.float32([[0, 0], [1920, 0], [0, 1000], [1920, 1000]])
@ -41,7 +41,7 @@ class Map:
return scope if score >= 0.5 else score return scope if score >= 0.5 else score
class ReclamationAlgorithm(SceneGraphSolver): class ReclamationAlgorithm(BaseSolver):
fast_tap_scenes = [Scene.RA_GUIDE_DIALOG] fast_tap_scenes = [Scene.RA_GUIDE_DIALOG]
places = { places = {
"base": [[1623, 588], [1943, 906]], "base": [[1623, 588], [1943, 906]],

View file

@ -14,6 +14,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres, thres2 from mower.utils.image import cmatch, cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
job_list = [ job_list = [
@ -28,7 +29,7 @@ job_list = [
] ]
class RecruitSolver(SceneGraphSolver): class RecruitSolver(BaseSolver):
solver_name = "公开招募" solver_name = "公开招募"
def run(self): def run(self):
@ -168,7 +169,7 @@ class RecruitSolver(SceneGraphSolver):
elif scene == Scene.RECRUIT_TAGS: elif scene == Scene.RECRUIT_TAGS:
if self.pos_state[self.recruit_index] is False: if self.pos_state[self.recruit_index] is False:
self.scene_graph_step(Scene.RECRUIT_MAIN) SceneGraphSolver().step(Scene.RECRUIT_MAIN)
if self.recruit_index in self.tags.keys(): if self.recruit_index in self.tags.keys():
del self.tags[self.recruit_index] del self.tags[self.recruit_index]
return return
@ -257,7 +258,7 @@ class RecruitSolver(SceneGraphSolver):
# 可能按错了,回到公招主界面重开 # 可能按错了,回到公招主界面重开
del self.tags[self.recruit_index] del self.tags[self.recruit_index]
del self.agent_choose[self.recruit_index] del self.agent_choose[self.recruit_index]
self.scene_graph_step(Scene.RECRUIT_MAIN) SceneGraphSolver().step(Scene.RECRUIT_MAIN)
return return
# # start recruit # # start recruit
@ -273,7 +274,7 @@ class RecruitSolver(SceneGraphSolver):
elif scene == Scene.RECRUIT_AGENT: elif scene == Scene.RECRUIT_AGENT:
return self.recruit_result() return self.recruit_result()
else: else:
self.scene_graph_step(Scene.RECRUIT_MAIN) SceneGraphSolver().step(Scene.RECRUIT_MAIN)
def recruit_result(self): def recruit_result(self):
# 存在读完一次没退完再读一次 # 存在读完一次没退完再读一次

View file

@ -5,6 +5,7 @@ from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .choose_next_node import ChooseNextNodeSolver, DianCiChooseNextNodeSolver from .choose_next_node import ChooseNextNodeSolver, DianCiChooseNextNodeSolver
from .choose_support_award import ChooseSupportAwardSolver from .choose_support_award import ChooseSupportAwardSolver
@ -16,7 +17,7 @@ from .rogue_shop import RogueShopSolver
from .utils.utils import detect_layer from .utils.utils import detect_layer
class RogueSolver(SceneGraphSolver): class RogueSolver(BaseSolver):
solver_name = "肉鸽" solver_name = "肉鸽"
def run(self) -> bool: def run(self) -> bool:
@ -87,7 +88,7 @@ class RogueSolver(SceneGraphSolver):
NodeOptionSelectSolver().run() NodeOptionSelectSolver().run()
elif scene in [Scene.ROGUE_LAYER_LOADING, Scene.ROGUE_NOTICE]: elif scene in [Scene.ROGUE_LAYER_LOADING, Scene.ROGUE_NOTICE]:
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
elif scene in [ elif scene in [
Scene.ROGUE_SHOP, Scene.ROGUE_SHOP,

View file

@ -6,6 +6,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, template from mower.utils.image import cropimg, loadres, template
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, vs from mower.utils.vector import sa, vs
from .lighten_load import LightenLoadSolver from .lighten_load import LightenLoadSolver
@ -15,7 +16,7 @@ from .utils.optimal_path import Path, get_optimal_path
from .utils.utils import detect_layer, get_idea_num from .utils.utils import detect_layer, get_idea_num
class ChooseNextNodeSolver(SceneGraphSolver): class ChooseNextNodeSolver(BaseSolver):
solver_name = "选择下一个节点" solver_name = "选择下一个节点"
def run(self): def run(self):
@ -93,7 +94,7 @@ class ChooseNextNodeSolver(SceneGraphSolver):
if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1): if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1):
return return
if len(data.next_step) == 0: if len(data.next_step) == 0:
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
return return
self.get_next_node_id() self.get_next_node_id()
if not self.node_id or self.find("rogue/no_refresh_time"): if not self.node_id or self.find("rogue/no_refresh_time"):
@ -103,7 +104,7 @@ class ChooseNextNodeSolver(SceneGraphSolver):
return return
scope = self.get_node_pos(self.node_id, ((200, 150), (960, 880))) scope = self.get_node_pos(self.node_id, ((200, 150), (960, 880)))
if scope[1][0] - 100 < 0 or scope[0][0] > 960: if scope[1][0] - 100 < 0 or scope[0][0] > 960:
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
return return
if not self.find("rogue/node_be_choosed", scope=sa(scope, (-150, 0))): if not self.find("rogue/node_be_choosed", scope=sa(scope, (-150, 0))):
self.tap(scope) self.tap(scope)
@ -175,7 +176,7 @@ class DianCiChooseNextNodeSolver(ChooseNextNodeSolver):
if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1): if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1):
return return
if len(data.next_step) == 0: if len(data.next_step) == 0:
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
return return
self.get_next_node_id() self.get_next_node_id()
if not self.node_id or self.find("rogue/no_refresh_time"): if not self.node_id or self.find("rogue/no_refresh_time"):

View file

@ -1,10 +1,10 @@
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils.utils import find_text from .utils.utils import find_text
class ChooseSupportAwardSolver(SceneGraphSolver): class ChooseSupportAwardSolver(BaseSolver):
solver_name = "选择支援奖励" solver_name = "选择支援奖励"
_award = [ _award = [
"更多补给品", "更多补给品",

View file

@ -1,8 +1,9 @@
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class LightenLoadSolver(SceneGraphSolver): class LightenLoadSolver(BaseSolver):
solver_name = "减轻负荷" solver_name = "减轻负荷"
def run(self): def run(self):
@ -17,7 +18,7 @@ class LightenLoadSolver(SceneGraphSolver):
if self.animation(interval=0.2): if self.animation(interval=0.2):
return return
if not self.find("rogue/Sarkaz_load/block"): if not self.find("rogue/Sarkaz_load/block"):
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
return return
if self.find("rogue/Sarkaz_load/concentrate"): if self.find("rogue/Sarkaz_load/concentrate"):
self.check = True self.check = True

View file

@ -4,11 +4,12 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils.utils import find_text from .utils.utils import find_text
class NodeOptionSelectSolver(SceneGraphSolver): class NodeOptionSelectSolver(BaseSolver):
solver_name = "节点选项选择" solver_name = "节点选项选择"
@cached_property @cached_property
@ -63,6 +64,6 @@ class NodeOptionSelectSolver(SceneGraphSolver):
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
elif scene == Scene.ROGUE_NODE_LOADING: elif scene == Scene.ROGUE_NODE_LOADING:
self.scene_graph_step(Scene.ROGUE_MAIN) SceneGraphSolver().step(Scene.ROGUE_MAIN)
else: else:
return True return True

View file

@ -1,12 +1,12 @@
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from . import data from . import data
from .rogue_navi import RogueNaviSolver from .rogue_navi import RogueNaviSolver
class RogueAbandonExploreSolver(SceneGraphSolver): class RogueAbandonExploreSolver(BaseSolver):
solver_name = "放弃探索" solver_name = "放弃探索"
def run(self) -> bool: def run(self) -> bool:

View file

@ -4,12 +4,13 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
from .utils.utils import find_text from .utils.utils import find_text
class RogueNaviSolver(SceneGraphSolver): class RogueNaviSolver(BaseSolver):
solver_name = "肉鸽导航" solver_name = "肉鸽导航"
_title = { _title = {
"Phantom": "古堡笔记", "Phantom": "古堡笔记",
@ -46,4 +47,4 @@ class RogueNaviSolver(SceneGraphSolver):
self.success = True self.success = True
return True return True
else: else:
self.scene_graph_step(Scene.TERMINAL_LONGTERM) SceneGraphSolver().step(Scene.TERMINAL_LONGTERM)

View file

@ -1,13 +1,13 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils.utils import find_text from .utils.utils import find_text
class RogueSelectTeamSolver(SceneGraphSolver): class RogueSelectTeamSolver(BaseSolver):
solver_name = "肉鸽选择分队" solver_name = "肉鸽选择分队"
def run(self, team: str) -> bool: def run(self, team: str) -> bool:

View file

@ -1,13 +1,13 @@
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from . import data from . import data
from .rogue_abandon_explore import RogueAbandonExploreSolver from .rogue_abandon_explore import RogueAbandonExploreSolver
from .utils.utils import get_money_num from .utils.utils import get_money_num
class RogueShopSolver(SceneGraphSolver): class RogueShopSolver(BaseSolver):
solver_name = "诡意行商投资" solver_name = "诡意行商投资"
def run(self): def run(self):

View file

@ -7,10 +7,10 @@ from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
from mower.utils.csleep import MowerExit from mower.utils.csleep import MowerExit
from mower.utils.email import send_message from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va from mower.utils.vector import sa, va
@ -20,7 +20,7 @@ def exp(card):
return [i * p for i in data] return [i * p for i in data]
class SecretFront(SceneGraphSolver): class SecretFront(BaseSolver):
target = { target = {
"1A": [20, 20, 20], "1A": [20, 20, 20],
"2A": [60, 55, 45], "2A": [60, 55, 45],

View file

@ -7,6 +7,7 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2 from mower.utils.image import cropimg, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va from mower.utils.vector import sa, va
card_w, card_h = 352, 354 card_w, card_h = 352, 354
@ -19,7 +20,7 @@ for i in range(2):
card_list.append((left + j * (card_w + gap), top + i * (card_h + gap))) card_list.append((left + j * (card_w + gap), top + i * (card_h + gap)))
class CreditShop(SceneGraphSolver): class CreditShop(BaseSolver):
solver_name = "信用商店购物" solver_name = "信用商店购物"
def number( def number(
@ -138,4 +139,4 @@ class CreditShop(SceneGraphSolver):
else: else:
self.tap("shop/cart") self.tap("shop/cart")
else: else:
self.scene_graph_step(Scene.SHOP_CREDIT) SceneGraphSolver().step(Scene.SHOP_CREDIT)

View file

@ -21,9 +21,10 @@ from datetime import timedelta
from mower.utils.email import notify from mower.utils.email import notify
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class Headhunting(SceneGraphSolver): class Headhunting(BaseSolver):
solver_name = "每日赠送单抽" solver_name = "每日赠送单抽"
solver_max_duration = timedelta(minutes=1) solver_max_duration = timedelta(minutes=1)
@ -42,4 +43,4 @@ class Headhunting(SceneGraphSolver):
notify("成功抽完赠送单抽") notify("成功抽完赠送单抽")
return True return True
else: else:
self.scene_graph_step(Scene.HEADHUNTING) SceneGraphSolver().step(Scene.HEADHUNTING)

View file

@ -20,15 +20,15 @@ import cv2
from mower.utils import config from mower.utils import config
from mower.utils.email import notify from mower.utils.email import notify
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa from mower.utils.vector import sa
activity_name = "月饼烘焙小教程·三" activity_name = "月饼烘焙小教程·三"
class MoonFestival(SceneGraphSolver): class MoonFestival(BaseSolver):
def transition(self) -> bool: def transition(self) -> bool:
if (scene := self.scene()) == Scene.MATERIEL: if (scene := self.scene()) == Scene.MATERIEL:
self.sleep() self.sleep()

View file

@ -21,13 +21,14 @@ from datetime import timedelta
from mower.utils.email import notify from mower.utils.email import notify
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import index_entry from .utils import index_entry
activity_name = "龙门幸运墙" activity_name = "龙门幸运墙"
class Orundum(SceneGraphSolver): class Orundum(BaseSolver):
solver_name = "幸运墙" solver_name = "幸运墙"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)
@ -63,4 +64,4 @@ class Orundum(SceneGraphSolver):
return True return True
self.tap((960, 960)) self.tap((960, 960))
else: else:
self.scene_graph_step(Scene.INDEX) SceneGraphSolver().step(Scene.INDEX)

View file

@ -28,10 +28,11 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import crop2content, cropimg, loadres, thres2 from mower.utils.image import crop2content, cropimg, loadres, thres2
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va, vs from mower.utils.vector import sa, va, vs
class Shop(SceneGraphSolver): class Shop(BaseSolver):
solver_name = "活动商店购买" solver_name = "活动商店购买"
solver_max_duration = timedelta(minutes=5) solver_max_duration = timedelta(minutes=5)
@ -84,7 +85,7 @@ class Shop(SceneGraphSolver):
self.swipe_ext([(1600, 340), (300, 340), (300, 150)], [0.2, 0.3], 0, 0.1) self.swipe_ext([(1600, 340), (300, 340), (300, 150)], [0.2, 0.3], 0, 0.1)
elif scene == Scene.ACTIVITY_SHOP_BUY: elif scene == Scene.ACTIVITY_SHOP_BUY:
if self.product is None: if self.product is None:
self.scene_graph_step(Scene.ACTIVITY_SHOP) SceneGraphSolver().step(Scene.ACTIVITY_SHOP)
return return
if self.find("sign_in/shop/insufficient"): if self.find("sign_in/shop/insufficient"):
return True return True
@ -108,4 +109,4 @@ class Shop(SceneGraphSolver):
notify("活动商店时装购买") notify("活动商店时装购买")
self.tap((960, 200)) self.tap((960, 200))
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -24,11 +24,12 @@ from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg from mower.utils.image import cropimg
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
activity_name = "集成战略限时任务" activity_name = "集成战略限时任务"
class SignIn(SceneGraphSolver): class SignIn(BaseSolver):
solver_name = "签到活动" solver_name = "签到活动"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)
@ -91,4 +92,4 @@ class SignIn(SceneGraphSolver):
self.skin_email = False self.skin_email = False
self.tap((960, 200)) self.tap((960, 200))
else: else:
self.scene_graph_step(Scene.INDEX) SceneGraphSolver().step(Scene.INDEX)

View file

@ -21,11 +21,12 @@ from datetime import timedelta
from mower.utils.email import notify from mower.utils.email import notify
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
task_name = "百灶食珍录" task_name = "百灶食珍录"
class Task(SceneGraphSolver): class Task(BaseSolver):
solver_name = "活动奖励领取" solver_name = "活动奖励领取"
solver_max_duration = timedelta(minutes=2) solver_max_duration = timedelta(minutes=2)
@ -64,4 +65,4 @@ class Task(SceneGraphSolver):
notify("活动干员领取") notify("活动干员领取")
self.ctap((960, 540)) self.ctap((960, 540))
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) SceneGraphSolver().step(Scene.TERMINAL_MAIN)

View file

@ -6,6 +6,7 @@ from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .sss_choose import SSSChooseSolver from .sss_choose import SSSChooseSolver
from .sss_fight import SSSFightSolver from .sss_fight import SSSFightSolver
@ -14,7 +15,7 @@ from .sss_ope import SSSOpeSolver
from .utils import is_full from .utils import is_full
class SSSSolver(SceneGraphSolver): class SSSSolver(BaseSolver):
solver_name = "保全作战" solver_name = "保全作战"
def run(self) -> bool: def run(self) -> bool:
@ -88,17 +89,17 @@ class SSSSolver(SceneGraphSolver):
self.full = SSSOpeSolver().run() self.full = SSSOpeSolver().run()
return self.full return self.full
elif scene == Scene.SSS_DROP_AGENT_BEFORE_FIGHT: elif scene == Scene.SSS_DROP_AGENT_BEFORE_FIGHT:
self.scene_graph_step(Scene.SSS_DEPLOY) SceneGraphSolver().step(Scene.SSS_DEPLOY)
elif scene == Scene.SSS_EXIT_CONFIRM: elif scene == Scene.SSS_EXIT_CONFIRM:
self.scene_graph_step(Scene.SSS_TERMINATED) SceneGraphSolver().step(Scene.SSS_TERMINATED)
elif scene == Scene.SSS_TERMINATED: elif scene == Scene.SSS_TERMINATED:
self.scene_graph_navigation(Scene.SSS_MAIN) SceneGraphSolver().navigation(Scene.SSS_MAIN)
elif scene == Scene.SSS_ACCOMPLISHED: elif scene == Scene.SSS_ACCOMPLISHED:
logger.info("保全作战通关或终止") logger.info("保全作战通关或终止")
self.scene_graph_step(Scene.SSS_TERMINATED) SceneGraphSolver().step(Scene.SSS_TERMINATED)
elif scene == Scene.SSS_SQUAD: elif scene == Scene.SSS_SQUAD:
if config.conf.sss.choose_agent: if config.conf.sss.choose_agent:

View file

@ -4,11 +4,11 @@ from mower.solvers.fight.battle_choose.battle_agent_choose import (
from mower.solvers.fight.battle_choose.battle_fill_choose import BattleFillChooseSolver from mower.solvers.fight.battle_choose.battle_fill_choose import BattleFillChooseSolver
from mower.solvers.fight.battle_choose.choose_support import ChooseSupportSolver from mower.solvers.fight.battle_choose.choose_support import ChooseSupportSolver
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class SSSChooseSolver(SceneGraphSolver): class SSSChooseSolver(BaseSolver):
solver_name = "保全选人" solver_name = "保全选人"
def run(self): def run(self):

View file

@ -12,6 +12,7 @@ from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import ss, va from mower.utils.vector import ss, va
agent = [ agent = [
@ -27,7 +28,7 @@ agent = [
] ]
class SSSDROPSolver(SceneGraphSolver): class SSSDROPSolver(BaseSolver):
solver_name = "保全增调干员或仪器" solver_name = "保全增调干员或仪器"
def run(self) -> bool: def run(self) -> bool:
@ -148,7 +149,7 @@ class SSSDROPSolver(SceneGraphSolver):
return return
elif scene == Scene.SSS_ABANDON_DROP_IN_FIGHT: elif scene == Scene.SSS_ABANDON_DROP_IN_FIGHT:
self.scene_graph_step(Scene.OPERATOR_FIGHT) SceneGraphSolver().step(Scene.OPERATOR_FIGHT)
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()

View file

@ -5,12 +5,13 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.scene import Scene from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.tile_pos import Calc, find_level from mower.utils.tile_pos import Calc, find_level
from .sss_drop import SSSDROPSolver from .sss_drop import SSSDROPSolver
class SSSFightSolver(SceneGraphSolver, FightMixin): class SSSFightSolver(BaseSolver, FightMixin):
solver_name = "保全战斗" solver_name = "保全战斗"
def run( def run(
@ -148,7 +149,7 @@ class SSSFightSolver(SceneGraphSolver, FightMixin):
Scene.SSS_DROP_IN_FIGHT, Scene.SSS_DROP_IN_FIGHT,
]: ]:
if not SSSDROPSolver().run(): if not SSSDROPSolver().run():
self.scene_graph_navigation(Scene.SSS_DEPLOY) SceneGraphSolver().navigation(Scene.SSS_DEPLOY)
return True return True
self.clear_op() self.clear_op()
elif scene == Scene.SSS_ACTION: elif scene == Scene.SSS_ACTION:

View file

@ -7,6 +7,7 @@ from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va from mower.utils.vector import va
from .utils import is_full from .utils import is_full
@ -26,7 +27,7 @@ ec_pos = [
] ]
class SSSNaviSolver(SceneGraphSolver): class SSSNaviSolver(BaseSolver):
solver_name = "保全导航" solver_name = "保全导航"
def run(self) -> bool: def run(self) -> bool:
@ -105,4 +106,4 @@ class SSSNaviSolver(SceneGraphSolver):
self.ctap("sss/check_ex", 3) self.ctap("sss/check_ex", 3)
else: else:
self.scene_graph_step(Scene.SSS_MAIN) SceneGraphSolver().step(Scene.SSS_MAIN)

View file

@ -1,12 +1,13 @@
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .sss_navi import SSSNaviSolver from .sss_navi import SSSNaviSolver
from .utils import is_full from .utils import is_full
class SSSOpeSolver(SceneGraphSolver): class SSSOpeSolver(BaseSolver):
solver_name = "保全代理" solver_name = "保全代理"
def run(self) -> bool: def run(self) -> bool:
@ -41,7 +42,7 @@ class SSSOpeSolver(SceneGraphSolver):
) )
< config.conf.sss.ope_limit_stage < config.conf.sss.ope_limit_stage
): ):
self.scene_graph_step(Scene.SSS_START) SceneGraphSolver().step(Scene.SSS_START)
self.check = True self.check = True
return return
self.tap("sss/ope/use") self.tap("sss/ope/use")

View file

@ -2,9 +2,10 @@ from datetime import timedelta
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class TradeTokenSolver(SceneGraphSolver): class TradeTokenSolver(BaseSolver):
solver_name = "信物兑换" solver_name = "信物兑换"
solver_max_duration = timedelta(minutes=3) solver_max_duration = timedelta(minutes=3)
@ -28,4 +29,4 @@ class TradeTokenSolver(SceneGraphSolver):
else: else:
self.swipe((200, 400), (0, 400)) self.swipe((200, 400), (0, 400))
else: else:
self.scene_graph_step(Scene.SHOP_TOKEN) SceneGraphSolver().step(Scene.SHOP_TOKEN)

View file

@ -30,13 +30,16 @@ def edge(v_from: int, v_to: int, interval: int | None = None):
class SceneGraphSolver(BaseSolver): class SceneGraphSolver(BaseSolver):
def scene_graph_navigation(self, scene: int): def navigation(self, scene: int):
"""按场景图跳转到指定场景""" self.target_scene = scene
super().run()
while self.scene() != scene: def transition(self):
self.scene_graph_step(scene) if self.scene() == self.target_scene:
return True
self.step(self.target_scene)
def scene_graph_step(self, scene: int): def step(self, scene: int):
"""waiting_solver()或按场景图跳转到指定场景只操作一步""" """waiting_solver()或按场景图跳转到指定场景只操作一步"""
if scene not in DG.nodes: if scene not in DG.nodes:
logger.error(f"{SceneComment[scene]}不在场景图中") logger.error(f"{SceneComment[scene]}不在场景图中")
@ -75,7 +78,7 @@ class SceneGraphSolver(BaseSolver):
self.sleep() self.sleep()
def back_to_index(self): def back_to_index(self):
self.scene_graph_navigation(Scene.INDEX) self.navigation(Scene.INDEX)
def back_to_infrastructure(self): def back_to_infrastructure(self):
self.scene_graph_navigation(Scene.INFRA_MAIN) self.navigation(Scene.INFRA_MAIN)