场景图导航改写为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,
try_add_release_dorm,
)
from mower.utils.solver import BaseSolver
from mower.utils.translate import translate_room
class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
class BaseSchedulerSolver(BaseSolver, BaseMixin):
solver_name = "经典版"
def __init__(self) -> None:
@ -198,7 +199,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
elif scene == Scene.RIIC_OPERATOR_SELECT:
self.tap("confirm_blue")
else:
self.scene_graph_navigation(Scene.INFRA_MAIN)
SceneGraphSolver().navigation(Scene.INFRA_MAIN)
def enter_room(self, room):
EnterRoomSolver().run(room)
@ -669,7 +670,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
and config.conf.run_order_buffer_time > 0
):
logger.info("跑单前返回主界面以保持登录状态")
self.back_to_index()
SceneGraphSolver().navigation(Scene.INDEX)
self.refresh_connecting = True
return
self.refresh_connecting = False
@ -1001,7 +1002,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
unknown_cnt += 1
if unknown_cnt > 5:
unknown_cnt = 0
self.back_to_infrastructure()
SceneGraphSolver.navigation(Scene.INFRA_MAIN)
self.enter_room("train")
else:
self.sleep()
@ -1039,7 +1040,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
unknown_cnt += 1
if unknown_cnt > 5:
unknown_cnt = 0
self.back_to_infrastructure()
SceneGraphSolver.navigation(Scene.INFRA_MAIN)
self.enter_room("train")
else:
self.sleep()
@ -1653,7 +1654,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
- timedelta(seconds=(60 * config.conf.run_order_delay))
)
logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S"))
self.scene_graph_navigation(Scene.INFRA_MAIN)
SceneGraphSolver().navigation(Scene.INFRA_MAIN)
return execute_time
def adjust_order_time(self, accelerate, room):
@ -2180,13 +2181,13 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
if "检测到安排干员未成功" in str(e):
skip_enter = True
continue
self.scene_graph_navigation(Scene.INFRA_MAIN)
SceneGraphSolver().navigation(Scene.INFRA_MAIN)
continue
if len(new_plan) != 1:
self.scene_graph_navigation(Scene.INFRA_MAIN)
SceneGraphSolver().navigation(Scene.INFRA_MAIN)
else:
if config.conf.run_order_buffer_time <= 0:
self.scene_graph_navigation(Scene.INFRA_MAIN)
SceneGraphSolver().navigation(Scene.INFRA_MAIN)
return new_plan
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.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va
class CreditSolver(SceneGraphSolver):
class CreditSolver(BaseSolver):
solver_name = "访问好友"
def run(self) -> None:
@ -94,4 +95,4 @@ class CreditSolver(SceneGraphSolver):
else:
return True
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
# 向下x变大 = 0
# 向右y变大 = 0
@ -154,7 +155,7 @@ def 经验卡分类(物品):
pass
class depotREC(SceneGraphSolver):
class depotREC(BaseSolver):
solver_name = "仓库识别"
def __init__(self) -> None:
@ -255,7 +256,7 @@ class depotREC(SceneGraphSolver):
return # 正确结束
else:
self.scene_graph_step(Scene.DEPOT)
SceneGraphSolver().step(Scene.DEPOT)
return
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.tile_pos import Calc, find_level
from .mixin import FightMixin
class AutoFight(SceneGraphSolver, FightMixin):
class AutoFight(BaseSolver, FightMixin):
solver_name = "自动战斗"
def run(
@ -52,7 +53,7 @@ class AutoFight(SceneGraphSolver, FightMixin):
def breach_solver(self):
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":
config.device.exit()
self.success = False

View file

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

View file

@ -8,13 +8,13 @@ from mower.utils import config
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class BattleAgentChooseSolver(SceneGraphSolver):
class BattleAgentChooseSolver(BaseSolver):
solver_name = "战斗选择指定干员"
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.utils import config
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
# 按需填充干员
class BattleFillChooseSolver(SceneGraphSolver):
class BattleFillChooseSolver(BaseSolver):
solver_name = "标签填充干员"
def run(self, label: str, number: int, black_list: list = []):

View file

@ -4,12 +4,12 @@ import cv2
import numpy as np
from mower.utils import config
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg
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:
self.labels = [
"获取时间",

View file

@ -1,9 +1,9 @@
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class BattleTagChoose(SceneGraphSolver):
class BattleTagChoose(BaseSolver):
def run(self, tag) -> None:
self.tag = tag
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 typealias as tp
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa
from .choose_skill import ChooseSkillSolver
from .choose_support import ChooseSupportSolver
class CheckCurrentTeamSolver(SceneGraphSolver):
class CheckCurrentTeamSolver(BaseSolver):
solver_name = "检测当前编队"
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 mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ChooseSkillSolver(SceneGraphSolver):
class ChooseSkillSolver(BaseSolver):
solver_name = "选择干员技能"
def run(self, skill: int):

View file

@ -1,13 +1,13 @@
import cv2
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ChooseSquadSolver(SceneGraphSolver):
class ChooseSquadSolver(BaseSolver):
solver_name = "选择编队"
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
profession_pos = {
"PIONEER": ((30, 150), (40, 160)),
@ -30,7 +31,7 @@ skill_pos = (
)
class ChooseSupportSolver(SceneGraphSolver):
class ChooseSupportSolver(BaseSolver):
solver_name = "选择助战干员"
def run(self, opers: list = [], mode: Literal["normal", "rogue"] = "normal"):
@ -150,7 +151,7 @@ class ChooseSupportSolver(SceneGraphSolver):
if self.animation():
return
if self.retry_times < 0:
self.scene_graph_step(Scene.OPERATOR_SELECT)
SceneGraphSolver().step(Scene.OPERATOR_SELECT)
return
if not self.check_profession_focus():
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.utils import config
from mower.utils.email import send_message
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class CopyWorksSolver(SceneGraphSolver):
class CopyWorksSolver(BaseSolver):
solver_name = "自动抄作业列表"
def run(self):

View file

@ -7,16 +7,16 @@ from skimage.metrics import structural_similarity
from mower.solvers.navigation import NavigationSolver
from mower.utils import config
from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .auto_fight import AutoFight
from .battle_choose import BattleChooseSolver
class CreditFight(SceneGraphSolver):
class CreditFight(BaseSolver):
solver_name = "信用作战"
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
class RIIC_ChooseSolver(BaseSolver, BaseMixin):
solver_name = "基建选人"
def run(self, room: str, agents: list, wait_time: float = 0) -> bool:
@ -221,9 +222,9 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
else:
self.tap((500, 970))
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:
self.scene_graph_step(Scene.RIIC_OPERATOR_SELECT)
SceneGraphSolver().step(Scene.RIIC_OPERATOR_SELECT)
elif scene in self.waiting_scene:
self.waiting_solver()
else:

View file

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

View file

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

View file

@ -1,17 +1,17 @@
from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, crop2content, cropimg, loadres, thres2
from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
from .utils import clue_cls, clue_scope
class GiveAwaySolver(SceneGraphSolver, BaseMixin):
class GiveAwaySolver(BaseSolver, BaseMixin):
solver_name = "传递线索"
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.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class MessageBoard(SceneGraphSolver, BaseMixin):
class MessageBoard(BaseSolver, BaseMixin):
solver_name = "留言板"
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.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
class PartyTimeSolver(SceneGraphSolver, BaseMixin):
class PartyTimeSolver(BaseSolver, BaseMixin):
solver_name = "线索交流结束时间"
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.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import crop2content, cropimg, loadres, thres2
from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
from .utils import (
@ -27,7 +27,7 @@ filter_receive = (1900, 45)
filter_self = (1610, 70)
class PlaceSolver(SceneGraphSolver, BaseMixin):
class PlaceSolver(BaseSolver, BaseMixin):
solver_name = "放置线索"
def run(self) -> None:

View file

@ -1,16 +1,16 @@
from mower.solvers.infra.base_mixin import BaseMixin
from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg
from mower.utils.log import logger
from mower.utils.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils import clue_cls, exit_pos
class ReceiveSolver(SceneGraphSolver, BaseMixin):
class ReceiveSolver(BaseSolver, BaseMixin):
solver_name = "接收好友线索"
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 typealias as tp
from mower.utils.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class DroneSolver(SceneGraphSolver, BaseMixin):
class DroneSolver(BaseSolver, BaseMixin):
solver_name = "无人机加速"
def run(

View file

@ -6,6 +6,7 @@ from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.translate import translate_room
from mower.utils.vector import sm, va
@ -85,7 +86,7 @@ facility = {
}
class EnterRoomSolver(SceneGraphSolver, BaseMixin):
class EnterRoomSolver(BaseSolver, BaseMixin):
solver_name = "进入房间"
def run(self, room: str, detail: bool = True):
@ -154,4 +155,4 @@ class EnterRoomSolver(SceneGraphSolver, BaseMixin):
):
self.ctap(pos, 1, id="enter_room")
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
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_Filter(SceneGraphSolver):
class RIIC_Filter(BaseSolver):
solver_name = "排序"
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.utils import config
from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2
from mower.utils.solver import BaseSolver
name_x = (1288, 1869)
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]
class GetAgentFromRoomSolver(SceneGraphSolver, BaseMixin):
class GetAgentFromRoomSolver(BaseSolver, BaseMixin):
solver_name = "读取干员信息"
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.utils import config
from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class GetOrderRemainingTimeSolver(SceneGraphSolver, BaseMixin):
class GetOrderRemainingTimeSolver(BaseSolver, BaseMixin):
solver_name = "订单剩余时间"
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class Overview(SceneGraphSolver):
class Overview(BaseSolver):
solver_name = "进驻总览"
def transition(self):
@ -22,4 +23,4 @@ class Overview(SceneGraphSolver):
return True
self.solver_update_before_transition = False
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 typealias as tp
from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class ReloadSolver(SceneGraphSolver, BaseMixin):
class ReloadSolver(BaseSolver, BaseMixin):
solver_name = "搓玉补货"
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.path import get_path
from mower.utils.recognize import Scene, tp
from mower.utils.solver import BaseSolver
Base = declarative_base()
@ -31,7 +32,7 @@ class Report(Base):
合成玉订单数量 = Column(Integer)
class ReportSolver(SceneGraphSolver):
class ReportSolver(BaseSolver):
solver_name = "基报读取"
def __init__(self) -> None:
@ -67,7 +68,7 @@ class ReportSolver(SceneGraphSolver):
if (scene := self.scene()) == Scene.RIIC_REPORT:
return self.read_report()
elif scene == Scene.CTRLCENTER_ASSISTANT:
self.scene_graph_step(Scene.RIIC_REPORT)
SceneGraphSolver().step(Scene.RIIC_REPORT)
elif scene in self.waiting_scene:
self.waiting_solver()
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.utils import config
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class RIIC_FreeFillSolver(SceneGraphSolver):
class RIIC_FreeFillSolver(BaseSolver):
def run(self) -> bool:
self.agent = None
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.scene import Scene
from mower.utils.solver import BaseSolver
professions = [
"PIONEER",
@ -14,7 +14,7 @@ professions = [
]
class RIICTagChoose(SceneGraphSolver):
class RIICTagChoose(BaseSolver):
def run(self, tag) -> None:
self.tag = tag
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.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.solver import BaseSolver
from .read_original_order_remaining_time import ReadOriginalOrderRemainTimeSolver
from .wait_for_order import WaitForOrderSolver
@ -15,7 +15,7 @@ from .wait_for_order import WaitForOrderSolver
limit_time = 1800
class RunOrderSolver(SceneGraphSolver):
class RunOrderSolver(BaseSolver):
solver_name = "跑单"
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.utils import config
from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
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.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
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:
self.room = room
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.utils import config
from mower.utils.character_recognize import match_portrait
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import ss
from .enter_activity import EnterActivitySolver
class SwitchActivityUsersSolver(SceneGraphSolver, BaseMixin):
class SwitchActivityUsersSolver(BaseSolver, BaseMixin):
solver_name = "切换活动室使用者"
def run(self):

View file

@ -6,9 +6,10 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class EnterActivitySolver(SceneGraphSolver, BaseMixin):
class EnterActivitySolver(BaseSolver, BaseMixin):
solver_name = "进入活动室"
activity_scope = {
1: ((1521, 410), (1620, 443)),
@ -61,4 +62,4 @@ class EnterActivitySolver(SceneGraphSolver, BaseMixin):
return True
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
pos_name = ["控制中枢", "B1", "B2", "B3", "B4"]
@ -28,7 +29,7 @@ portrait_scope = [
]
class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin):
class SwitchAssistantsSolver(BaseSolver, BaseMixin):
solver_name = "基建副手"
def run(self) -> None:
@ -110,7 +111,7 @@ class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin):
self.ctap("choose_agent/battle_confirm", 3)
elif scene == Scene.CTRLCENTER_ASSISTANT:
self.scene_graph_step(Scene.RIIC_REPORT)
SceneGraphSolver().step(Scene.RIIC_REPORT)
elif scene in self.waiting_scene:
self.waiting_solver()
else:

View file

@ -3,11 +3,12 @@ from mower.solvers.infra.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
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))}
class SwitchOrderSolver(SceneGraphSolver, BaseMixin):
class SwitchOrderSolver(BaseSolver, BaseMixin):
def run(self, room: str, tar_order: str):
"""
Args:
@ -33,7 +34,7 @@ class SwitchOrderSolver(SceneGraphSolver, BaseMixin):
self.tap((1500, 1000))
elif scene == Scene.SWITCH_ORDER:
if self.find("switch_order/check", scope=self.scope):
self.scene_graph_step(Scene.ORDER_LIST)
SceneGraphSolver().step(Scene.ORDER_LIST)
else:
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 typealias as tp
from mower.utils.digit_reader import get_drone
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, thres2
from mower.utils.log import logger
from mower.utils.solver import BaseSolver
from .check_current_product import CheckCurrentProductSolver
from .choose_product import ChooseProductSolver
@ -32,7 +32,7 @@ production_time = {
}
class SwitchProductSolver(SceneGraphSolver, BaseMixin):
class SwitchProductSolver(BaseSolver, BaseMixin):
solver_name = "切换产物"
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.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils import product
class CheckCurrentProductSolver(SceneGraphSolver, BaseMixin):
class CheckCurrentProductSolver(BaseSolver, BaseMixin):
solver_name = "检查当前产物"
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 typealias as tp
from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cmatch, cropimg, loadres
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
production_index = {
"经验": [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)]
class ChooseProductSolver(SceneGraphSolver, BaseMixin):
class ChooseProductSolver(BaseSolver, BaseMixin):
solver_name = "选择产物"
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.utils import config
from mower.utils import typealias as tp
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class GetRemainTimeSolver(SceneGraphSolver, BaseMixin):
class GetRemainTimeSolver(BaseSolver, BaseMixin):
solver_name = "获取剩余时间"
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.enter_room import EnterRoomSolver
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class WaitForProductSolver(SceneGraphSolver, BaseMixin):
class WaitForProductSolver(BaseSolver, BaseMixin):
solver_name = "等待产物完成"
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
collect = {"bill": "订单", "factory": "制造站产物", "trust": "信赖"}
class TodoListSolver(SceneGraphSolver):
class TodoListSolver(BaseSolver):
solver_name = "收取产物"
def run(self):
@ -25,7 +26,7 @@ class TodoListSolver(SceneGraphSolver):
elif scene == Scene.INFRA_TODOLIST:
if self.success:
self.scene_graph_step(Scene.INFRA_MAIN)
SceneGraphSolver().step(Scene.INFRA_MAIN)
for res, name in collect.items():
score, pos = config.recog.match(f"todo_list/{res}")
if score > 0.8:
@ -35,4 +36,4 @@ class TodoListSolver(SceneGraphSolver):
self.success = True
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class MailSolver(SceneGraphSolver):
class MailSolver(BaseSolver):
solver_name = "领取邮件"
solver_max_duration = timedelta(minutes=2)
@ -34,4 +35,4 @@ class MailSolver(SceneGraphSolver):
else:
return True
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.recognize import Scene
from mower.utils.solver import BaseSolver
class MissionSolver(SceneGraphSolver):
class MissionSolver(BaseSolver):
solver_name = "每日/每周任务"
solver_max_duration = timedelta(minutes=2)
@ -35,4 +36,4 @@ class MissionSolver(SceneGraphSolver):
return
return True
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va, vs
from .activity import ActivityNavigation
@ -430,7 +431,7 @@ difficulty_str = [
]
class NavigationSolver(SceneGraphSolver):
class NavigationSolver(BaseSolver):
solver_name = "关卡导航"
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:
logger.info(f"{self.name} 无法代理")
self.success = False
self.back_to_index()
SceneGraphSolver.navigation(Scene.INDEX)
return True
if self.find("ope_agency_lock"):
self.change_to = self.now_difficulty ^ 1
@ -713,4 +714,4 @@ class NavigationSolver(SceneGraphSolver):
elif scene == Scene.STORY_STAGE:
self.tap("start_story")
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va, vs
from .utils import generate_name
@ -24,7 +25,7 @@ class classproperty:
return self
class ActivityNavigation(SceneGraphSolver):
class ActivityNavigation(BaseSolver):
solver_name = "活动关卡导航"
_location = {
@ -143,4 +144,4 @@ class ActivityNavigation(SceneGraphSolver):
self.tap("start_story")
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, vs
from .utils import generate_name
class ActivityNavigation(SceneGraphSolver):
class ActivityNavigation(BaseSolver):
solver_name = "活动关卡导航"
prefix = "RS"
@ -141,4 +142,4 @@ class ActivityNavigation(SceneGraphSolver):
self.tap("start_story")
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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import last_letters
class LastStageNavigation(SceneGraphSolver):
class LastStageNavigation(BaseSolver):
def run(
self, name: str, mode: Literal["auto", "copy"] = "auto", switch_to_ex=False
) -> bool:
@ -20,7 +21,7 @@ class LastStageNavigation(SceneGraphSolver):
self.mode = mode
self.success = True
if self.name != "":
self.scene_graph_navigation(Scene.TERMINAL_MAIN)
SceneGraphSolver().navigation(Scene.TERMINAL_MAIN)
super().run()
return self.success
@ -92,4 +93,4 @@ class LastStageNavigation(SceneGraphSolver):
return True
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.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
profession_list = [
@ -38,7 +39,7 @@ for name, data in agent_list.items():
templates[data["profession"]][name] = tpl, msk, eng
class OperatorSolver(SceneGraphSolver):
class OperatorSolver(BaseSolver):
def run(self):
self.last_operator = ""
self.repeat_count = 2
@ -203,4 +204,4 @@ class OperatorSolver(SceneGraphSolver):
else:
if self.in_progress and scene != Scene.CONNECTING:
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 typealias as tp
from mower.utils.csleep import MowerExit
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, loadres, thres2
from mower.utils.log import logger
from mower.utils.matcher import Matcher
from mower.utils.rapidocr import ocr_rec
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
src_pts = np.float32([[0, 97], [1920, 97], [-400, 1080], [2320, 1080]])
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
class ReclamationAlgorithm(SceneGraphSolver):
class ReclamationAlgorithm(BaseSolver):
fast_tap_scenes = [Scene.RA_GUIDE_DIALOG]
places = {
"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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
job_list = [
@ -28,7 +29,7 @@ job_list = [
]
class RecruitSolver(SceneGraphSolver):
class RecruitSolver(BaseSolver):
solver_name = "公开招募"
def run(self):
@ -168,7 +169,7 @@ class RecruitSolver(SceneGraphSolver):
elif scene == Scene.RECRUIT_TAGS:
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():
del self.tags[self.recruit_index]
return
@ -257,7 +258,7 @@ class RecruitSolver(SceneGraphSolver):
# 可能按错了,回到公招主界面重开
del self.tags[self.recruit_index]
del self.agent_choose[self.recruit_index]
self.scene_graph_step(Scene.RECRUIT_MAIN)
SceneGraphSolver().step(Scene.RECRUIT_MAIN)
return
# # start recruit
@ -273,7 +274,7 @@ class RecruitSolver(SceneGraphSolver):
elif scene == Scene.RECRUIT_AGENT:
return self.recruit_result()
else:
self.scene_graph_step(Scene.RECRUIT_MAIN)
SceneGraphSolver().step(Scene.RECRUIT_MAIN)
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .choose_next_node import ChooseNextNodeSolver, DianCiChooseNextNodeSolver
from .choose_support_award import ChooseSupportAwardSolver
@ -16,7 +17,7 @@ from .rogue_shop import RogueShopSolver
from .utils.utils import detect_layer
class RogueSolver(SceneGraphSolver):
class RogueSolver(BaseSolver):
solver_name = "肉鸽"
def run(self) -> bool:
@ -87,7 +88,7 @@ class RogueSolver(SceneGraphSolver):
NodeOptionSelectSolver().run()
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 [
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, vs
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
class ChooseNextNodeSolver(SceneGraphSolver):
class ChooseNextNodeSolver(BaseSolver):
solver_name = "选择下一个节点"
def run(self):
@ -93,7 +94,7 @@ class ChooseNextNodeSolver(SceneGraphSolver):
if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1):
return
if len(data.next_step) == 0:
self.scene_graph_step(Scene.ROGUE_MAIN)
SceneGraphSolver().step(Scene.ROGUE_MAIN)
return
self.get_next_node_id()
if not self.node_id or self.find("rogue/no_refresh_time"):
@ -103,7 +104,7 @@ class ChooseNextNodeSolver(SceneGraphSolver):
return
scope = self.get_node_pos(self.node_id, ((200, 150), (960, 880)))
if scope[1][0] - 100 < 0 or scope[0][0] > 960:
self.scene_graph_step(Scene.ROGUE_MAIN)
SceneGraphSolver().step(Scene.ROGUE_MAIN)
return
if not self.find("rogue/node_be_choosed", scope=sa(scope, (-150, 0))):
self.tap(scope)
@ -175,7 +176,7 @@ class DianCiChooseNextNodeSolver(ChooseNextNodeSolver):
if self.animation(((0, 150), (1600, 880)), interval=0.1, ratio=0.1):
return
if len(data.next_step) == 0:
self.scene_graph_step(Scene.ROGUE_MAIN)
SceneGraphSolver().step(Scene.ROGUE_MAIN)
return
self.get_next_node_id()
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.solver import BaseSolver
from .utils.utils import find_text
class ChooseSupportAwardSolver(SceneGraphSolver):
class ChooseSupportAwardSolver(BaseSolver):
solver_name = "选择支援奖励"
_award = [
"更多补给品",

View file

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

View file

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

View file

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

View file

@ -4,12 +4,13 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
from .utils.utils import find_text
class RogueNaviSolver(SceneGraphSolver):
class RogueNaviSolver(BaseSolver):
solver_name = "肉鸽导航"
_title = {
"Phantom": "古堡笔记",
@ -46,4 +47,4 @@ class RogueNaviSolver(SceneGraphSolver):
self.success = True
return True
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 mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .utils.utils import find_text
class RogueSelectTeamSolver(SceneGraphSolver):
class RogueSelectTeamSolver(BaseSolver):
solver_name = "肉鸽选择分队"
def run(self, team: str) -> bool:

View file

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

View file

@ -7,10 +7,10 @@ from mower.utils import config
from mower.utils import typealias as tp
from mower.utils.csleep import MowerExit
from mower.utils.email import send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg
from mower.utils.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va
@ -20,7 +20,7 @@ def exp(card):
return [i * p for i in data]
class SecretFront(SceneGraphSolver):
class SecretFront(BaseSolver):
target = {
"1A": [20, 20, 20],
"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.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va
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)))
class CreditShop(SceneGraphSolver):
class CreditShop(BaseSolver):
solver_name = "信用商店购物"
def number(
@ -138,4 +139,4 @@ class CreditShop(SceneGraphSolver):
else:
self.tap("shop/cart")
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.graph import SceneGraphSolver
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
class Headhunting(SceneGraphSolver):
class Headhunting(BaseSolver):
solver_name = "每日赠送单抽"
solver_max_duration = timedelta(minutes=1)
@ -42,4 +43,4 @@ class Headhunting(SceneGraphSolver):
notify("成功抽完赠送单抽")
return True
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.email import notify
from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa
activity_name = "月饼烘焙小教程·三"
class MoonFestival(SceneGraphSolver):
class MoonFestival(BaseSolver):
def transition(self) -> bool:
if (scene := self.scene()) == Scene.MATERIEL:
self.sleep()

View file

@ -21,13 +21,14 @@ from datetime import timedelta
from mower.utils.email import notify
from mower.utils.graph import SceneGraphSolver
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from .utils import index_entry
activity_name = "龙门幸运墙"
class Orundum(SceneGraphSolver):
class Orundum(BaseSolver):
solver_name = "幸运墙"
solver_max_duration = timedelta(minutes=2)
@ -63,4 +64,4 @@ class Orundum(SceneGraphSolver):
return True
self.tap((960, 960))
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.rapidocr import ocr_rec
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import sa, va, vs
class Shop(SceneGraphSolver):
class Shop(BaseSolver):
solver_name = "活动商店购买"
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)
elif scene == Scene.ACTIVITY_SHOP_BUY:
if self.product is None:
self.scene_graph_step(Scene.ACTIVITY_SHOP)
SceneGraphSolver().step(Scene.ACTIVITY_SHOP)
return
if self.find("sign_in/shop/insufficient"):
return True
@ -108,4 +109,4 @@ class Shop(SceneGraphSolver):
notify("活动商店时装购买")
self.tap((960, 200))
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.rapidocr import ocr_rec
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
activity_name = "集成战略限时任务"
class SignIn(SceneGraphSolver):
class SignIn(BaseSolver):
solver_name = "签到活动"
solver_max_duration = timedelta(minutes=2)
@ -91,4 +92,4 @@ class SignIn(SceneGraphSolver):
self.skin_email = False
self.tap((960, 200))
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.graph import SceneGraphSolver
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
task_name = "百灶食珍录"
class Task(SceneGraphSolver):
class Task(BaseSolver):
solver_name = "活动奖励领取"
solver_max_duration = timedelta(minutes=2)
@ -64,4 +65,4 @@ class Task(SceneGraphSolver):
notify("活动干员领取")
self.ctap((960, 540))
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.log import logger
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .sss_choose import SSSChooseSolver
from .sss_fight import SSSFightSolver
@ -14,7 +15,7 @@ from .sss_ope import SSSOpeSolver
from .utils import is_full
class SSSSolver(SceneGraphSolver):
class SSSSolver(BaseSolver):
solver_name = "保全作战"
def run(self) -> bool:
@ -88,17 +89,17 @@ class SSSSolver(SceneGraphSolver):
self.full = SSSOpeSolver().run()
return self.full
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:
self.scene_graph_step(Scene.SSS_TERMINATED)
SceneGraphSolver().step(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:
logger.info("保全作战通关或终止")
self.scene_graph_step(Scene.SSS_TERMINATED)
SceneGraphSolver().step(Scene.SSS_TERMINATED)
elif scene == Scene.SSS_SQUAD:
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.choose_support import ChooseSupportSolver
from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class SSSChooseSolver(SceneGraphSolver):
class SSSChooseSolver(BaseSolver):
solver_name = "保全选人"
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.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import ss, va
agent = [
@ -27,7 +28,7 @@ agent = [
]
class SSSDROPSolver(SceneGraphSolver):
class SSSDROPSolver(BaseSolver):
solver_name = "保全增调干员或仪器"
def run(self) -> bool:
@ -148,7 +149,7 @@ class SSSDROPSolver(SceneGraphSolver):
return
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:
self.waiting_solver()

View file

@ -5,12 +5,13 @@ from mower.utils import config
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.scene import Scene
from mower.utils.solver import BaseSolver
from mower.utils.tile_pos import Calc, find_level
from .sss_drop import SSSDROPSolver
class SSSFightSolver(SceneGraphSolver, FightMixin):
class SSSFightSolver(BaseSolver, FightMixin):
solver_name = "保全战斗"
def run(
@ -148,7 +149,7 @@ class SSSFightSolver(SceneGraphSolver, FightMixin):
Scene.SSS_DROP_IN_FIGHT,
]:
if not SSSDROPSolver().run():
self.scene_graph_navigation(Scene.SSS_DEPLOY)
SceneGraphSolver().navigation(Scene.SSS_DEPLOY)
return True
self.clear_op()
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.rapidocr import ocr_rec
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from mower.utils.vector import va
from .utils import is_full
@ -26,7 +27,7 @@ ec_pos = [
]
class SSSNaviSolver(SceneGraphSolver):
class SSSNaviSolver(BaseSolver):
solver_name = "保全导航"
def run(self) -> bool:
@ -105,4 +106,4 @@ class SSSNaviSolver(SceneGraphSolver):
self.ctap("sss/check_ex", 3)
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.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
from .sss_navi import SSSNaviSolver
from .utils import is_full
class SSSOpeSolver(SceneGraphSolver):
class SSSOpeSolver(BaseSolver):
solver_name = "保全代理"
def run(self) -> bool:
@ -41,7 +42,7 @@ class SSSOpeSolver(SceneGraphSolver):
)
< config.conf.sss.ope_limit_stage
):
self.scene_graph_step(Scene.SSS_START)
SceneGraphSolver().step(Scene.SSS_START)
self.check = True
return
self.tap("sss/ope/use")

View file

@ -2,9 +2,10 @@ from datetime import timedelta
from mower.utils.graph import SceneGraphSolver
from mower.utils.recognize import Scene
from mower.utils.solver import BaseSolver
class TradeTokenSolver(SceneGraphSolver):
class TradeTokenSolver(BaseSolver):
solver_name = "信物兑换"
solver_max_duration = timedelta(minutes=3)
@ -28,4 +29,4 @@ class TradeTokenSolver(SceneGraphSolver):
else:
self.swipe((200, 400), (0, 400))
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):
def scene_graph_navigation(self, scene: int):
"""按场景图跳转到指定场景"""
def navigation(self, scene: int):
self.target_scene = scene
super().run()
while self.scene() != scene:
self.scene_graph_step(scene)
def transition(self):
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()或按场景图跳转到指定场景只操作一步"""
if scene not in DG.nodes:
logger.error(f"{SceneComment[scene]}不在场景图中")
@ -75,7 +78,7 @@ class SceneGraphSolver(BaseSolver):
self.sleep()
def back_to_index(self):
self.scene_graph_navigation(Scene.INDEX)
self.navigation(Scene.INDEX)
def back_to_infrastructure(self):
self.scene_graph_navigation(Scene.INFRA_MAIN)
self.navigation(Scene.INFRA_MAIN)