Beispiel #1
0
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()
Beispiel #2
0
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
Beispiel #3
0
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')
Beispiel #4
0
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')
Beispiel #5
0
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
Beispiel #6
0
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)
Beispiel #7
0
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
Beispiel #8
0
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('指挥喵处理完毕')