diff --git a/tasks/map/minimap/minimap.py b/tasks/map/minimap/minimap.py index 7c4738006..bbb510fbd 100644 --- a/tasks/map/minimap/minimap.py +++ b/tasks/map/minimap/minimap.py @@ -47,7 +47,7 @@ class PositionPredictState: class Minimap(MapResource): def init_position(self, position: tuple[int | float, int | float]): - logger.info(f"init_position:{position}") + logger.info(f"init_position: {position}") self.position = position def _predict_position(self, image, scale=1.0): diff --git a/tasks/map/route/base.py b/tasks/map/route/base.py new file mode 100644 index 000000000..17f4c06bb --- /dev/null +++ b/tasks/map/route/base.py @@ -0,0 +1,50 @@ +from tasks.map.control.control import MapControl +from tasks.map.control.waypoint import Waypoint +from tasks.map.keywords import MapPlane + + +class RouteBase(MapControl): + """ + Base class of `Route` + Every `Route` class must implement method `route()` + """ + + def route_example(self): + """ + Pages: + in: page_main + out: page_main + Doesn't matter if in/out are not page_main, just be clear what you're doing + """ + self.map_init( + plane=..., + floor=..., + position=..., + ) + self.clear_enemy( + Waypoint(...).run_2x(), + Waypoint(...), + ) + + def map_init( + self, + plane: MapPlane | str, + floor: str = 'F1', + position: tuple[int | float, int | float] = None + ): + """ + Args: + plane (MapPlane, str): Such as Jarilo_AdministrativeDistrict + floor (str): + position: Initialize the starter point of minimap tracking + Leaving None will trigger brute-force starter point finding. + """ + try: + if self.device.image is None: + self.device.screenshot() + except AttributeError: + self.device.screenshot() + + self.minimap.set_plane(plane, floor=floor) + if position is not None: + self.minimap.init_position(position) diff --git a/tasks/map/route/loader.py b/tasks/map/route/loader.py new file mode 100644 index 000000000..cf1d97d4a --- /dev/null +++ b/tasks/map/route/loader.py @@ -0,0 +1,38 @@ +import importlib +import os + +from module.exception import RequestHumanTakeover +from module.logger import logger +from tasks.base.ui import UI +from tasks.map.route.base import RouteBase + + +class RouteLoader(UI): + route: RouteBase + + def route_run(self, route: str): + """ + Args: + route: .py module path such as `daily.forgotten_hall.stage1` + which will load `./route/daily/forgotten_hall/stage1.py` + """ + folder, name = route.rsplit('.', maxsplit=1) + path = f'./route/{route.replace(".", "/")}.py' + try: + module = importlib.import_module(f'route.{folder}.{name}') + except ModuleNotFoundError: + logger.critical(f'Route file not found: {route} ({path})') + if not os.path.exists(path): + logger.critical(f'Route file not exists: {path}') + raise RequestHumanTakeover + + # config = copy.deepcopy(self.config).merge(module.Config()) + config = self.config + device = self.device + try: + self.route = module.Route(config=config, device=device) + return self.route.route() + except AttributeError as e: + logger.critical(e) + logger.critical(f'Route file {route} ({path}) must define Route.route()') + raise RequestHumanTakeover