From eabf563f72c42828d6d1bd6b11fbdd5340bcb361 Mon Sep 17 00:00:00 2001 From: Shawnsdaddy Date: Fri, 15 Sep 2023 09:21:29 -0700 Subject: [PATCH] improve logic --- arknights_mower/__main__.py | 5 +- arknights_mower/solvers/base_schedule.py | 147 +++++++++++------------ arknights_mower/utils/scheduler_task.py | 10 +- diy.py | 2 +- 4 files changed, 79 insertions(+), 85 deletions(-) diff --git a/arknights_mower/__main__.py b/arknights_mower/__main__.py index 11b04c23f..46075fc46 100644 --- a/arknights_mower/__main__.py +++ b/arknights_mower/__main__.py @@ -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: @@ -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: @@ -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': diff --git a/arknights_mower/solvers/base_schedule.py b/arknights_mower/solvers/base_schedule.py index 873ab58ef..a947ac80b 100644 --- a/arknights_mower/solvers/base_schedule.py +++ b/arknights_mower/solvers/base_schedule.py @@ -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: @@ -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 diff --git a/arknights_mower/utils/scheduler_task.py b/arknights_mower/utils/scheduler_task.py index 64b5383b4..c1aec339b 100644 --- a/arknights_mower/utils/scheduler_task.py +++ b/arknights_mower/utils/scheduler_task.py @@ -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) @@ -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 diff --git a/diy.py b/diy.py index 55d5e4c0c..7eb0315f0 100644 --- a/diy.py +++ b/diy.py @@ -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: