"""
Этот модуль содержит команды для управления спрайтами.
Спрайт - это какой-то элемент игры, который перемещается по экрану и взаимодействует с другими персонажами.

Например, в игре "футбол", каждый игрок, судья и даже мяч являются спрайтами.

Методы add, remove, add_text, exist - создание и удаление спрайтов.

Методы show, hide, is_visible - показ и скрытие спрайтов с экрана и узнавание его видимости.

Методы set... - меняют настройки спрайта. Костюм, угол поворота, отражение слева на право и т.п.

Методы get... - получение положения спрайта или его настроек.

Методы move...- перемещение спрайта.

Методы is... - проверка, что спрайт подходит под какие-то условия. Например, что спрайт пересекается с другим спрайтом.

Методы calc... - расчет состояния спрайта без его реального пересечения.
"""

# from wrap_py import sprite


def add(sprite_type: str, x: int, y: int, costume=None, visible: bool = True):
    """
    Добавляет на экран спрайт указанного типа.

    :param sprite_type: Строка с названием. Должна совпадать с названием папки в каталоге спрайтов.
    :param x: координата x, по которой появится спрайт
    :param y: координата y, по которой появится спрайт
    :param visible: Видимость. Если True - спрайт будет создан видимым. False - невидимым.
    :param costume: Строка с названием костюма спрайта. Должна совпадать с названием костюма спрайта. Расширение (например .png) указывать не нужно.
    :return: Возвращает число - уникальный номер созданного спрайта.
    """
    return sprite.add_sprite(sprite_type, x, y, visible, costume)


def add_text(text: str, x: int, y: int, visible: bool = True, font_name: str = "Arial", font_size: int = 20,
             bold: bool = False, italic: bool = False, underline: bool = False,
             text_color=(0, 0, 0),
             back_color=None):
    """
    Добавляет на экран текстовый спрайт.

    :param x: координата x, по которой появится текст
    :param y: координата y, по которой появится текст
    :param text: Строка с текстом
    :param visible: Видимость. Если True - спрайт будет создан видимым. False - невидимым.
    :param font_name: Название шрифта
    :param font_size: Размер шрифта
    :param bold: Жирный шрифт
    :param italic: Наклон
    :param underline: Подчеркивание
    :param text_color: Цвет текста
    :param back_color: Цвет заднего фона
    :return: Возвращает число - уникальный номер созданного спрайта.
    """
    return sprite.add_text(x, y, text, visible, font_name, font_size,
                           bold, italic, underline,
                           text_color,
                           back_color)


def remove(id: int):
    """
    Удаляет спрайт.

    :param id: Число. Уникальный номер спрайта
    """
    return sprite.remove_sprite(id)


def exist(id: int) -> bool:
    """
    Проверяет, существует ли спрайт с указанным номером.

    :param id: Номер спрайта.
    :return: True, если спрайт существует. False - если спрайта с таким номером нет.
    """
    return sprite.sprite_exists(id)


def is_exist(id: int) -> bool:
    """
    Проверяет, существует ли спрайт с указанным номером.

    :param id: Номер спрайта.
    :return: True, если спрайт существует. False - если спрайта с таким номером нет.
    """
    return exist(id)


def show(id: int):
    """
    Показывает спрайт. Спрайт становится видимым.

    :param id: Число. Уникальный номер спрайта
    """
    return sprite.show_sprite(id)


def hide(id: int):
    """
    Прячет спрайт. Делает его невидимым (скрывает)

    :param id: Число. Уникальный номер спрайта
    """
    return sprite.hide_sprite(id)


def is_visible(id: int):
    """
    Проверяет видимость спрайта.

    :param id: Уникальный номер спрайта.
    :return: True - если спрайт будет видимым. False - невидимым.
    """
    return sprite.is_sprite_visible(id)


def get_x(id: int) -> int:
    """
    Возвращает положение спрайта по оси X.

    :param id: Уникальный номер спрайта.
    :return: Число. Положение спрайта по оси X.
    """
    return sprite.get_sprite_x(id)


def get_y(id: int) -> int:
    """
    Возвращает положение спрайта по оси Y.

    :param id: Уникальный номер спрайта.
    :return: Число. Положение спрайта по оси Y.
    """
    return sprite.get_sprite_y(id)


