Compare commits

...

3 commits

2 changed files with 78 additions and 94 deletions

View file

@ -38,7 +38,7 @@ from arknights_mower.utils.email import send_message
from arknights_mower.utils.graph import SceneGraphSolver
from arknights_mower.utils.image import cropimg, loadres, thres2
from arknights_mower.utils.log import logger
from arknights_mower.utils.operators import Operators
from arknights_mower.utils.operators import Operators, Operator
from arknights_mower.utils.path import get_path
from arknights_mower.utils.plan import PlanTriggerTiming
from arknights_mower.utils.recognize import Scene
@ -2591,7 +2591,55 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
EnterRoomSolver().run(room)
def get_agent_from_room(self, room, read_time_index=None):
if read_time_index is None:
read_time_index = []
if room == "meeting" and not config.conf.leifeng_mode:
self.sleep(0.5)
config.recog.update()
clue_res = self.read_screen(
config.recog.img, limit=10, cord=((645, 977), (755, 1018))
)
if clue_res != 11:
self.clue_count = clue_res
logger.info(f"当前拥有线索数量为{self.clue_count}")
if room.startswith("dorm"):
read_time_index = [
i
for i, obj in enumerate(self.op_data.plan[room])
if obj.agent == "Free" or obj.agent == "菲亚梅塔"
]
result = GetAgentFromRoomSolver().run(room, read_time_index)
for i in range(len(result)):
_name = result[i]["agent"]
_mood = result[i]["mood"]
if _name != "":
if _name not in self.op_data.operators.keys() and _name in agent_list:
self.op_data.add(Operator(_name, ""))
update_time = False
agent = self.op_data.operators[_name]
if self.op_data.operators[_name].need_to_refresh(r=room) or (
self.tasks and self.tasks[0].type == TaskTypes.SHIFT_ON
):
update_time = True
else:
_mood = self.op_data.operators[_name].current_mood()
high_no_time = self.op_data.update_detail(
_name, _mood, room, i, update_time
)
result[i]["depletion_rate"] = agent.depletion_rate
if high_no_time is not None and high_no_time not in read_time_index:
logger.debug(
f"检测到高效组休息时间数据不存在:{room},{high_no_time}"
)
read_time_index.append(high_no_time)
if i in read_time_index:
logger.debug(f"开始记录时间:{room},{i}")
self.op_data.refresh_dorm_time(room, i, result[i])
logger.debug(f"停止记录时间:{str(result[i])}")
for _operator in self.op_data.operators.keys():
if self.op_data.operators[
_operator

View file

@ -1,134 +1,70 @@
from datetime import datetime, timedelta
from arknights_mower.data import agent_list
from arknights_mower import __main__
from arknights_mower.solvers.base_mixin import BaseMixin
from arknights_mower.solvers.enter_room import EnterRoomSolver
from arknights_mower.utils import config
from arknights_mower.utils.graph import SceneGraphSolver
from arknights_mower.utils.image import cropimg
from arknights_mower.utils.log import logger
from arknights_mower.utils.operators import Operator
from arknights_mower.utils.scheduler_task import (
TaskTypes,
)
name_x = (1288, 1869)
name_y = [(135, 326), (344, 535), (553, 744), (532, 723), (741, 932)]
name_p = [tuple(zip(name_x, y)) for y in name_y]
mood_x = (1470, 1780)
mood_y = [(219, 220), (428, 429), (637, 638), (615, 616), (823, 824)]
mood_p = [tuple(zip(mood_x, y)) for y in mood_y]
time_x = (1650, 1780)
time_y = [(270, 305), (480, 515), (690, 725), (668, 703), (877, 912)]
time_p = [tuple(zip(time_x, y)) for y in time_y]
mood_x = (1470, 1780)
mood_y = [(219, 220), (428, 429), (637, 638), (615, 616), (823, 825)]
mood_y = (219, 428, 637, 615, 823)
mood_y = [(y, y + 1) for y in mood_y]
mood_p = [tuple(zip(mood_x, y)) for y in mood_y]
class GetAgentFromRoomSolver(SceneGraphSolver, BaseMixin):
def run(self, room: str, read_time_index=None):
from arknights_mower import __main__
from arknights_mower.solvers.base_schedule import BaseSchedulerSolver
base_scheduler = __main__.base_scheduler
def run(self, room: str, read_agent_time=False):
"""
Args:
room: 房间名
read_agent_time: 读取工作或休息时间
"""
self.room = room
self.read_time_index = read_time_index
if self.read_time_index is None:
self.read_time_index = []
self.op_data = base_scheduler.op_data
self.tasks = base_scheduler.tasks
self.need_swipe = False
self.length = len(self.op_data.plan[self.room])
self.read_agent_time = read_agent_time
self.index = 0
self.result = []
self.length = len(__main__.base_scheduler.op_data.plan[self.room])
self.need_swipe = True if self.length > 3 else False
self.wait_start()
self.room_classify()
super().run()
BaseSchedulerSolver().op_data = self.op_data
BaseSchedulerSolver().tasks = self.tasks
return self.result
def timeout(self) -> bool:
return datetime.now() > self.start_time + timedelta(seconds=5)
return datetime.now() > self.start_time + timedelta(seconds=3)
def wait_start(self):
self.start_time = datetime.now()
def room_classify(self):
if self.room == "meeting" and not config.conf.leifeng_mode:
self.sleep(0.5)
config.recog.update()
clue_res = self.read_screen(
config.recog.img, limit=10, cord=((645, 977), (755, 1018))
)
if clue_res != 11:
self.clue_count = clue_res
logger.info(f"当前拥有线索数量为{self.clue_count}")
if self.room.startswith("dorm"):
self.read_time_index = [
i
for i, obj in enumerate(self.op_data.plan[self.room])
if obj.agent == "Free" or obj.agent == "菲亚梅塔"
]
if self.length > 3:
self.need_swipe = True
def read_agent_data(self):
def read_agent_data(self, index):
data = {}
if self.find("infra_no_operator", scope=name_p[self.index]):
_name = ""
if self.find("infra_no_operator", scope=name_p[index]):
data["agent"] = ""
data["mood"] = -1
else:
_name = self.read_screen(
cropimg(config.recog.gray, name_p[self.index]), type="name"
data["agent"] = self.read_screen(
cropimg(config.recog.gray, name_p[index]), type="name"
)
_mood = 24
# 如果房间不为空
if _name != "":
if _name not in self.op_data.operators.keys() and _name in agent_list:
self.op_data.add(Operator(_name, ""))
update_time = False
agent = self.op_data.operators[_name]
if self.op_data.operators[_name].need_to_refresh(r=self.room) or (
self.tasks and self.tasks[0].type == TaskTypes.SHIFT_ON
):
_mood = self.read_accurate_mood(
cropimg(config.recog.gray, mood_p[self.index])
)
update_time = True
else:
_mood = self.op_data.operators[_name].current_mood()
high_no_time = self.op_data.update_detail(
_name, _mood, self.room, self.index, update_time
data["mood"] = self.read_accurate_mood(
cropimg(config.recog.gray, mood_p[index])
)
data["depletion_rate"] = agent.depletion_rate
if high_no_time is not None and high_no_time not in self.read_time_index:
logger.debug(
f"检测到高效组休息时间数据不存在:{self.room},{high_no_time}"
)
self.read_time_index.append(high_no_time)
else:
_mood = -1
data["agent"] = _name
data["mood"] = _mood
if self.index in self.read_time_index and _name != "":
if _mood == 24 or self.room in ["central", "meeting", "factory"]:
data["time"] = datetime.now()
else:
upperLimit = 43200
logger.debug(f"开始记录时间:{self.room},{self.index}")
data["time"] = self.double_read_time(
time_p[self.index], upperLimit=upperLimit
)
self.op_data.refresh_dorm_time(self.room, self.index, data)
logger.debug(f"停止记录时间:{str(data)}")
if self.read_agent_time:
if data["mood"] == 24 or self.room in ["central", "meeting", "factory"]:
data["time"] = datetime.now()
else:
data["time"] = self.double_read_time(time_p[index])
self.result.append(data)
def transition(self) -> bool:
if self.detect_product_complete():
logger.info("检测到产物收取提示")
self.sleep(1)
self.sleep(0.5)
elif self.find("room_detail"):
self.wait_start()
if self.index >= 3 and self.need_swipe:
@ -146,7 +82,7 @@ class GetAgentFromRoomSolver(SceneGraphSolver, BaseMixin):
elif self.index == self.length:
return True
elif self.index < self.length:
self.read_agent_data()
self.read_agent_data(self.index)
self.index += 1
else:
EnterRoomSolver().run(self.room)