def target_tile(self, max_range=None): # return the position of a tile left-clicked in player's FOV (optionally in # a range), or (None,None) if right-clicked. while True: tdl.flush() clicked = False for event in tdl.event.get(): if event.type == 'MOUSEMOTION': self.mouse_controller.mouse_coord = event.cell if event.type == 'MOUSEDOWN' and event.button == 'LEFT': clicked = True elif ((event.type == 'MOUSEDOWN' and event.button == 'RIGHT') or (event.type == 'KEYDOWN' and event.key == 'ESCAPE')): return (None, None) self.camera.render_all_objects() coord = Vector2( *self.mouse_controller.mouse_coord) + self.camera.camera_coord if (clicked and self.map.is_visible_tile(coord.X, coord.Y) and (max_range is None or Vector2.distance(coord, self.player.coord) <= max_range)): self.mouse_controller.set_mouse_coord(coord) return self.mouse_controller.mouse_coord
def targeting(self, **kwargs): target_mode, target_tag, range, visible_only, radius = None, None, None, True, 0 for k, v in kwargs.items(): if k == "target_mode": target_mode = v if k == "target_tag": target_tag = v if k == "range": range = v if k == "visible_only": visible_only = v if k == "radius": radius = v if target_mode == "ranged": return [self.target_object(range, target_tag)] elif target_mode == "self": return [self.player] elif target_mode == "closest": return [self.closest_object(range, target_tag)] elif target_mode == "area": x, y = self.target_tile(range) coord = Vector2(x, y) if not x and not y: return [] else: logger.error("target_mode unknown {}".format(target_mode)) return [] ret = [] if target_tag: for obj in self.object_pool.find_by_tag(target_tag): if not visible_only or self.map.is_visible_tile( obj.coord.X, obj.coord.Y): if Vector2.distance(obj.coord, coord) <= radius: ret.append(obj) else: for obj in self.object_pool.get_objects_as_list(): if not visible_only or self.map.is_visible_tile( obj.coord.X, obj.coord.Y): if Vector2.distance(obj.coord, coord) <= radius: ret.append(obj) return ret
def closest_object(self, max_range, tag_of_interest): # find closest enemy, up to a maximum range, and in the player's FOV closest_enemy = None closest_dist = max_range + 1 # start with (slightly more than) maximum range for monster in self.object_pool.find_by_tag(tag_of_interest): if self.map.is_visible_tile(monster.coord.X, monster.coord.Y): # calculate distance between this object and the player dist = Vector2.distance(monster.coord, self.player.coord) if dist < closest_dist: # it's closer, so remember it closest_enemy = monster closest_dist = dist return closest_enemy
def get_closest_point_of_interest(self): points_of_interest = self.owner.object_pool.find_by_tag( self.interest_tag) closest_point_of_interest = { 'obj': None, 'dist': 1000000, 'coord': Vector2.zero() } for poi in points_of_interest: dist = Vector2.distance(self.owner.coord, poi.coord) if dist < closest_point_of_interest['dist']: closest_point_of_interest['dist'] = dist closest_point_of_interest['obj'] = poi closest_point_of_interest['coord'] = poi.coord return closest_point_of_interest