def handle_combat_low_emotion(self): """ Overwrite info_handler.handle_combat_low_emotion() If GEMS_LOW_EMOTION_WITHDRAW is True, withdraw combat and change flag ship """ if self.config.GemsFarming_LowEmotionRetreat: if not self.config.Emotion_IgnoreLowEmotionWarn: return False if self.handle_popup_cancel('IGNORE_LOW_EMOTION'): self.config.GEMS_EMOTION_TRIGGRED = True logger.hr('EMOTION WITHDRAW') while 1: self.device.screenshot() if self.handle_popup_cancel('IGNORE_LOW_EMOTION'): continue if self.is_in_map(): self.withdraw() break if self.appear(FLEET_PREPARATION, offset=(20, 20), interval=2) \ or self.appear(MAP_PREPARATION, offset=(20, 20), interval=2): self.enter_map_cancel() break raise CampaignEnd('Emotion withdraw') else: return super().handle_combat_low_emotion()
def battle_0(self): self.goto(A8, expected='story') self.goto(E7, expected='story') self.goto(B1, expected='story') self.goto(G8, expected='story') raise CampaignEnd()
def update(self, camera=True): """Update map image Args: camera: True to update camera position and perspective data. """ self.device.screenshot() if not camera: self.view.update(image=self.device.image) return True if not hasattr(self, 'view'): self.view = View(self.config) try: self.view.load(self.device.image) except MapDetectionError as e: if self.info_bar_count(): logger.info('Perspective error cause by info bar. Waiting.') self.handle_info_bar() return self.update(camera=camera) elif self.is_in_stage(): logger.warning('Image is in stage') raise CampaignEnd('Image is in stage') elif not self.appear(IN_MAP): logger.warning('Image to detect is not in_map') raise e elif 'Camera outside map' in str(e): string = str(e) logger.warning(string) x, y = string.split('=')[1].strip('() ').split(',') self._map_swipe((-int(x.strip()), -int(y.strip()))) else: raise e if not self._correct_camera: self.show_camera() return False # Set camera position if self.view.left_edge: x = 0 + self.view.center_loca[0] elif self.view.right_edge: x = self.map.shape[0] - self.view.shape[0] + self.view.center_loca[0] else: x = self.camera[0] if self.view.lower_edge: y = 0 + self.view.center_loca[1] elif self.view.upper_edge: y = self.map.shape[1] - self.view.shape[1] + self.view.center_loca[1] else: y = self.camera[1] if self.camera != (x, y): logger.attr_align('camera_corrected', f'{location2node(self.camera)} -> {location2node((x, y))}') self.camera = (x, y) self.show_camera()
def handle_in_stage(self): if self.is_in_stage(): if self.in_stage_timer.reached(): logger.info('In stage.') self.ensure_no_info_bar(timeout=1.2) raise CampaignEnd('In stage.') else: return False else: self.in_stage_timer.reset() return False
def handle_in_stage(self): if self.is_in_stage(): if self.in_stage_timer.reached(): logger.info('In stage.') self.ensure_no_info_bar(timeout=1.2) raise CampaignEnd('In stage.') else: return False else: if self.appear(MAP_PREPARATION, offset=(20, 20)) or self.appear(FLEET_PREPARATION, offset=(20, 20)): self.device.click(MAP_PREPARATION_CANCEL) self.in_stage_timer.reset() return False
def handle_in_stage(self): if self.is_in_stage(): if self.in_stage_timer.reached(): logger.info('In stage.') self.device.send_notification('Sortie finished', 'Map cleared') self.ensure_no_info_bar(timeout=1.2) raise CampaignEnd('In stage.') else: return False else: if self.appear(MAP_PREPARATION) or self.appear(FLEET_PREPARATION): self.device.click(MAP_PREPARATION_CANCEL) self.in_stage_timer.reset() return False
def withdraw(self): """ Withdraw campaign. """ logger.hr('Map withdraw') while 1: self.device.screenshot() if self.handle_popup_confirm(): continue if self.appear_then_click(WITHDRAW, interval=5): continue # End if self.handle_in_stage(): raise CampaignEnd('Withdraw')
def clear_boss(self): grids = self.map.select(is_boss=True) grids = grids.add(self.map.select(may_boss=True, is_enemy=True)) logger.info('May boss: %s' % self.map.select(may_boss=True)) logger.info('May boss and is enemy: %s' % self.map.select(may_boss=True, is_enemy=True)) logger.info('Is boss: %s' % self.map.select(is_boss=True)) # logger.info('Grids: %s' % grids) if grids: logger.hr('Clear BOSS') grids = grids.sort('weight', 'cost') logger.info('Grids: %s' % str(grids)) self._goto(grids[0], expected='boss') raise CampaignEnd('BOSS Clear.') logger.warning('BOSS not detected, trying all boss spawn point.') self.clear_potential_boss() return False
def withdraw(self, skip_first_screenshot=True): """ Withdraw campaign. """ logger.hr('Map withdraw') while 1: if skip_first_screenshot: skip_first_screenshot = False else: self.device.screenshot() if self.handle_popup_confirm('WITHDRAW'): continue if self.appear_then_click(WITHDRAW, interval=5): continue if self.handle_auto_search_exit(): continue # End if self.handle_in_stage(): raise CampaignEnd('Withdraw')
def update(self, camera=True): """Update map image Args: camera: True to update camera position and perspective data. """ self.device.screenshot() if not camera: self.view.update(image=self.device.image) return True self._view_init() try: self.view.load(self.device.image) except MapDetectionError as e: if self.info_bar_count(): logger.info('Perspective error cause by info bar. Waiting.') self.handle_info_bar() return self.update(camera=camera) elif self.appear(GET_ITEMS_1): logger.warning('Items got. Trying handling mystery.') self.handle_mystery() return self.update(camera=camera) elif self.handle_story_skip(): logger.warning('Perspective error cause by story. Handling.') self.ensure_no_story(skip_first_screenshot=False) return self.update(camera=camera) elif self.is_in_stage(): logger.warning('Image is in stage') raise CampaignEnd('Image is in stage') elif self.appear(AUTO_SEARCH_MENU_CONTINUE, offset=self._auto_search_menu_offset): logger.warning('Image is in auto search menu') self.ensure_auto_search_exit() raise CampaignEnd('Image is in auto search menu') elif not self.appear(IN_MAP): logger.warning('Image to detect is not in_map') if self.appear_then_click(GAME_TIPS, offset=(20, 20)): logger.warning('Game tips found, retrying') self.device.screenshot() self.view.load(self.device.image) else: raise e elif 'Camera outside map' in str(e): string = str(e) logger.warning(string) x, y = string.split('=')[1].strip('() ').split(',') self._map_swipe((-int(x.strip()), -int(y.strip()))) else: raise e if self._prev_view is not None and np.linalg.norm( self._prev_swipe) > 0: if self.config.MAP_SWIPE_PREDICT: swipe = self._prev_view.predict_swipe( self.view, with_current_fleet=self.config. MAP_SWIPE_PREDICT_WITH_CURRENT_FLEET, with_sea_grids=self.config.MAP_SWIPE_PREDICT_WITH_SEA_GRIDS ) if swipe is not None: self._prev_swipe = swipe self.camera = tuple(np.add(self.camera, self._prev_swipe)) self._prev_view = None self._prev_swipe = None self.show_camera() # Set camera position if self.view.left_edge: x = 0 + self.view.center_loca[0] elif self.view.right_edge: x = self.map.shape[0] - self.view.shape[0] + self.view.center_loca[ 0] else: x = self.camera[0] if self.view.lower_edge: y = 0 + self.view.center_loca[1] elif self.view.upper_edge: y = self.map.shape[1] - self.view.shape[1] + self.view.center_loca[ 1] else: y = self.camera[1] if self.camera != (x, y): logger.attr_align( 'camera_corrected', f'{location2node(self.camera)} -> {location2node((x, y))}') self.camera = (x, y) self.show_camera() self.predict()
def _update(self, camera=True): """Update map image Args: camera: True to update camera position and perspective data. """ self.device.screenshot() if not camera: self.view.update(image=self.device.image) return True self._view_init() try: if not self.is_in_map() \ and not self.is_in_strategy_submarine_move(): logger.warning('Image to detect is not in_map') raise MapDetectionError('Image to detect is not in_map') self.view.load(self.device.image) except MapDetectionError as e: if self.info_bar_count(): logger.warning('Perspective error caused by info bar') self.handle_info_bar() return False elif self.appear(GET_ITEMS_1): logger.warning('Perspective error caused by get_items') self.handle_mystery() return False elif self.handle_story_skip(): logger.warning('Perspective error caused by story') self.ensure_no_story(skip_first_screenshot=False) return False elif self.is_in_stage(): logger.warning('Image is in stage') raise CampaignEnd('Image is in stage') elif self.appear(AUTO_SEARCH_MENU_CONTINUE, offset=self._auto_search_menu_offset): logger.warning('Image is in auto search menu') self.ensure_auto_search_exit() raise CampaignEnd('Image is in auto search menu') elif self.appear(GLOBE_GOTO_MAP, offset=(20, 20)): logger.warning('Image is in OS globe map') self.ui_click(GLOBE_GOTO_MAP, check_button=self.is_in_map, offset=(20, 20), retry_wait=3, skip_first_screenshot=True) return False elif self.appear(AUTO_SEARCH_REWARD, offset=(50, 50)): logger.warning( 'Perspective error caused by AUTO_SEARCH_REWARD') if hasattr(self, 'os_auto_search_quit'): self.os_auto_search_quit() return False else: logger.warning( 'Cannot find method os_auto_search_quit(), use ui_click() instead' ) self.ui_click(AUTO_SEARCH_REWARD, check_button=self.is_in_map, offset=(50, 50), retry_wait=3, skip_first_screenshot=True) return False elif 'opsi' in self.config.task.command.lower( ) and self.handle_popup_confirm('OPSI'): # Always confirm popups in OpSi, same popups in os_map_goto_globe() logger.warning('Perspective error caused by popups') return False elif not self.is_in_map() \ and not self.is_in_strategy_submarine_move(): if self.appear(GAME_TIPS, offset=(20, 20)): logger.warning('Perspective error caused by game tips') self.device.click(GAME_TIPS) return False else: raise e elif 'Camera outside map' in str(e): string = str(e) logger.warning(string) x, y = string.split('=')[1].strip('() ').split(',') self._map_swipe((-int(x.strip()), -int(y.strip()))) else: raise e if self._prev_view is not None and np.linalg.norm( self._prev_swipe) > 0: if self.config.MAP_SWIPE_PREDICT: swipe = self._prev_view.predict_swipe( self.view, with_current_fleet=self.config. MAP_SWIPE_PREDICT_WITH_CURRENT_FLEET, with_sea_grids=self.config.MAP_SWIPE_PREDICT_WITH_SEA_GRIDS ) if swipe is not None: self._prev_swipe = swipe self.camera = tuple(np.add(self.camera, self._prev_swipe)) self._prev_view = None self._prev_swipe = None self.show_camera() # Set camera position if self.view.left_edge: x = 0 + self.view.center_loca[0] elif self.view.right_edge: x = self.map.shape[0] - self.view.shape[0] + self.view.center_loca[ 0] else: x = self.camera[0] if self.view.upper_edge: y = self.map.shape[1] - self.view.shape[1] + self.view.center_loca[ 1] elif self.view.lower_edge: y = 0 + self.view.center_loca[1] else: y = self.camera[1] if self.camera != (x, y): logger.attr_align( 'camera_corrected', f'{location2node(self.camera)} -> {location2node((x, y))}') self.camera = (x, y) self.show_camera() self.predict() return True
def update(self, camera=True): """Update map image Args: camera: True to update camera position and perspective data. """ self.device.screenshot() if not camera: self.view.update(image=self.device.image) return True self._view_init() try: self.view.load(self.device.image) except (MapDetectionError, AttributeError) as e: if self.info_bar_count(): logger.info('Perspective error cause by info bar. Waiting.') self.handle_info_bar() return self.update(camera=camera) elif self.appear(GET_ITEMS_1): logger.warning('Items got. Trying handling mystery.') self.handle_mystery() return self.update(camera=camera) elif self.is_in_stage(): logger.warning('Image is in stage') raise CampaignEnd('Image is in stage') elif not self.appear(IN_MAP): logger.warning('Image to detect is not in_map') if self.appear_then_click(GAME_TIPS, offset=(20, 20)): logger.warning('Game tips found, retrying') self.device.screenshot() self.view.load(self.device.image) else: raise e elif 'Camera outside map' in str(e): string = str(e) logger.warning(string) x, y = string.split('=')[1].strip('() ').split(',') self._map_swipe((-int(x.strip()), -int(y.strip()))) else: raise e if self._prev_view is not None and np.linalg.norm( self._prev_swipe) > 0: swipe = self._prev_view.predict_swipe(self.view) if swipe is not None: self._prev_swipe = swipe self.camera = tuple(np.add(self.camera, self._prev_swipe)) self._prev_view = None self._prev_swipe = None self.show_camera() if not self._correct_camera: self.show_camera() return False # Set camera position if self.view.left_edge: x = 0 + self.view.center_loca[0] elif self.view.right_edge: x = self.map.shape[0] - self.view.shape[0] + self.view.center_loca[ 0] else: x = self.camera[0] if self.view.lower_edge: y = 0 + self.view.center_loca[1] elif self.view.upper_edge: y = self.map.shape[1] - self.view.shape[1] + self.view.center_loca[ 1] else: y = self.camera[1] if self.camera != (x, y): logger.attr_align( 'camera_corrected', f'{location2node(self.camera)} -> {location2node((x, y))}') self.camera = (x, y) self.show_camera()