StarRailCopilot/tasks/map/route/base.py

129 lines
3.5 KiB
Python

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()`
"""
# Module and func of current route, updated from RouteLoader
route_module: str = ''
route_func: str = ''
registered_locked_position = None
registered_locked_direction = None
registered_locked_rotation = None
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=position,
locked=self.registered_locked_position is not None
)
if self.registered_locked_direction is not None:
self.minimap.lock_direction(self.registered_locked_direction)
if self.registered_locked_rotation is not None:
self.minimap.lock_rotation(self.registered_locked_rotation)
self.registered_locked_position = None
self.registered_locked_direction = None
self.registered_locked_rotation = None
def before_route(self):
pass
def after_route(self):
pass
def locked_position(function):
"""
Examples:
@locked_position
def Luofu_ScalegorgeWaterscape_F1_X619Y387(self):
pass # Search area will be locked
"""
def wrapper(self: RouteBase, *args, **kwargs):
self.registered_locked_position = True
result = function(self, *args, **kwargs)
return result
return wrapper
def locked_direction(degree: int | float):
"""
Examples:
@locked_direction(270)
def Luofu_ScalegorgeWaterscape_F1_X619Y387(self):
pass # Direction will be locked to 270
"""
def locker(function):
def wrapper(self: RouteBase, *args, **kwargs):
self.registered_locked_direction = degree
result = function(self, *args, **kwargs)
return result
return wrapper
return locker
def locked_rotation(degree: int | float):
"""
Examples:
@locked_rotation(270)
def Luofu_ScalegorgeWaterscape_F1_X619Y387(self):
pass # Rotation will be locked to 270
"""
def locker(function):
def wrapper(self: RouteBase, *args, **kwargs):
self.registered_locked_rotation = degree
result = function(self, *args, **kwargs)
return result
return wrapper
return locker