Compare commits
3 commits
9276c3a1cb
...
fca9ea3ebc
Author | SHA1 | Date | |
---|---|---|---|
fca9ea3ebc | |||
5e11ef0aa0 | |||
40917771ce |
6 changed files with 84 additions and 49 deletions
|
@ -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.drone import DroneSolver
|
||||||
from arknights_mower.solvers.infra.enter_room import EnterRoomSolver
|
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_agent_from_room import GetAgentFromRoomSolver
|
||||||
|
from arknights_mower.solvers.infra.get_order_remaining_time import (
|
||||||
|
GetOrderRemainingTimeSolver,
|
||||||
|
)
|
||||||
from arknights_mower.solvers.infra.reload import (
|
from arknights_mower.solvers.infra.reload import (
|
||||||
ReloadSolver,
|
ReloadSolver,
|
||||||
)
|
)
|
||||||
|
@ -1649,24 +1652,11 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
|
||||||
|
|
||||||
def get_run_roder_time(self, room):
|
def get_run_roder_time(self, room):
|
||||||
logger.info("基建:读取插拔时间")
|
logger.info("基建:读取插拔时间")
|
||||||
# 点击进入该房间
|
execute_time = GetOrderRemainingTimeSolver().run(room)
|
||||||
self.enter_room(room)
|
execute_time = (
|
||||||
# 进入房间详情
|
datetime.now()
|
||||||
error_count = 0
|
+ timedelta(seconds=execute_time)
|
||||||
while self.find("bill_accelerate") is None:
|
- timedelta(seconds=(60 * config.conf.run_order_delay))
|
||||||
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)
|
|
||||||
)
|
)
|
||||||
logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S"))
|
logger.info("下一次进行插拔的时间为:" + execute_time.strftime("%H:%M:%S"))
|
||||||
self.scene_graph_navigation(Scene.INFRA_MAIN)
|
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)
|
_current_room = self.op_data.get_current_room(room, True)
|
||||||
return _current_room
|
return _current_room
|
||||||
|
|
||||||
def get_order_remaining_time(self):
|
def get_order_remaining_time(self, room):
|
||||||
error_count = 0
|
return GetOrderRemainingTimeSolver().run(room)
|
||||||
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 current_room_changed(self, instance):
|
def current_room_changed(self, instance):
|
||||||
if not self.op_data.first_init:
|
if not self.op_data.first_init:
|
||||||
|
@ -2447,7 +2420,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
|
||||||
and config.conf.run_order_buffer_time > 0
|
and config.conf.run_order_buffer_time > 0
|
||||||
and choose_error <= 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 0 < remaining_time < (config.conf.run_order_delay + 10) * 60:
|
||||||
if config.conf.run_order_buffer_time > 0:
|
if config.conf.run_order_buffer_time > 0:
|
||||||
self.task.time = (
|
self.task.time = (
|
||||||
|
|
|
@ -7,6 +7,8 @@ import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from arknights_mower.models import secret_front
|
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.solvers.infra.filter import RIIC_Filter
|
||||||
from arknights_mower.utils import config
|
from arknights_mower.utils import config
|
||||||
from arknights_mower.utils.character_recognize import (
|
from arknights_mower.utils.character_recognize import (
|
||||||
|
@ -25,8 +27,9 @@ from arknights_mower.utils.vector import sa
|
||||||
# pro_list = pickle.load(f)
|
# pro_list = pickle.load(f)
|
||||||
|
|
||||||
|
|
||||||
class BaseChoose(SceneGraphSolver):
|
class BaseChooseSolver(SceneGraphSolver, BaseMixin):
|
||||||
def run(self, agent_list: list):
|
def run(self, room: str, agent_list: list):
|
||||||
|
self.room = room
|
||||||
self.agent_list = agent_list
|
self.agent_list = agent_list
|
||||||
self.wait_choose = {}
|
self.wait_choose = {}
|
||||||
self.choosed = []
|
self.choosed = []
|
||||||
|
@ -36,7 +39,6 @@ class BaseChoose(SceneGraphSolver):
|
||||||
self.first_filter = True
|
self.first_filter = True
|
||||||
self.in_adjust = False
|
self.in_adjust = False
|
||||||
self.tmp_data = {}
|
self.tmp_data = {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
super().run()
|
super().run()
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
|
@ -225,10 +227,16 @@ class BaseChoose(SceneGraphSolver):
|
||||||
def transition(self) -> bool:
|
def transition(self) -> bool:
|
||||||
if (scene := self.scene()) == Scene.RIIC_OPERATOR_SELECT:
|
if (scene := self.scene()) == Scene.RIIC_OPERATOR_SELECT:
|
||||||
return self.riic_agent_choose()
|
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:
|
elif scene == Scene.INFRA_ARRANGE_ORDER:
|
||||||
logger.info(Scene.INFRA_ARRANGE_ORDER)
|
self.scene_graph_step(Scene.RIIC_OPERATOR_SELECT)
|
||||||
self.scene_graph_navigation(Scene.RIIC_OPERATOR_SELECT)
|
|
||||||
elif self.scene in self.waiting_scene:
|
elif self.scene in self.waiting_scene:
|
||||||
self.waiting_solver()
|
self.waiting_solver()
|
||||||
else:
|
else:
|
||||||
return False
|
EnterRoomSolver().run(self.room)
|
||||||
|
|
|
@ -35,9 +35,9 @@ class DroneSolver(SceneGraphSolver, BaseMixin):
|
||||||
try:
|
try:
|
||||||
cur_count = DigitReader().get_drone(config.recog.gray)
|
cur_count = DigitReader().get_drone(config.recog.gray)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise e
|
|
||||||
finally:
|
|
||||||
EnterRoomSolver().run(self.room, detail=False)
|
EnterRoomSolver().run(self.room, detail=False)
|
||||||
|
raise e
|
||||||
|
|
||||||
if count is None:
|
if count is None:
|
||||||
count = cur_count - config.conf.drone_count_limit
|
count = cur_count - config.conf.drone_count_limit
|
||||||
|
|
||||||
|
|
51
arknights_mower/solvers/infra/get_order_remaining_time.py
Normal file
51
arknights_mower/solvers/infra/get_order_remaining_time.py
Normal 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)
|
|
@ -34,7 +34,7 @@ production_time = {
|
||||||
|
|
||||||
|
|
||||||
class SwitchProductSolver(SceneGraphSolver, BaseMixin):
|
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}")
|
logger.info(f"Start:切换产物 房间:{room} 目标产物:{tar_product}")
|
||||||
EnterRoomSolver().run(room, detail=False)
|
EnterRoomSolver().run(room, detail=False)
|
||||||
|
|
||||||
|
@ -47,8 +47,12 @@ class SwitchProductSolver(SceneGraphSolver, BaseMixin):
|
||||||
|
|
||||||
# 读取当前无人机数量避免重复开关
|
# 读取当前无人机数量避免重复开关
|
||||||
cur_drone_count = DigitReader().get_drone(config.recog.gray)
|
cur_drone_count = DigitReader().get_drone(config.recog.gray)
|
||||||
|
# 读取生产速度
|
||||||
|
speed = self.read_speed()
|
||||||
# 获取无人机加速的剩余时间
|
# 获取无人机加速的剩余时间
|
||||||
remain_time = GetRemainTimeSolver().run(room)
|
remain_time = GetRemainTimeSolver().run(room)
|
||||||
|
if only_get_time:
|
||||||
|
return remain_time % production_time[cur_product] / speed
|
||||||
# 使用无人机加速
|
# 使用无人机加速
|
||||||
start_time = datetime.now()
|
start_time = datetime.now()
|
||||||
drone_count = remain_time % production_time[cur_product] // 180
|
drone_count = remain_time % production_time[cur_product] // 180
|
||||||
|
@ -57,7 +61,6 @@ class SwitchProductSolver(SceneGraphSolver, BaseMixin):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 等待产物完成
|
# 等待产物完成
|
||||||
speed = self.read_speed()
|
|
||||||
wait_time = (
|
wait_time = (
|
||||||
remain_time % production_time[cur_product] % 180 / speed
|
remain_time % production_time[cur_product] % 180 / speed
|
||||||
- (datetime.now() - start_time).total_seconds()
|
- (datetime.now() - start_time).total_seconds()
|
||||||
|
|
|
@ -35,7 +35,7 @@ def infra_arrange_confirm(solver: BaseSolver):
|
||||||
solver.tap((1452, 1029))
|
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):
|
def infra_arrange_order(solver: BaseSolver):
|
||||||
solver.tap_element("arrange_blue_yes", x_rate=0.66)
|
solver.tap_element("arrange_blue_yes", x_rate=0.66)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue