예제 #1
0
    def is_combat_loading(self):
        """
        Returns:
            bool:
        """
        left = color_bar_percentage(self.device.image, area=LOADING_BAR.area, prev_color=(99, 150, 255))
        right = color_bar_percentage(self.device.image, area=LOADING_BAR.area, prev_color=(225, 225, 225), reverse=True)
        if 0.15 < left < 0.95 and right > 0.15 and left + right <= 1.2:
            logger.attr('Loading', f'{int(left * 100)}%({int(right * 100)}%)')
            return True

        return False
예제 #2
0
    def _calculate_hp(image,
                      area,
                      reverse=False,
                      starter=2,
                      prev_color=(239, 32, 33)):
        """
        Args:
            image:
            area:
            reverse: True if HP is left align.
            starter:
            prev_color:

        Returns:
            float: HP. 0 to 1.
        """
        # bar = np.array(image.crop(area))
        # length = bar.shape[1]
        # bar = np.swapaxes(bar, 0, 1)
        # bar = bar[::-1, :, :] if reverse else bar
        # prev_index = 0
        # for index, color in enumerate(bar):
        #     if index < starter:
        #         continue
        #     mask = color_similar_1d(color, prev_color, threshold=30)
        #     if np.any(mask):
        #         prev_color = color[mask].mean(axis=0)
        #         prev_index = index
        #
        # return prev_index / length
        return color_bar_percentage(image,
                                    area,
                                    prev_color=prev_color,
                                    starter=starter,
                                    reverse=reverse)
예제 #3
0
    def map_get_info(self):
        """
        Logs:
            | INFO | [Map_info] 98%, star_1, star_2, star_3, clear, 3_star, green, fast_forward
        """
        self.map_clear_percentage = color_bar_percentage(
            self.device.image, area=MAP_CLEAR_PERCENTAGE.area, prev_color=(231, 170, 82))
        self.map_achieved_star_1 = self.appear(MAP_STAR_1)
        self.map_achieved_star_2 = self.appear(MAP_STAR_2)
        self.map_achieved_star_3 = self.appear(MAP_STAR_3)
        self.map_is_clear = self.map_clear_percentage > 0.95
        self.map_is_3_star = self.map_achieved_star_1 and self.map_achieved_star_2 and self.map_achieved_star_3
        self.map_is_green = self.appear(MAP_GREEN)
        self.map_has_fast_forward = self.map_is_3_star and self.map_is_green and fast_forward.appear(main=self)

        # Override config
        if self.map_achieved_star_1:
            # Story before boss spawn, Attribute "story_refresh_boss" in chapter_template.lua
            self.config.MAP_HAS_MAP_STORY = False
        self.config.MAP_CLEAR_ALL_THIS_TIME = self.config.STAR_REQUIRE_3 \
            and not self.__getattribute__(f'map_achieved_star_{self.config.STAR_REQUIRE_3}') \
            and self.config.STOP_IF_MAP_REACH != 'map_green_without_3_star' \
            and self.config.STOP_IF_MAP_REACH != 'map_100'
        logger.attr('MAP_CLEAR_ALL_THIS_TIME', self.config.MAP_CLEAR_ALL_THIS_TIME)

        # Log
        names = ['map_achieved_star_1', 'map_achieved_star_2', 'map_achieved_star_3', 'map_is_clear', 'map_is_3_star',
                 'map_is_green', 'map_has_fast_forward']
        strip = ['map', 'achieved', 'is', 'has']
        log_names = ['_'.join([x for x in name.split('_') if x not in strip]) for name in names]
        text = ', '.join([l for l, n in zip(log_names, names) if self.__getattribute__(n)])
        text = f'{int(self.map_clear_percentage * 100)}%, ' + text
        logger.attr('Map_info', text)
