def run(): print('每日任务开始。。。') print('目前仅支持 ”商船护卫“、”海域突进“、“斩首行动” 三个类别。') print('“战术研修”和“破交作战”由于战力要求和操控要求比较高,因此暂不能自动化。') print() adb = AutoAdb() task_list = [{ 'loc': Location(adb, None, 160, 400, '商船护卫'), 'day': [1, 4, 7] }, { 'loc': Location(adb, None, 370, 400, '海域突进'), 'day': [2, 5, 7] }, { 'loc': Location(adb, None, 900, 400, '斩首行动'), 'day': [3, 6, 7] }] week_day = datetime.datetime.now().weekday() + 1 for task in task_list: task_loc = task['loc'] if week_day not in task['day']: continue PageUtils.to_stage_page() adb.wait( 'temp_images/daily-task/daily-task/goto-daily-task.png').click() task_loc.click() Location(adb, None, 640, 400).click() # 执行方法 print('今天是周%d,%s开放' % (week_day, task_loc.remark)) TaskHelper(task_loc.remark).run() PageUtils.to_main_page()
def deal_sos_sign(): adb = AutoAdb() adb.wait('temp_images/sos/sos-signal.png').click() # 将已经开启的潜艇关卡解决掉 goto_stage_page = adb.click('temp_images/sos/goto-stage-page.png') if goto_stage_page: # 有些情况会直接进入关卡,因此不需要“点击关卡” print('发现已经开启的关卡,即将进入战斗。。。') if PageUtils.in_enemy_page(): StageFight.fight_all_enemy() else: StageFight.fight_stage(['temp_images/sos/stage-icon.png']) return True # 搜索新的信号 print('搜索新的信号。。。') adb.click('temp_images/sos/search-signal.png') while True: if adb.check('temp_images/sos/no-chance.png'): print('已经没有新的信号,SOS关卡执行完毕,脚本退出') PageUtils.to_stage_page() exit() # 如果有确认按钮,则点击确认,前往关卡 adb.click('temp_images/confirm-btn.png') # 如果已经发现了关卡按钮,则点击 click_stage = adb.click('temp_images/sos/stage-icon.png') if click_stage: print('进入SOS关卡战斗。。。') confirmed = StageFight.confirm_stage_team() if not confirmed: continue return True
def pick_stage(): # 判断港口是否满员 check_port_full() auto_adb = AutoAdb() # 判断是否已经在关卡中 res = auto_adb.wait('temp_images/stage/in-stage.png', max_wait_time=2).is_valuable() if res: return # 确定进入 target_stage_list = TempUtils.get_temp_rel_path_list( 'temp_images/target-stage') start_time = datetime.now() while True: duration = (datetime.now() - start_time).seconds print('\r扫描目标关卡中 ... %ds' % duration, end='') loc = auto_adb.get_location(*target_stage_list) if loc is not None: break print('%s √' % loc.temp_rel_path) loc.click() # 这里不是重复, 是确实要点两下. 一次确认关卡, 一次确认队伍 auto_adb.wait('temp_images/stage/into-confirm.png').click() auto_adb.wait('temp_images/stage/into-confirm.png', episode=check_port_full).click() # 特殊关卡会提示更多 auto_adb.wait('temp_images/fight/fight-confirm.png', max_wait_time=3).click() # 确保已经进入关卡 auto_adb.wait('temp_images/stage/in-stage.png')
def deal_accident_when_provoke_enemy(): auto_adb = AutoAdb() # 自动战斗 res = auto_adb.click('temp_images/fight/auto-fight-confirm-1.png') if res: print('确认自律战斗') auto_adb.wait('temp_images/fight/auto-fight-confirm-2.png').click() # 处理途中获得道具的提示 auto_adb.click('temp_images/stage/get-tool.png') # 处理伏击 auto_adb.click('temp_images/stage/escape.png')
def fight_finish(): adb = AutoAdb() # 等待战斗结束 timer = Timer() while True: print('\r等待战斗结束 %ds ...' % timer.get_duration(), end='') skip_dialog() time.sleep(3) # 每次循环加一个等待时间,降低cpu占用 if adb.check('temp_images/fight/fight-finish.png'): print(' √ 总耗时: %ds' % timer.get_duration()) break # 战斗结束 fight_result = None ending_loc = Location(adb, None, 1160, 690) while True: if fight_result is None: # 处理新船 new_ship = adb.check('temp_images/fight/new-ship.png') if new_ship: print('发现新船!!') fight_result = True ending_loc.click() adb.click('temp_images/confirm-btn.png') continue # 处理失败 fail_confirm = adb.click('temp_images/fight/fail-confirm.png') if fail_confirm: fight_result = False # 战队难以成型时点击确定 adb.wait('temp_images/confirm-btn.png', max_wait_time=3).click() break # 持续点击右下角 ending_loc.click() # 回到 stage列表页面 或 敌人列表页面 也说明战斗已经结束 if adb.check('temp_images/page/in-stage.png', # stage列表 'temp_images/page/in-enemy.png', # enemy列表 'temp_images/page/in-daily.png'): # 日常任务结束后的界面 fight_result = True break if adb.check('temp_images/page/in-operation.png'): print('误入演习界面,退出。。。') PageUtils.back() continue print('战斗胜利~(~ ̄▽ ̄)~' if fight_result else '战斗失败 >_<') # 战斗结束后可能出现紧急任务提示 # 由于是透明遮罩, 所以无法根据其他元素是否显示而做出反应, 只能等一定的时间 adb.wait('temp_images/confirm-btn.png', max_wait_time=2).click() return fight_result
def provoke_enemy(): # 这里要多等待几秒, 因为经常会有个动画影响寻敌 time.sleep(3) auto_adb = AutoAdb() check = auto_adb.check('temp_images/stage/in-unit.png') if check: print('关卡已经结束') return False # 弹药为空时切换到第二舰队 if auto_adb.check('temp_images/stage/bullet-empty.png'): auto_adb.wait('temp_images/stage/switch-over.png').click(2) image_rel_path_list = TempUtils.get_temp_rel_path_list('temp_images/enemy') slider = Slider() while True: print('寻找敌人 ... ') enemy_loc = auto_adb.get_location(*image_rel_path_list) if enemy_loc is None: slider.slider() continue # 如果找到的是boss, 且当前是第一队, 则切换到第二队开始寻找敌人 is_boss = 'boss' in enemy_loc.temp_rel_path is_first_team = auto_adb.check('temp_images/stage/team-1.png') if is_boss and is_first_team: auto_adb.wait('temp_images/stage/switch-over.png').click(2) continue enemy_loc.click() # 等待进击按钮出现, 期间会不断处理意外情况, 如果指定时间内出现按钮, 则执行结束, 否则再次循环 res = auto_adb.wait('temp_images/fight/fight.png', max_wait_time=8, episode=deal_accident_when_provoke_enemy).click() if res: # 是否出现满员提示 check_port_full() return True else: # 如果点击后未进入确认界面, 说明那里不可到达, 此时去除image_rel_path_list中的值 image_rel_path_list.remove(enemy_loc.temp_rel_path)
def fight(): adb = AutoAdb() # 战斗前各种按钮的点击 while True: if PageUtils.in_fight_page(): break click = adb.click('temp_images/fight/fight.png') if click: continue retired = PortUtils.check_port_full() if retired: # 如果发生了退役操作,则再次点击确认按钮 AutoAdb().wait('temp_images/fight/fight.png').click() continue low_mood = adb.check('temp_images/fight/low-mood.png') if low_mood: print('低心情状态,脚本终止') exit() print('战斗开始 >>>') adb.wait('temp_images/fight/fight-finish.png', cycle_interval=5) # 战斗结束 fight_result = None ending_loc = Location(adb, None, 1160, 690) while True: if fight_result is None: # 处理新船 new_ship = adb.check('temp_images/fight/new-ship.png') if new_ship: print('发现新船!!') fight_result = True ending_loc.click() adb.click('temp_images/confirm-btn.png') continue # 处理失败 fail_confirm = adb.click('temp_images/fight/fail-confirm.png') if fail_confirm: fight_result = False # 战队难以成型时点击确定 adb.wait('temp_images/confirm-btn.png', max_wait_time=3).click() break # 持续点击右下角 ending_loc.click() # 回到 stage列表页面 或 敌人列表页面 也说明战斗已经结束 if adb.check( 'temp_images/page/in-stage.png', # stage列表 'temp_images/page/in-enemy.png', # enemy列表 'temp_images/page/main-page-button.png'): # 日常任务结束后的界面 fight_result = True break print('战斗胜利~(~ ̄▽ ̄)~' if fight_result else '战斗失败 >_<') # 战斗结束后可能出现紧急任务提示 # 由于是透明遮罩, 所以无法根据其他元素是否显示而做出反应, 只能等一定的时间 adb.wait('temp_images/confirm-btn.png', max_wait_time=2).click() return fight_result
def fight_in_stage(): auto_adb = AutoAdb() while True: # 寻找敌人 res = provoke_enemy() if not res: break print('战斗开始 >>>') auto_adb.wait('temp_images/fight/fight-finish.png', cycle_interval=5) print(' 战斗结束 !') ending_loc = Location(auto_adb, None, 1040, 660) while True: in_stage = auto_adb.check('temp_images/stage/in-stage.png') in_unit = auto_adb.check('temp_images/stage/in-unit.png') if in_stage or in_unit: break new_ship = auto_adb.check('temp_images/fight/new-ship.png') if new_ship: print('发现新船!!') ending_loc.click() auto_adb.click('temp_images/fight/new-ship-confirm.png') continue fail_confirm = auto_adb.click('temp_images/fight/fail-confirm.png') if fail_confirm: input('战斗失败!! 请整理后按下任何按键以继续 ...') continue ending_loc.click() # 可能出现紧急任务提示 # 由于是透明遮罩, 所以无法根据其他元素是否显示而做出反应, 只能等一定的时间 auto_adb.wait('temp_images/fight/urgent-task.png', max_wait_time=3).click()
def check_port_full(): adb = AutoAdb() port_full = adb.check('temp_images/port/port-full.png') if not port_full: return False print('船坞已经满员了... ', end='') auto_retire = ConfigUtils.get('auto_retire', fallback=False) if auto_retire: print('开始自动退役... ') adb.wait('temp_images/port/port-full-retire.png').click() # 整理 adb.wait('temp_images/port/retire.png').click() # 一键退役 adb.wait('temp_images/port/retire-confirm.png').click() # 确定舰娘 adb.wait('temp_images/port/retire-confirm.png', max_wait_time=2).click() # 确定(可能出现的)精英舰娘 adb.wait('temp_images/port/retire-confirm-1.png').click() # (获得物资)点击继续 adb.wait('temp_images/port/retire-confirm.png').click() # 确定装备 adb.wait('temp_images/port/retire-confirm.png').click() # 确定物资 adb.wait('temp_images/port/retire-confirm-1.png').click() # (获得物资)点击继续 adb.wait('temp_images/port/cancel.png').click() # (获得物资)点击继续 print('退役完成, 程序继续执行') return True print('未启用自动退役配置, 程序退出') exit()
def run(): adb = AutoAdb() blank_loc = Location(adb, None, 600, 30) PageUtils.to_main_page() # 点击生活区 Location(adb, None, 580, 680).click() # 点击指挥喵 Location(adb, None, 980, 460).click() # 判断有无免费订购。 have_free = adb.click("temp_images/daily-task/meow/free-meow.png", threshold=0.95) if have_free: # 第二次判断 have_free = adb.check("temp_images/daily-task/meow/free-meow-1.png", threshold=0.95) if have_free: print('领取每日免费喵箱...') # 结算 adb.wait('temp_images/daily-task/meow/buy.png').click() # 点击确定 adb.wait('temp_images/daily-task/meow/confirm.png').click() # 二次确定 adb.wait("temp_images/click-to-continue.png").click() # 关闭领取对话框 blank_loc.click() # 点击训练 Location(adb, None, 1200, 680).click() # 等待对话框打开 adb.wait('temp_images/daily-task/meow/in-lesson-page.png') while adb.click('temp_images/daily-task/meow/lesson-finish.png'): print('领取训练完成的喵...') adb.wait('temp_images/daily-task/meow/new-meow-btn.png').click() # 点击“开始训练” adb.wait('temp_images/daily-task/meow/start-lesson.png').click() # 点击“一键选择” adb.wait("temp_images/daily-task/meow/pick-all.png").click() # 点击“开始训练” adb.wait('temp_images/daily-task/meow/start-lesson.png').click() # 点击确认 adb.wait("temp_images/daily-task/meow/confirm.png", max_wait_time=3).click() # 回到主页 PageUtils.to_main_page() print('指挥喵处理完毕')