Compare commits

..

3 commits

Author SHA1 Message Date
fca9ea3ebc 增加GetOrderRemainingTimeSolver(已替换运行逻辑)
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
2024-09-29 18:17:50 +08:00
5e11ef0aa0 BaseChooseSolver增加room参数
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
2024-09-29 17:03:58 +08:00
40917771ce SwitchProductSolver可选择只读取剩余时间 2024-09-29 17:01:53 +08:00
6 changed files with 84 additions and 49 deletions

View file

@ -17,6 +17,9 @@ from arknights_mower.solvers.infra.clue import ClueSolver
from arknights_mower.solvers.infra.drone import DroneSolver
from arknights_mower.solvers.infra.enter_room import EnterRoomSolver
from arknights_mower.solvers.infra.get_agent_from_room import GetAgentFromRoomSolver
from arknights_mower.solvers.infra.get_order_remaining_time import (
GetOrderRemainingTimeSolver,
)
from arknights_mower.solvers.infra.reload import (
ReloadSolver,
)
@ -1649,24 +1652,11 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
def get_run_roder_time(self, room):
logger.info("基建:读取插拔时间")
# 点击进入该房间
self.enter_room(room)
# 进入房间详情
error_count = 0
while self.find("bill_accelerate") is None:
if error_count > 5:
raise Exception("未成功进入无人机界面")
self.tap((config.recog.w * 0.05, config.recog.h * 0.95), interval=1)
error_count += 1
execute_time = self.double_read_time(
(
(int(config.recog.w * 650 / 2496), int(config.recog.h * 660 / 1404)),
(int(config.recog.w * 815 / 2496), int(config.recog.h * 710 / 1404)),
),
use_digit_reader=True,
)
execute_time = execute_time - timedelta(
seconds=(60 * config.conf.run_order_delay)
execute_time = GetOrderRemainingTimeSolver().run(room)
execute_time = (
datetime.now()
+ timedelta(seconds=execute_time)
- timedelta(seconds=(60 * config.conf.run_order_delay))
)
logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S"))
self.scene_graph_navigation(Scene.INFRA_MAIN)
@ -2315,25 +2305,8 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
_current_room = self.op_data.get_current_room(room, True)
return _current_room
def get_order_remaining_time(self):
error_count = 0
while (
self.find("factory_accelerate") is None
and self.find("bill_accelerate") is None
):
if error_count > 5:
raise Exception("未成功进入无人机界面")
self.tap((config.recog.w * 0.05, config.recog.h * 0.95), interval=0.5)
error_count += 1
# 订单剩余时间
execute_time = self.double_read_time(
(
(int(config.recog.w * 650 / 2496), int(config.recog.h * 660 / 1404)),
(int(config.recog.w * 815 / 2496), int(config.recog.h * 710 / 1404)),
),
use_digit_reader=True,
)
return round((execute_time - datetime.now()).total_seconds(), 1)
def get_order_remaining_time(self, room):
return GetOrderRemainingTimeSolver().run(room)
def current_room_changed(self, instance):
if not self.op_data.first_init:
@ -2447,7 +2420,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
and config.conf.run_order_buffer_time > 0
and choose_error <= 0
):
remaining_time = self.get_order_remaining_time()
remaining_time = self.get_order_remaining_time(room)
if 0 < remaining_time < (config.conf.run_order_delay + 10) * 60:
if config.conf.run_order_buffer_time > 0:
self.task.time = (

View file

@ -7,6 +7,8 @@ import cv2
import numpy as np
from arknights_mower.models import secret_front
from arknights_mower.solvers.infra.base_mixin import BaseMixin
from arknights_mower.solvers.infra.enter_room import EnterRoomSolver
from arknights_mower.solvers.infra.filter import RIIC_Filter
from arknights_mower.utils import config
from arknights_mower.utils.character_recognize import (
@ -25,8 +27,9 @@ from arknights_mower.utils.vector import sa
# pro_list = pickle.load(f)
class BaseChoose(SceneGraphSolver):
def run(self, agent_list: list):
class BaseChooseSolver(SceneGraphSolver, BaseMixin):
def run(self, room: str, agent_list: list):
self.room = room
self.agent_list = agent_list
self.wait_choose = {}
self.choosed = []
@ -36,7 +39,6 @@ class BaseChoose(SceneGraphSolver):
self.first_filter = True
self.in_adjust = False
self.tmp_data = {}
try:
super().run()
except ValueError as e:
@ -225,10 +227,16 @@ class BaseChoose(SceneGraphSolver):
def transition(self) -> bool:
if (scene := self.scene()) == Scene.RIIC_OPERATOR_SELECT:
return self.riic_agent_choose()
elif self.find("room_detail") and EnterRoomSolver().detect_room() == self.room:
self.tap((1600, 200))
elif (
self.scene() in [Scene.ORDER_LIST, Scene.FACTORY_ROOMS]
and self.detect_room_inside() == self.room
):
self.tap((500, 970))
elif scene == Scene.INFRA_ARRANGE_ORDER:
logger.info(Scene.INFRA_ARRANGE_ORDER)
self.scene_graph_navigation(Scene.RIIC_OPERATOR_SELECT)
self.scene_graph_step(Scene.RIIC_OPERATOR_SELECT)
elif self.scene in self.waiting_scene:
self.waiting_solver()
else:
return False
EnterRoomSolver().run(self.room)

View file

@ -35,9 +35,9 @@ class DroneSolver(SceneGraphSolver, BaseMixin):
try:
cur_count = DigitReader().get_drone(config.recog.gray)
except Exception as e:
raise e
finally:
EnterRoomSolver().run(self.room, detail=False)
raise e
if count is None:
count = cur_count - config.conf.drone_count_limit

View file

@ -0,0 +1,51 @@
from datetime import datetime, timedelta
from arknights_mower.solvers.infra.base_mixin import BaseMixin
from arknights_mower.solvers.infra.enter_room import EnterRoomSolver
from arknights_mower.utils import config
from arknights_mower.utils.graph import SceneGraphSolver
from arknights_mower.utils.log import logger
from arknights_mower.utils.recognize import Scene
class GetOrderRemainingTimeSolver(SceneGraphSolver, BaseMixin):
def run(self, room: str):
logger.info("Start:读取订单剩余时间")
self.room = room
self.res = None
if (
self.scene() == Scene.ORDER_LIST
and not self.detect_room_inside() == self.room
):
EnterRoomSolver().run(self.room, detail=False)
self.wait_start()
super().run()
return self.res
def timeout(self) -> bool:
return datetime.now() > self.start_time + timedelta(seconds=10)
def wait_start(self):
self.start_time = datetime.now()
def transition(self) -> bool:
if (scene := self.scene()) == Scene.INFRA_DETAILS:
self.ctap((200, 1000), 1, config.screenshot_avg / 1000)
self.wait_start()
elif scene == Scene.ORDER_LIST:
if self.timeout():
logger.error("读取订单失败")
return True
elif pos := self.find("bill_accelerate"):
pos[0][0] += 69
pos[0][1] -= 214
pos[1][0] -= 52
pos[1][1] -= 220
if res := self.double_read_time(pos, use_digit_reader=True):
self.res = (res - datetime.now()).total_seconds()
return True
elif scene in self.waiting_scene:
self.waiting_solver()
else:
EnterRoomSolver().run(self.room, detail=False)

View file

@ -34,7 +34,7 @@ production_time = {
class SwitchProductSolver(SceneGraphSolver, BaseMixin):
def run(self, room, tar_product):
def run(self, room, tar_product, only_get_time=False):
logger.info(f"Start:切换产物 房间:{room} 目标产物:{tar_product}")
EnterRoomSolver().run(room, detail=False)
@ -47,8 +47,12 @@ class SwitchProductSolver(SceneGraphSolver, BaseMixin):
# 读取当前无人机数量避免重复开关
cur_drone_count = DigitReader().get_drone(config.recog.gray)
# 读取生产速度
speed = self.read_speed()
# 获取无人机加速的剩余时间
remain_time = GetRemainTimeSolver().run(room)
if only_get_time:
return remain_time % production_time[cur_product] / speed
# 使用无人机加速
start_time = datetime.now()
drone_count = remain_time % production_time[cur_product] // 180
@ -57,7 +61,6 @@ class SwitchProductSolver(SceneGraphSolver, BaseMixin):
return False
# 等待产物完成
speed = self.read_speed()
wait_time = (
remain_time % production_time[cur_product] % 180 / speed
- (datetime.now() - start_time).total_seconds()

View file

@ -35,7 +35,7 @@ def infra_arrange_confirm(solver: BaseSolver):
solver.tap((1452, 1029))
@edge(Scene.INFRA_ARRANGE_ORDER, Scene.INFRA_DETAILS)
@edge(Scene.INFRA_ARRANGE_ORDER, Scene.RIIC_OPERATOR_SELECT)
def infra_arrange_order(solver: BaseSolver):
solver.tap_element("arrange_blue_yes", x_rate=0.66)