예제 #4
0
    def triggered_map_clear_mode_stop(self):
        if not self.config.ENABLE_MAP_CLEAR_MODE:
            return False

        percent = color_bar_percentage(self.device.image,
                                       area=MAP_CLEAR_PERCENTAGE.area,
                                       prev_color=(231, 170, 82))
        logger.attr('Map_clear', f'{int(percent * 100)}%')
        if self.config.CLEAR_MODE_STOP_CONDITION == 'map_100':
            if percent > 0.95:
                return True

        if self.config.CLEAR_MODE_STOP_CONDITION == 'map_3_star':
            if self.appear(MAP_STAR_1) and self.appear(
                    MAP_STAR_2) and self.appear(MAP_STAR_3) and percent > 0.95:
                return True

        if self.config.CLEAR_MODE_STOP_CONDITION in [
                'map_3_star', 'map_green'
        ] and self.config.MAP_STAR_CLEAR_ALL:
            button = [MAP_STAR_1, MAP_STAR_2,
                      MAP_STAR_3][self.config.MAP_STAR_CLEAR_ALL - 1]
            self.config.MAP_CLEAR_ALL_THIS_TIME = not self.appear(button)
            logger.attr('MAP_CLEAR_ALL_THIS_TIME',
                        self.config.MAP_CLEAR_ALL_THIS_TIME)

        if self.config.CLEAR_MODE_STOP_CONDITION == 'map_green':
            if self.appear(MAP_GREEN):
                return True

        return False
 def get_map_clear_percentage(self):
     """
     Returns:
         float: 0 to 1.
     """
     return color_bar_percentage(self.device.image,
                                 area=MAP_CLEAR_PERCENTAGE.area,
                                 prev_color=(231, 170, 82))
예제 #6
0
    def _ash_beacon_attack(self):
        """
        Attack ash beacon until it's killed.

        Returns:
            bool: If all beacon finished

        Pages:
            in: is_in_ash
            out: is_in_ash
        """
        logger.info('Ash beacon attack')
        confirm_timer = Timer(1, count=2).start()
        ash_combat = AshCombat(self.config, self.device)

        while 1:
            self.device.screenshot()
            percent = color_bar_percentage(self.device.image,
                                           BEACON_HP_PERCENTAGE.area,
                                           prev_color=(181, 56, 57),
                                           threshold=15)
            logger.attr('Ash_beacon_hp', f'{int(percent * 100)}%')

            # End
            if self.appear(BEACON_EMPTY, offset=(20, 20)):
                if confirm_timer.reached():
                    logger.info('Ash beacon attack finished')
                    return True
            elif self.appear(BEACON_ENTER, offset=self.beacon_entrance_offset):
                # If previous beacon is not completed, the previous beacon is attacked in this round.
                # Then found a new beacon, after attack.
                if confirm_timer.reached():
                    logger.info(
                        'Ash beacon attack finished, but found another beacon')
                    return False
            else:
                confirm_timer.reset()

            # Accident clicks
            if self.appear(BATTLE_PREPARATION, offset=(30, 30), interval=2):
                self.device.click(BACK_ARROW)
                continue
            if self.appear(HELP_CONFIRM, offset=(30, 30), interval=2):
                self.device.click(BACK_ARROW)
                continue
            # Redirected by game
            if self.appear_then_click(ASH_SHOWDOWN,
                                      offset=(30, 30),
                                      interval=2):
                continue
            # Combat and rewards
            if self._handle_ash_beacon_reward():
                continue
            if self.appear(ASH_START, offset=(30, 30)):
                ash_combat.combat(expected_end=self.is_in_ash,
                                  save_get_items=False,
                                  emotion_reduce=False)
                continue