def get_pos(id: int):
    """
    Возвращает список из двух чисел: положение спрайта по оси X и по оси Y.
    Например, если спрайт находится на координатах 200 по оси X и 300 по оси Y, то функция вернет список [200, 300]

    :param id: Уникальный номер спрайта.
    :return: Список из двух чисел: положение спрайта по оси X и по оси Y.
    """
    return sprite.get_sprite_pos(id)


def get_left(id: int) -> int:
    """
    Возвращает положение левой границы спрайта по оси X.

    :param id: Уникальный номер спрайта.
    :return: Координата X левой границы спрайта.
    """
    return sprite.get_left(id)


def get_centerx(id: int) -> int:
    """
    Возвращает положение центра спрайта по оси X.

    :param id: Уникальный номер спрайта.
    :return: Координата X центра спрайта.
    """
    return sprite.get_centerx(id)


def get_right(id: int) -> int:
    """
    Возвращает положение правой границы спрайта по оси X.

    :param id: Уникальный номер спрайта.
    :return: Координата X правой границы спрайта.
    """
    return sprite.get_right(id)


def get_top(id: int) -> int:
    """
    Возвращает положение верхней границы спрайта по оси Y.

    :param id: Уникальный номер спрайта.
    :return: Координата Y верхней границы спрайта.
    """
    return sprite.get_top(id)


def get_centery(id: int) -> int:
    """
    Возвращает положение центра спрайта по оси Y.

    :param id: Уникальный номер спрайта.
    :return: Координата Y центра спрайта.
    """
    return sprite.get_centery(id)


def get_bottom(id: int) -> int:
    """
    Возвращает положение нижней границы спрайта по оси Y.

    :param id: Уникальный номер спрайта.
    :return: Координата Y нижней границы спрайта.
    """
    return sprite.get_bottom(id)


def move_to(id: int, x: int, y: int):
    """
    Перемещает спрайт на новое место на экране.

    :param id: Уникальный номер спрайта, который нужно переместить.
    :param x: Координата X, на которую нужно переместить спрайт.
    :param y: Координата Y, на которую нужно переместить спрайт.
    """
    return sprite.move_sprite_to(id, x, y)


def move_left_to(id: int, left: int):
    """
    Перемещает спрайт по координате X таким образом, чтобы расстояние от Левой
    границы окна до Левой границы спрайта было равно left пикселей.

    :param id: Число. Уникальный номер спрайта
    :param left: Число, указывает расстояние от Левой границы окна до Левой границы спрайта.
    """
    return sprite.set_left_to(id, left)


def move_right_to(id: int, right: int):
    """
    Перемещает спрайт по координате X таким образом, чтобы расстояние от Левой
    границы окна до Правой границы спрайта было равно right пикселей.

    :param id: Число. Уникальный номер спрайта
    :param right: Число, указывает расстояние от Левой границы окна до Правой границы спрайта.
    """
    return sprite.set_right_to(id, right)


def move_top_to(id: int, top: int):
    """
    Перемещает спрайт по координате Y таким образом, чтобы расстояние от Верхней границы окна
    до Верхней границы спрайта было равно top пикселей.

    :param id: Число. Уникальный номер спрайта
    :param top: Число, указывает расстояние от Верхней границы окна до Верхней границы спрайта.
    """
    return sprite.set_top_to(id, top)


def move_bottom_to(id: int, bottom: int):
    """
    Перемещает спрайт по координате Y таким образом, чтобы расстояние от Верхней границы окна
    до Нижней границы спрайта было равно bottom пикселей.

    :param id: Число. Уникальный номер спрайта
    :param bottom: Число, указывает расстояние от Верхней границы окна до Нижней границы спрайта.
    """
    return sprite.set_bottom_to(id, bottom)


def move_centerx_to(id: int, centerx: int):
    """
    Перемещает спрайт по координате X таким образом, чтобы расстояние от Левой границы окна
    до Центра спрайта было равно centerx пикселей.

    :param id: Число. Уникальный номер спрайта
    :param centerx: Число, указывает расстояние от Левой границы окна до Центра спрайта.
    """
    return sprite.set_centerx_to(id, centerx)


def move_centery_to(id: int, centery: int):
    """
    Перемещает спрайт по координате Y таким образом, чтобы расстояние от Верхней границы окна
    до Центра спрайта было равно centery пикселей.

    :param id: Число. Уникальный номер спрайта
    :param centery:  Число, указывает расстояние от Верхней границы окна до Центра спрайта.
    """
    return sprite.set_centery_to(id, centery)


def move(id: int, dx: int, dy: int):
    """
    Перемещает спрайт на указанное количество пикселей по координатам X и Y.

    :param id: Число. Уникальный номер спрайта
    :param dx: Число. На сколько пикселей нужно сдвинуть спрайт по оси X.
    :param dy:  Число. На сколько пикселей нужно сдвинуть спрайт по оси Y.
    """
    return sprite.move_sprite_by(id, dx, dy)


def move_at_angle(id: int, angle: int, distance: int):
    """
    Перемещает спрайт в указанном направлении на указанное расстояние.

    :param id: Уникальный номер спрайта.
    :param angle: Угол, на который будет перемещен спрайт.
    :param distance: Расстояние, на которое будет перемещен спрайт.
    """
    return sprite.move_sprite_at_angle(id, angle, distance)


def move_at_angle_dir(id: int, distance: int):
    """
    Перемещает спрайт в направлении его взгляда на указанное расстояние.

    :param id: Уникальный номер спрайта.
    :param distance: На сколько пикселей нужно переместить спрайт.
    """
    return sprite.move_sprite_to_angle(id, distance)


def move_at_angle_point(id: int, x: int, y: int, distance: int):
    """
    Перемещает спрайт в направлении указанной точки на указанное расстояние.

    :param id: Уникальный номер спрайта.
    :param x: Координата X точки, к которой должен перемещаться спрайт.
    :param y: Координата Y точки, к которой должен перемещаться спрайт.
    :param distance: На сколько пикселей нужно переместить спрайт.
    """
    return sprite.move_sprite_to_point(id, x, y, distance)


def get_width(id: int):
    """
    Возвращает ширину спрайта.

    :param id: Уникальный номер спрайта
    :return: Возвращает число - ширину спрайта
    """
    return sprite.get_sprite_width(id)


def get_width_percent(id: int) -> int:
    """
    Возвращает ширину спрайта в процентах от его оригинальной ширины.
    Например, если спрайт при создании был шириной 30px, а сейчас его ширина 60px, то функция вернет число 200.

    :param id: Уникальный номер спрайта
    :return: Число. Сколько процентов составляет текущая ширина спрайта от его оригинальной ширины.
    """

    return sprite.get_sprite_width_proc(id)


def get_height(id: int):
    """
    Получает высоту выбранного спрайта. Возвращает число.

    :param id: Уникальный номер спрайта
    :return: Возвращает число - высоту спрайта
    """

    return sprite.get_sprite_height(id)


def get_height_percent(id: int) -> int:
    """
    Возвращает высоту спрайта в процентах от его оригинальной высоты.
    Например, если спрайт при создании был высотой 30px, а сейчас его высота 60px, то функция вернет число 200.

    :param id: Уникальный номер спрайта
    :return: Число. Сколько процентов составляет текущая высота спрайта от его оригинальной высоты.
    """

    return sprite.get_sprite_height_proc(id)


def get_size(id: int) -> int:
    """
    Возвращает список из двух чисел: ширина и высота спрайта.

    :param id: Уникальный номер спрайта
    :return: Список из двух чисел: ширина и высота спрайта. Например: [100, 200].
    """
    return sprite.get_sprite_size(id)


def get_size_percent(id: int):
    """
    Возвращает ширину и высоту спрайта в процентах от его оригинальных ширины и высоты.
    Например, если спрайт при создании был шириной 20px и высотой 30px, а сейчас его ширина 60px и высота 60px, то функция вернет список [300, 200].

    :param id: Уникальный номер спрайта
    :return: Список из двух чисел. Первый элемент списка - ширина спрайта в процентах от его оригинальной ширины. Второй - высота спрайта в процентах от его оригинальной высоты.
    """

    return sprite.get_sprite_size_proc(id)


def set_width(id: int, width: int):
    """
    Изменяет ширину спрайта на указанную.

    :param id: Уникальный номер спрайта.
    :param width: Новая ширина спрайта.
    """
    return sprite.change_sprite_width(id, width)


def set_width_proportionally(id: int, width: int, use_modified_prop: bool = False):
    """
    Устанавливает ширину спрайта с сохранением пропорций.

    Меняет размер спрайта так, чтобы его ширина стала равна width.
    Высота спрайта изменится так, чтобы пропорции спрайта не изменились.

    :param id: Уникальный номер спрайта.
    :param width: Новая ширина спрайта. Высота будет расчитана автоматически.
    :param use_modified_prop: Если True, то будут использованы текущие пропорции спрайта. Т.е. пропорции после всех примененных к нему изменений. Если False, то будут использованы оригинальные пропорции спрайта.
    """
    return sprite.change_width_proportionally(id, width, use_modified_prop)


def set_width_percent(id: int, width_percent: int):
    """
    Устанавливает ширину спрайта в процентах от его оригинальной ширины.
    Например, если ширина спрайта 20px, то после вызова этой функции с параметром width_percent=200 ширина спрайта станет 40px.

    :param id: Уникальный номер спрайта.
    :param width_percent: Новая ширина спрайта в процентах от оригинальной ширины.
    """
    return sprite.change_sprite_width_proc(id, width_percent)


def set_height(id: int, height: int):
    """
    Изменяет высоту спрайта на указанную.

    :param id: Уникальный номер спрайта.
    :param height: Новая высота спрайта.
    """
    return sprite.change_sprite_height(id, height)


def set_height_proportionally(id: int, height: int, use_modified_prop: bool = False):
    """
    Устанавливает высоту спрайта с сохранением пропорций.

    Меняет размер спрайта так, чтобы его высота стала равна height.
    Ширина спрайта изменится так, чтобы пропорции спрайта не изменились.

    :param id: Уникальный номер спрайта.
    :param height: Новая высота спрайта. Ширина будет расчитана автоматически.
    :param use_modified_prop: Если True, то будут использованы текущие пропорции спрайта. Т.е. пропорции после всех примененных к нему изменений. Если False, то будут использованы оригинальные пропорции спрайта.
    """
    return sprite.change_height_proportionally(id, height, use_modified_prop)


def set_height_percent(id: int, height_percent: int):
    """
    Устанавливает высоту спрайта в процентах от его оригинальной высоты.
    Например, если высота спрайта 20px, то после вызова этой функции с параметром height_percent=200 высота спрайта станет 40px.

    :param id: Уникальный номер спрайта.
    :param height_percent: Новая высота спрайта в процентах от оригинальной высоты.
    """
    return sprite.change_sprite_height_proc(id, height_percent)


def set_size(id: int, width: int, height: int):
    """
    Изменяет ширину и высоту спрайта на указанные.

    :param id: Уникальный номер спрайта.
    :param width: Новая ширина спрайта.
    :param height: Новая высота спрайта.
    """
    return sprite.change_sprite_size(id, width, height)


def set_size_percent(id: int, width_percent: int, height_percent: int):
    """
    Устанавливает ширину и высоту спрайта в процентах от оригинальных ширины и высоты.
    Например, если размер спрайта 20*50, то после вызова этой функции с параметрами width_percent=200, height_percent=300 размер спрайта станет 40*150.

    :param id: Уникальный номер спрайта.
    :param width_percent: Новая ширина спрайта в процентах от оригинальной ширины.
    :param height_percent: Новая высота спрайта в процентах от оригинальной высоты.
    """
    return sprite.change_sprite_size_proc(id, width_percent, height_percent)


def set_size_percent_of(id: int, percent: int):
    """
    Устанавливает ширину и высоту спрайта в процентах от его текущей (не оригинальной!) ширины и высоты.
    Например, если текущие размеры спрайта 30*60px, то после вызова этой функции с параметром percent=200 размеры спрайта будут 60*120px.

    :param id: Уникальный номер спрайта.
    :param percent: Размер спрайта в процентах от его текущих (не оригинальных!) размеров.
    """
    return sprite.change_sprite_size_by_proc(id, percent)


def set_size_to_original(id: int):
    """
    Устанавливает начальные размеры спрайта.
    Устанавливает размеры, которые были у спрайта сразу после его создания.

    :param id: Уникальный номер спрайта.
    """
    return sprite.set_sprite_original_size(id)


def get_reverse_x(id: int) -> bool:
    """
    Возвращает True, если к спрайту применен разворот по оси X. False - если не применен.

    :param id: Уникальный номер спрайта.
    :return: True или False
    """
    return sprite.get_sprite_flipx_reverse(id)


def get_reverse_y(id: int) -> bool:
    """
    Возвращает True, если к спрайту применен разворот по оси Y. False - если не применен.

    :param id: Уникальный номер спрайта.
    :return: True или False
    """
    return sprite.get_sprite_flipy_reverse(id)


