Skip to content

Commit

Permalink
improve logic
Browse files Browse the repository at this point in the history
  • Loading branch information
Shawnsdaddy committed Sep 15, 2023
1 parent 91f73ad commit eabf563
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 85 deletions.
5 changes: 3 additions & 2 deletions arknights_mower/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ def simulate():
base_scheduler.op_data.operators[k].depletion_rate = v.depletion_rate
base_scheduler.op_data.operators[k].current_room = v.current_room
base_scheduler.op_data.operators[k].current_index = v.current_index
timezone_offset = 0
while True:
try:
if len(base_scheduler.tasks) > 0:
Expand All @@ -223,7 +224,7 @@ def simulate():
context = f"下一次任务:{base_scheduler.tasks[0].plan}"
logger.info(context)
logger.info(subject)
body = task_template.render(tasks=base_scheduler.tasks)
body = task_template.render(tasks=[obj.format(timezone_offset) for obj in base_scheduler.tasks])
base_scheduler.send_email(body, subject, 'html')
base_scheduler.maa_plan_solver()
elif sleep_time > 0:
Expand All @@ -235,7 +236,7 @@ def simulate():
base_scheduler.device.exit(base_scheduler.package_name)
base_scheduler.task_count += 1
logger.info(f"第{base_scheduler.task_count}次任务结束,关闭游戏,降低功耗")
body = task_template.render(tasks=base_scheduler.tasks)
body = task_template.render(tasks=[obj.format(timezone_offset) for obj in base_scheduler.tasks])
base_scheduler.send_email(body, subject, 'html')
time.sleep(sleep_time)
if len(base_scheduler.tasks) > 0 and base_scheduler.tasks[0].type.value.split('_')[0] == 'maa':
Expand Down
147 changes: 73 additions & 74 deletions arknights_mower/solvers/base_schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,9 +713,8 @@ def plan_solver(self):
logger.exception(e)
# 如果下个 普通任务 >5 分钟则补全宿舍
logger.debug('tasks:' + str(self.tasks))
if find_next_task(self.tasks,compare_time=datetime.now() + timedelta(seconds=300)) is None:
if self.agent_get_mood() is None:
self.backup_plan_solver()
if self.agent_get_mood() is None:
self.backup_plan_solver()

def backup_plan_solver(self):
try:
Expand Down Expand Up @@ -1374,77 +1373,77 @@ def drone(self, room: str, not_customize=False, not_return=False):
self.back(interval=2, rebuild=False)
self.back(interval=2)

