Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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
Пример #4
0
    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