def set_reverse_x(id: int, reverse: bool):
    """
    Картинка спрайта отражается слева направо, как в зеркале.
    Левая часть спрайта становится его правой частью, а правая - левой.

    Угол, по которому "смотрит" спрайт, также может поменяться.
    После отражения спрайт гарантированно будет смотреть в направлении тойже своей части, в направлении которой он смотрел и до отражения.

    Пример. Представим спрайт танка. У танка есть дуло. Танк смотрит в направлении дула.
    После отражения танк будет также смотреть в направлении дула.
    Т.е. при выполнении функции move_at_angle_dir() танк всегда поедет в направлении дула.

    :param id: Уникальный номер спрайта.
    :param reverse: Если равен True, то спрайт будет отражаться. Если False, то не будет.
    """
    return sprite.set_sprite_flipx_reverse(id, reverse)


def set_reverse_y(id: int, reverse: bool):
    """
    Картинка спрайта отражается снизу вверх.
    Нижняя часть спрайта становится его верхней частью, а верхняя - нижней.

    Угол, по которому "смотрит" спрайт, также может поменяться.
    После отражения спрайт гарантированно будет смотреть в направлении тойже своей части, в направлении которой он смотрел и до отражения.

    Пример. Представим спрайт танка. У танка есть дуло. Танк смотрит в направлении дула.
    После отражения танк будет также смотреть в направлении дула.
    Т.е. при выполнении функции move_at_angle_dir() танк всегда поедет в направлении дула.

    :param id: Уникальный номер спрайта.
    :param reverse: Если равен True, то к спрайт будет отражаться. Если False, то не будет.
    """
    return sprite.set_sprite_flipy_reverse(id, reverse)


def get_angle(id: int) -> int:
    """
    Возвращает угол, в направлении которого смотрит спрайт.

    Направление вверх соответствует углу 0 градусов.
    По часовой стрелке градусы увеличиваются. Против часовой - уменьшаются.

    Направление вниз соответствует углу 180 градусов.

    Угол спрайта меняется от -180 до 180.

    :param id: Уникальный номер спрайта.
    :return: Угол, в направлении которого смотрит спрайт.
    """
    return sprite.get_sprite_final_angle(id)


def get_angle_modif(id: int):
    """
    Возвращает на сколько градусов было изменено направление взгляда спрайта от оригинального.

    Например, если при создании танк смотрел четко вправо, его угол был равен 90 градусов. Затем был установлен угол 45 градусов. Танк стал смотреть вправо вверх. Эта функция вернет число -45.

    :param id: Уникальный номер спрайта.
    :return: Число. На сколько градусов было изменено направление взгляда спрайта от оригинального.
    """
    return sprite.get_sprite_angle(id)


def set_angle(id: int, angle_to_look_to: int):
    """
    Поворачивает спрайт так, чтобы он смотрел по указанному углу.

    :param id: Уникальный номер спрайта.
    :param angle_to_look_to: Число. В направлении какого угла должен смотреть спрайт.

    """
    return sprite.rotate_to_angle(id, angle_to_look_to)


def set_angle_modif(id: int, angle_modif: int):
    """
    Поворачивает спрайт на указанное число градусов от его оригинального угла.

    :param id: Уникальный номер спрайта.
    :param angle_modif: На сколько градусов должен отличаться угол спрайта от его оригинального угла взгляда.
    """
    return sprite.set_sprite_angle(id, angle_modif)


def set_angle_to_point(id: int, x: int, y: int):
    """
    Меняет угол спрайта так, чтобы он смотрел на указанную точку.

    :param id: Уникальный номер спрайта.
    :param x: Координата X точки, на которую должен смотреть спрайт.
    :param y: Координата Y точки, на которую должен смотреть спрайт.
    """
    return sprite.rotate_to_point(id, x, y)


def calc_point_by_angle_and_distance(id: int, angle: int, distance: int):
    """
    Эта функция не меняет положение спрайта на экране.
    Она только рассчитывает, где окажется спрайт, если будет двигаться со своего текущего положения под указанным углом (angle) указанное количество пикселей(distance).

    Результатом функции будет список из двух чисел. Это координаты, по которым окажется спрайт, если выполнит указанное движение.

    Реально выполняет такое движение функция move_at_angle().

    :param id: Уникальный номер спрайта.
    :param angle: Под каким углом будет двигаться спрайт.
    :param distance: Сколько пикселей должен пройти спрайт под указанным углом.
    :return: Список из двух чисел. Координаты X и Y, где будет находиться спрайт после движения.
    """
    return sprite.calc_point_by_angle_and_distance(id, angle, distance)