# 用于制造站切换产物,请注意在调用该函数前有足够的无人机,并补足相应制造站产物,目前仅支持中级作战记录与赤金之间的切换
def 制造站切换产物(self, room: str, 目标产物: str, not_customize=False, not_return=False):
# 点击进入该房间
self.进入房间(room)
while self.get_infra_scene() == 9:
time.sleep(1)
self.recog.update()
# 进入房间详情
self.tap((self.recog.w * 0.05, self.recog.h * 0.95), interval=3)
# 关闭掉房间总览
error_count = 0
while self.find('factory_accelerate') is None:
if error_count > 5:
raise Exception('未成功进入制造详情界面')
self.tap((self.recog.w * 0.05, self.recog.h * 0.95), interval=3)
error_count += 1
accelerate = self.find('factory_accelerate')
无人机数量 = 当前项目.digit_reader.get_drone(当前项目.recog.gray, 当前项目.recog.h, 当前项目.recog.w)
if accelerate:
self.tap_element('factory_accelerate')
self.recog.update()
剩余制造加速总时间 = self.digit_reader.识别制造加速总剩余时间(self.recog.gray, self.recog.h, self.recog.w)
# logger.info(f'制造站 B{room[5]}0{room[7]} 剩余制造总时间为 {剩余制造加速总时间}')
= int(剩余制造加速总时间[0:3])
if > 118: 当前产物 = '经验'
else: 当前产物 = '赤金'
if 当前产物 == 目标产物: self.返回基建主界面()
else:
logger.info(f'制造站 B{room[5]}0{room[7]} 当前产物为{当前产物},切换产物为{目标产物}')
需要无人机数 = 0
while 需要无人机数 < 10:
总分钟数 = int(剩余制造加速总时间[4:6]) + 60 *
if 当前产物 == '赤金':
需要无人机数 = (总分钟数 % 72) // 3 + 1
elif 当前产物 == '经验':
需要无人机数 = (总分钟数 % 180) // 3 + 1
else:
logger.warning('目前不支持该产物切换策略,尚待完善')
self.返回基建主界面()
if 需要无人机数 > 无人机数量 - 10:
logger.warning(f'''
切换产物需要无人机{需要无人机数}个,当前仅有{无人机数量}个,
无法切换产物,建议该任务至少在{(需要无人机数 - 无人机数量 + 10) * 3.5 // 3}分钟后再执行
''')
self.返回基建主界面()
else:
logger.warning(f'需要加无人机{需要无人机数}个')
for 次数 in range(需要无人机数):
self.tap((self.recog.w * 1320 // 1920, self.recog.h * 502 // 1080), interval=0.05)
self.recog.update()
剩余制造加速总时间 = self.digit_reader.识别制造加速总剩余时间(
self.recog.gray, self.recog.h, self.recog.w)
# logger.info(f'制造站 B{room[5]}0{room[7]} 剩余制造总时间为 {剩余制造加速总时间}')
总分钟数 = int(剩余制造加速总时间[4:6]) + 60 *
if 当前产物 == '赤金':
需要无人机数 = (总分钟数 % 72) // 3 + 1
elif 当前产物 == '经验':
需要无人机数 = (总分钟数 % 180) // 3 + 1
else:
logger.warning('目前不支持该产物切换策略,尚待完善')
self.返回基建主界面()
self.tap((self.recog.w * 3 // 4, self.recog.h * 4 // 5), interval=3) # 确认加速
self.tap((self.recog.w * 9 // 10, self.recog.h // 2), interval=1) # 点击当前产品
if 目标产物 == '经验':
self.tap((self.recog.w // 2, self.recog.h // 2), interval=1) # 点击中级作战记录
elif 目标产物 == '赤金':
self.tap((self.recog.w // 10, self.recog.h // 3), interval=1) # 进入贵金属分类
self.tap((self.recog.w // 2, self.recog.h // 4), interval=1) # 点击赤金
self.tap((self.recog.w * 3 // 4, self.recog.h * 2 // 7), interval=1) # 点击最多
self.tap((self.recog.w * 3 // 4, self.recog.h * 5 // 6), interval=1) # 确认数量
self.tap((self.recog.w * 3 // 4, self.recog.h * 7 // 10), interval=1) # 确认更改
# # 用于制造站切换产物,请注意在调用该函数前有足够的无人机,并补足相应制造站产物,目前仅支持中级作战记录与赤金之间的切换
# def 制造站切换产物(self, room: str, 目标产物: str, not_customize=False, not_return=False):
# # 点击进入该房间
# self.进入房间(room)
# while self.get_infra_scene() == 9:
# time.sleep(1)
# self.recog.update()
# # 进入房间详情
# self.tap((self.recog.w * 0.05, self.recog.h * 0.95), interval=3)
# # 关闭掉房间总览
# error_count = 0
# while self.find('factory_accelerate') is None:
# if error_count > 5:
# raise Exception('未成功进入制造详情界面')
# self.tap((self.recog.w * 0.05, self.recog.h * 0.95), interval=3)
# error_count += 1
# accelerate = self.find('factory_accelerate')
# 无人机数量 = 当前项目.digit_reader.get_drone(当前项目.recog.gray, 当前项目.recog.h, 当前项目.recog.w)
# if accelerate:
# self.tap_element('factory_accelerate')
# self.recog.update()
# 剩余制造加速总时间 = self.digit_reader.识别制造加速总剩余时间(self.recog.gray, self.recog.h, self.recog.w)
# # logger.info(f'制造站 B{room[5]}0{room[7]} 剩余制造总时间为 {剩余制造加速总时间}')
# 时 = int(剩余制造加速总时间[0:3])
# if 时 > 118: 当前产物 = '经验'
# else: 当前产物 = '赤金'
# if 当前产物 == 目标产物: self.返回基建主界面()
# else:
# logger.info(f'制造站 B{room[5]}0{room[7]} 当前产物为{当前产物},切换产物为{目标产物}')
# 需要无人机数 = 0
# while 需要无人机数 < 10:
# 总分钟数 = int(剩余制造加速总时间[4:6]) + 60 * 时
# if 当前产物 == '赤金':
# 需要无人机数 = (总分钟数 % 72) // 3 + 1
# elif 当前产物 == '经验':
# 需要无人机数 = (总分钟数 % 180) // 3 + 1
# else:
# logger.warning('目前不支持该产物切换策略,尚待完善')
# self.返回基建主界面()
# if 需要无人机数 > 无人机数量 - 10:
# logger.warning(f'''
# 切换产物需要无人机{需要无人机数}个,当前仅有{无人机数量}个,
# 无法切换产物,建议该任务至少在{(需要无人机数 - 无人机数量 + 10) * 3.5 // 3}分钟后再执行
# ''')
# self.返回基建主界面()
# else:
# logger.warning(f'需要加无人机{需要无人机数}个')
# for 次数 in range(需要无人机数):
# self.tap((self.recog.w * 1320 // 1920, self.recog.h * 502 // 1080), interval=0.05)
# self.recog.update()
# 剩余制造加速总时间 = self.digit_reader.识别制造加速总剩余时间(
# self.recog.gray, self.recog.h, self.recog.w)
# # logger.info(f'制造站 B{room[5]}0{room[7]} 剩余制造总时间为 {剩余制造加速总时间}')
# 总分钟数 = int(剩余制造加速总时间[4:6]) + 60 * 时
# if 当前产物 == '赤金':
# 需要无人机数 = (总分钟数 % 72) // 3 + 1
# elif 当前产物 == '经验':
# 需要无人机数 = (总分钟数 % 180) // 3 + 1
# else:
# logger.warning('目前不支持该产物切换策略,尚待完善')
# self.返回基建主界面()
# self.tap((self.recog.w * 3 // 4, self.recog.h * 4 // 5), interval=3) # 确认加速
# self.tap((self.recog.w * 9 // 10, self.recog.h // 2), interval=1) # 点击当前产品
# if 目标产物 == '经验':
# self.tap((self.recog.w // 2, self.recog.h // 2), interval=1) # 点击中级作战记录
# elif 目标产物 == '赤金':
# self.tap((self.recog.w // 10, self.recog.h // 3), interval=1) # 进入贵金属分类
# self.tap((self.recog.w // 2, self.recog.h // 4), interval=1) # 点击赤金
# self.tap((self.recog.w * 3 // 4, self.recog.h * 2 // 7), interval=1) # 点击最多
# self.tap((self.recog.w * 3 // 4, self.recog.h * 5 // 6), interval=1) # 确认数量
# self.tap((self.recog.w * 3 // 4, self.recog.h * 7 // 10), interval=1) # 确认更改

def get_arrange_order(self) -> ArrangeOrder:
best_score, best_order = 0, None
Expand Down
10 changes: 2 additions & 8 deletions arknights_mower/utils/scheduler_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class TaskTypes(Enum):
SELF_CORRECTION = ("self_correction", "纠错", 2)
CLUE_PARTY = ("Impart", "趴体", 2)
MAA_MALL = ("maa_Mall", "MAA信用购物", 2)
NOT_SPECIFIC = ("", "三无", 2)
NOT_SPECIFIC = ("", "空任务", 2)

def __new__(cls, value, display_value, priority):
obj = object.__new__(cls)
Expand Down Expand Up @@ -79,13 +79,7 @@ def __init__(self, time=None, task_plan={}, task_type='', meta_data = ""):
self.type = task_type
self.meta_data = meta_data

def time_offset(self, h):
after_offset = copy.deepcopy(self)
after_offset.time += timedelta(hours=h)
after_offset.type = after_offset.type.display_value
return after_offset

def format(self, time_offset):
def format(self, time_offset=0):
res = copy.deepcopy(self)
res.time += timedelta(hours=time_offset)
res.type = res.type.display_value
Expand Down
2 changes: 1 addition & 1 deletion diy.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ def simulate():
sleep_time = (base_scheduler.tasks[0].time - datetime.now()).total_seconds()
logger.info('||'.join([str(t) for t in base_scheduler.tasks]))
base_scheduler.send_email(
task_template.render(tasks=[obj.time_offset(timezone_offset) for obj in base_scheduler.tasks]), '',
task_template.render(tasks=[obj.format(timezone_offset) for obj in base_scheduler.tasks]), '',
'html')
# 如果任务间隔时间超过9分钟则启动MAA
if sleep_time > 540:
Expand Down

0 comments on commit eabf563

Please sign in to comment.