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
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)
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)
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))
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
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)
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
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