def port_goto(self, init=False): """ Goto the port in current zone. Should be called in Azur Lane ports only. Shouldn't be called in Red Axis ports or zones with enemies. Args: init: Returns: bool: If executed. """ if init: self.device.screenshot() self.map_init() dic_port = {0: 'C6', 1: 'H8', 2: 'E4', 3: 'H7'} list_surround = [(-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (-1, 0), (-1, 1)] if self.zone.zone_id not in dic_port: logger.warning( f'Current zone do not have a port, zone={self.zone}') return False port = self.map[location_ensure(dic_port[self.zone.zone_id])] grids = self.map.grid_covered( port, location=list_surround).sort_by_camera_distance(self.camera) self.goto(grids[0]) return True
def convert_local_to_global(self, location): """ If self.map doesn't contain this location, camera might be wrong, correct camera and re-convert it. Args: location: Grid instance in self.view Returns: Grid: Grid instance in self.map """ location = location_ensure(location) global_ = np.array(location) + self.camera - self.view.center_loca logger.info( 'Global %s (camera=%s) <- Local %s (center=%s)' % (location2node(global_), location2node(self.camera), location2node(location), location2node(self.view.center_loca))) if global_ in self.map: return self.map[global_] else: logger.warning('Convert local to global Failed.') self.ensure_edge_insight(reverse=True) global_ = np.array(location) + self.camera - self.view.center_loca return self.map[global_]
def in_sight(self, location, sight=None): """Make sure location in camera sight Args: location: sight (tuple): Such as (-3, -1, 3, 2). """ location = location_ensure(location) logger.info('In sight: %s' % location2node(location)) if sight is None: sight = self.map.camera_sight diff = np.array(location) - self.camera if diff[1] > sight[3]: y = diff[1] - sight[3] elif diff[1] < sight[1]: y = diff[1] - sight[1] else: y = 0 if diff[0] > sight[2]: x = diff[0] - sight[2] elif diff[0] < sight[0]: x = diff[0] - sight[0] else: x = 0 self.focus_to((self.camera[0] + x, self.camera[1] + y))
def boss_goto(self, location=(0, 0), has_fleet_step=False): logger.hr('BOSS goto') while 1: # Update local view # Not screenshots taking, reuse the old one self.update_os() self.predict() self.predict_radar() # Calculate destination grids = self.radar.select(is_enemy=True) if grids: # Click way point grid = np.add(location_ensure(grids[0]), location) grid = point_limit(grid, area=(-4, -2, 3, 2)) if has_fleet_step: grid = limit_walk(grid) if grid == (0, 0): logger.info(f'Arrive destination: boss {location}') break grid = self.convert_radar_to_local(grid) self.device.click(grid) else: logger.info('No boss to goto, stop') break # Wait until arrived # Having new screenshots self.wait_until_walk_stable(confirm_timer=Timer(1.5, count=4), walk_out_of_step=False)
def convert_global_to_local(self, location): """ If self.grids doesn't contain this location, focus camera on the location and re-convert it. Args: location: Grid instance in self.map Returns: Grid: Grid instance in self.view """ location = location_ensure(location) local = np.array(location) - self.camera + self.view.center_loca logger.info('Global %s (camera=%s) -> Local %s (center=%s)' % ( location2node(location), location2node(self.camera), location2node(local), location2node(self.view.center_loca) )) if local in self.view: return self.view[local] else: logger.warning('Convert global to local Failed.') self.focus_to(location) local = np.array(location) - self.camera + self.view.center_loca return self.view[local]
def focus_to(self, location, swipe_limit=(4, 3)): """Focus camera on a grid Args: location: grid swipe_limit(tuple): (x, y). Limit swipe in (-x, -y, x, y). """ location = location_ensure(location) logger.info('Focus to: %s' % location2node(location)) while 1: vector = np.array(location) - self.camera swipe = tuple(np.min([np.abs(vector), swipe_limit], axis=0) * np.sign(vector)) self.map_swipe(swipe) if np.all(np.abs(vector) <= 0): break