def calc_angle_by_point(id: int, x: int, y: int) -> int:
    """
    Эта функция не меняет положения спрайта на экране.
    Она только рассчитывает, под каким углом должен двигаться спрайт, чтобы оказаться в точке x, y.

    Возвращает None, если спрайт уже находится на точке x, y. В этом случае угол не может быть рассчитан.

    Реально выполняет такое движение функция move_at_angle().

    :param id: Уникальный номер спрайта.
    :param x: Координата X точки, к которой нужно рассчитать движение спрайта.
    :param y: Координата Y точки, к которой нужно рассчитать движение спрайта.
    :return: Число. Угол, под которым спрайт должен выполнять движение. None, если спрайт находится в указанной точке.
    """
    return sprite.calc_angle_by_point_xy(id, x, y)


def calc_angle_modif_by_angle(id: int, angle_to_look_to: int):
    """
    Рассчитывает, какое будет изменение угла спрайта от его оригинального угла, если спрайт будет смотреть по указанному углу angle_to_look_to.

    Пример. Допустим есть спрайт Танк, который после создания смотрит точно вправо. Если сделать так, чтобы он смотрел вправо и вверх под углом 45 градусов, то изменение его угла от оригинального будет равно -45.

    :param id: Уникальный номер спрайта.
    :param angle_to_look_to: Угол, по которому будет смотреть спрайт.
    :return: Число. Угол, на который спрайт будет повернут от оригинального, если спрайтбудет смотреть в направлении угла angle_to_look_to.
    """
    return sprite.calc_angle_modification_by_angle(id, angle_to_look_to)


def is_collide_point(id: int, x: int, y: int, use_rect: bool = False) -> bool:
    """
    Определяет, попадает ли указанная точка на территорию спрайта.
    Возвращает True, если точка находится на спрайте. False - если не на спрайте.

    По-умолчанию, проверяется что точка попала именно на видимую часть спрайта. Т.е. на ту часть, которая непрозрачная.

    Если нужно проверить, что точка попала на прямоугольник, обведенный вокруг спрайта, то нужно указать параметр use_rect=True.

    :param id: Уникальный номер спрайта.
    :param x: Координата X точки, попадание которой проверяется.
    :param y: Координата Y точки, попадание которой проверяется.
    :param use_rect: По-умолчанию равно False. True - определять попадание точки на прямоугольник вокруг спрайта. False - определять попадание точки на видимую часть спрайта.
    :return: True если точка попала на спрайт. False - если не попала.
    """
    return sprite.sprite_collide_point(id,  x, y, use_rect)


def is_collide_sprite(id1: int, id2: int) -> bool:
    """
    Определяет, пересекаются ли указанные спрайты.
    Определяется пересечение видимых частей спрайтов.
    Возвращает True, если спрайты пересекаются. False - если не перескаются.

    :param id1: Уникальный номер первого спрайта.
    :param id2: Уникальный номер второго спрайта.
    :return: True, если спрайты пересекаются. False - если не перескаются.
    """
    return sprite.sprites_collide(id1, id2)


def is_collide_any_sprite(id: int, id_list):
    """
    Проверяет, пересекается ли спрайт с любым из спрайтов из списка id_list.

    Возвращает None, если не перескается ни с одним спрайтом из списка.

    Если пересечения есть, то возвращает номер одного из спрайтов, с которым найдено пересечение. Даже если пересечение есть с несколькими спрайтами из списка, возвращен будет номер только одного.

    :param id: Уникальный номер спрайта. Будет проверяться его пересечение с каждым спрайтом из списка id_list.
    :param id_list: Список спрайтов, пересечение с которыми будет проверяться.
    :return: None или Число - номер спрайта, с которым есть пересечение.
    """
    return sprite.sprites_collide_any(id, id_list)


def is_collide_all(id: int, id_list):
    """
    Проверяет пересечение спрайта со всеми спрайтами из списка id_list.

    Возвращает список номеров спрайтов, с которыми есть пересечение. Если ни одного пересечения нет, то будет возвращен пустой список.

    :param id: Уникальный номер спрайта. Будет проверяться его пересечение с каждым спрайтом из списка id_list.
    :param id_list: Список спрайтов, пересечение с которыми будет проверяться.
    :return: Список номеров спрайтов, с которыми есть пересечение.
    """
    return sprite.sprites_collide_all(id, id_list)