예제 #7
0
    def _enhance_choose(self, skip_first_screenshot=True):
        """
        Pages:
            in: page_ship_enhance, without info_bar
            out: EQUIP_CONFIRM
        """
        end_activate_timer = Timer(2, count=2)
        while 1:
            if skip_first_screenshot:
                skip_first_screenshot = False
            else:
                self.device.screenshot()

            if self.appear(EQUIP_CONFIRM, offset=(30, 30)):
                return True

            if not end_activate_timer.reached_and_reset():
                continue

            self.equip_sidebar_ensure(index=4)
            self.wait_until_appear(ENHANCE_RECOMMEND, offset=(5, 5), skip_first_screenshot=True)

            status = color_bar_percentage(self.device.image, area=ENHANCE_RELOAD.area, prev_color=(231, 178, 74))
            logger.attr('Reload_enhanced', f'{int(status * 100)}%')
            choose = np.sum(np.array(self.device.image.crop(ENHANCE_FILLED.area)) > 200) > 100

            if self.info_bar_count():
                if status > 0.98:
                    logger.info('Fully enhanced for this ship')
                    swiped = self.equip_view_next(check_button=ENHANCE_RECOMMEND)
                    self.ensure_no_info_bar()
                    if not swiped:
                        return False
                    continue
                else:
                    if choose:
                        logger.info('Unable to enhance this ship')
                        swiped = self.equip_view_next(check_button=ENHANCE_RECOMMEND)
                        self.ensure_no_info_bar()
                        if not swiped:
                            return False
                        continue
                    else:
                        logger.info('Enhancement material exhausted')
                        return False

            if self.appear_then_click(ENHANCE_RECOMMEND, offset=(5, 5), interval=2):
                self.device.sleep(0.3)
                self.device.click(ENHANCE_CONFIRM)
예제 #8
0
    def _ash_beacon_attack(self):
        """
        Attack ash beacon until it's killed.

        Returns:
            bool: If all beacon finished

        Pages:
            in: is_in_ash
            out: is_in_ash
        """
        logger.info('Ash beacon attack')
        confirm_timer = Timer(1, count=2).start()
        ash_combat = AshCombat(self.config, self.device)

        while 1:
            self.device.screenshot()
            percent = color_bar_percentage(self.device.image,
                                           BEACON_HP_PERCENTAGE.area,
                                           prev_color=(181, 56, 57),
                                           threshold=15)
            logger.attr('Ash_beacon_hp', f'{int(percent * 100)}%')

            # End
            if self.appear(BEACON_EMPTY, offset=(20, 20)):
                if confirm_timer.reached():
                    logger.info('Ash beacon attack finished')
                    return True
            elif self.appear(BEACON_ENTER, offset=(20, 20)):
                # If previous beacon is not completed, the previous beacon is attacked in this round.
                # Then found a new beacon, after attack.
                if confirm_timer.reached():
                    logger.info(
                        'Ash beacon attack finished, but found another beacon')
                    return False
            else:
                confirm_timer.reset()

            if self._handle_ash_beacon_reward():
                continue
            if self.appear(ASH_START, offset=(30, 30)):
                self.ui_click(
                    ASH_START,
                    check_button=BATTLE_PREPARATION,
                    offset=(30, 30),
                    additional=ash_combat.handle_combat_automation_confirm,
                    skip_first_screenshot=True)
                ash_combat.combat(expected_end=self.is_in_ash)
                continue
예제 #9
0
    def _ash_beacon_attack(self):
        """
        Attack ash beacon until it's killed.

        Pages:
            in: is_in_ash
            out: is_in_ash
        """
        logger.info('Ash beacon attack')
        confirm_timer = Timer(1, count=2).start()
        ash_combat = AshCombat(self.config, self.device)

        while 1:
            self.device.screenshot()
            percent = color_bar_percentage(self.device.image,
                                           BEACON_HP_PERCENTAGE.area,
                                           prev_color=(181, 56, 57),
                                           threshold=15)
            logger.attr('Ash_beacon_hp', f'{int(percent * 100)}%')

            # End
            if self.appear(BEACON_EMPTY, offset=(20, 20)):
                if confirm_timer.reached():
                    logger.info('Ash beacon attack finished')
                    break
            else:
                confirm_timer.reset()

            if self.appear_then_click(BEACON_REWARD, interval=2):
                continue
            if self.appear(GET_ITEMS_1, interval=2):
                self.device.click(BEACON_REWARD)
                continue
            if self.appear(ASH_START, offset=(30, 30)):
                self.ui_click(ASH_START,
                              check_button=BATTLE_PREPARATION,
                              offset=(30, 30),
                              skip_first_screenshot=True)
                ash_combat.combat(expected_end=self.is_in_ash)
                continue