All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
94 lines
3.2 KiB
Python
94 lines
3.2 KiB
Python
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.digit_reader import get_drone
|
|
from mower.utils.log import logger
|
|
from mower.utils.recognize import Scene
|
|
from mower.utils.solver import BaseSolver
|
|
|
|
|
|
class DroneSolver(BaseSolver, BaseMixin):
|
|
solver_name = "无人机加速"
|
|
|
|
def run(
|
|
self,
|
|
room: str,
|
|
count: int | None = None,
|
|
all_in: bool = False,
|
|
cur_count: int = None,
|
|
) -> bool:
|
|
"""
|
|
Args:
|
|
room: 房间名
|
|
count:消耗无人机数量
|
|
all_in:贸易站-加速完成一笔订单,制造站-消耗全部无人机消耗数量
|
|
cur_count:当前无人机数量
|
|
"""
|
|
self.room = room
|
|
while not all_in and cur_count is None:
|
|
try:
|
|
cur_count = get_drone(config.recog.gray)
|
|
except Exception:
|
|
logger.exception("当前场景无法获取无人机数量")
|
|
EnterRoomSolver().run(self.room, detail=False)
|
|
|
|
if not all_in:
|
|
if count is None:
|
|
count = cur_count - config.conf.drone_count_limit
|
|
if cur_count < count or count <= 0:
|
|
logger.info("无人机数量不足")
|
|
return False
|
|
|
|
self.count = count
|
|
self.all_in = all_in
|
|
self.success = False
|
|
super().run()
|
|
return True
|
|
|
|
def number(self, scope: tp.Scope, height: int, thres: int) -> int:
|
|
"无人机加速数量"
|
|
return config.recog.num.number_int("riic_base", scope, height, thres)
|
|
|
|
def transition(self) -> bool:
|
|
if (
|
|
scene := self.scene()
|
|
) == Scene.INFRA_DETAILS and self.detect_room() == self.room:
|
|
self.ctap((200, 1000), 1)
|
|
elif (
|
|
scene in [Scene.ORDER_LIST, Scene.FACTORY_ROOMS]
|
|
and self.detect_room_inside() == self.room
|
|
):
|
|
if self.success:
|
|
return True
|
|
elif pos := self.find("factory_accelerate"):
|
|
self.tap(pos)
|
|
elif pos := self.find("bill_accelerate"):
|
|
self.tap(pos)
|
|
|
|
elif scene == Scene.DRONE_ACCELERATE:
|
|
if self.all_in:
|
|
if self.find("all_in"):
|
|
self.tap((1450, 500))
|
|
self.success = True
|
|
elif self.success:
|
|
self.ctap((1450, 900), 3)
|
|
elif (
|
|
tap_count := self.count - self.number(((240, 650), (350, 720)), 40, 150)
|
|
) == 0:
|
|
self.tap((1450, 900))
|
|
self.success = True
|
|
elif tap_count > 0:
|
|
for _ in range(tap_count):
|
|
self.tap((1300, 500))
|
|
self.sleep(0.07)
|
|
self.sleep(0.2)
|
|
elif tap_count < 0:
|
|
for _ in range(-tap_count):
|
|
self.tap((900, 500))
|
|
self.sleep(0.07)
|
|
self.sleep(0.2)
|
|
elif scene in self.waiting_scene:
|
|
self.waiting_solver()
|
|
else:
|
|
EnterRoomSolver().run(self.room, detail=False)
|