def get_costume(id: int) -> str:
    """
    Возвращает строку с именем костюма спрайта, который сейчас "одет".

    Команды по работе с костюмами не должны применяться к спрайтам, у которых нет костюмов.
    Например, к текстовым спрайтам.

    :param id: Уникальный номер спрайта.
    :return: Строка. Название костюма спрайта.
    """
    return sprite.get_sprite_costume(id)


def set_costume(id: int, costume: str, save_angle: bool = False, save_proc_size: bool = True):
    """
    Меняет костюм спрайта на другой.

    Команды по работе с костюмами не должны применяться к спрайтам, у которых нет костюмов.
    Например, к текстовым спрайтам.

    При изменении костюма, размер спрайта сохраняется или в писелах или в процентах от оригинального.
    Это настраивается параметром save_proc_size.

    Если save_proc_size = False, то размер спрайта после смены костюма останется таким же, как был до смены.
    Даже если размер нового костюма отличается от размера старого.
    Т.е. функция get_size() вернет одинаковый результат до и после смены костюма.
    Результат функции get_size_percent() может измениться после смены костюма.

    Если save_proc_size = True, то размер спрайта в процентах от оригинального останется таким же, как был до смены.
    Реальный размер спрайта в писелах может поменяться после смены костюма.
    Т.е. функция get_size_percent() вернет одинаковый результат до и после смены костюма.
    Результат функции get_size() может измениться после смены костюма.

    При изменении костюма, угол, по которому смотрит спрайт, может измениться или остаться таким же, как был.
    Это настраивается параметром save_angle.

    Пример. Допустим есть спрайт танка. Его дуло смотрит вправо под уголом 90 градусов.
    Меняем костюм танка на костюм ракеты, которая смотрит ровно вверх, под углом 0 градусов.

    Если параметр save_angle = False, то после смены костюма ракета будет смотреть вверх.
    И функция move_at_angle_dir() будет двигать ракету вверх.
    Если параметр save_angle = True, то после смены костюма ракета будет повернута вперед и смотреть так же, как смотрел танк. Т.е. под углом 90 градусов.
    И функция move_at_angle_dir() будет двигать ракету ровно в том же направлении, что и танк.

    :param id: Уникальный номер спрайта, костюм которого нужно поменять.
    :param costume: Строка с названием костюма, который нужно установить.
    :param save_angle: Сохранять ли угол направления взгляда спрайта при смене костюма.
    :param save_proc_size: Влияет на размер спрайта после смены костюма. Если равна False, то размер спрайта после смены костюма не изменится.
    """
    return sprite.change_sprite_costume(id, costume, save_angle, save_proc_size)


def set_costume_next(id: int, save_angle: bool = False, save_proc_size: bool = True):
    """
    Меняет костюм спрайта на следующий из списка костюмов.
    Если текущий костюм последний, то следующим будет поставлен первый костюм из списка.

    Команды по работе с костюмами не должны применяться к спрайтам, у которых нет костюмов.
    Например, к текстовым спрайтам.

    Детальное описание параметров save_angle и save_proc_size смотрите в описании команды set_costume

    :param id: Уникальный номер спрайта, костюм которого нужно поменять.
    :param save_angle: Сохранять ли угол направления взгляда спрайта при смене костюма.
    :param save_proc_size: Влияет на размер спрайта после смены костюма. Если равна False, то размер спрайта после смены костюма не изменится.
    """
    return sprite.set_next_costume(id, save_angle, save_proc_size)


def set_costume_prev(id: int, save_angle: bool = False, save_proc_size: bool = True):
    """
    Меняет костюм спрайта на предыдущий в списке костюмов.
    Если текущий костюм первый, то предыдущим будет считаться последний костюм из списка.

    Команды по работе с костюмами не должны применяться к спрайтам, у которых нет костюмов.
    Например, к текстовым спрайтам.

    Детальное описание параметров save_angle и save_proc_size смотрите в описании команды set_costume

    :param id: Уникальный номер спрайта, костюм которого нужно поменять.
    :param save_angle: Сохранять ли угол направления взгляда спрайта при смене костюма.
    :param save_proc_size: Влияет на размер спрайта после смены костюма. Если равна False, то размер спрайта после смены костюма не изменится.
    """
    return sprite.set_previous_costume(id, save_angle, save_proc_size)


def w1():
    global sprite
    from wrap_py import sprite


w1()
