from .basic import *
import abc
import enum
from _typeshed import Incomplete
from abc import ABCMeta, abstractmethod
from typing import Any

class AbstractSystem(ABC):
    def __init__(self) -> None: ...
    def is_playing(self) -> bool: ...
    def stop(self) -> None: ...
    def language_need_update(self) -> bool: ...
    def update_language(self) -> None: ...

class SystemWithBackgroundMusic(AbstractSystem):
    def __init__(self) -> None: ...
    def stop(self) -> None: ...
    def unload_bgm(self) -> None: ...
    def set_bgm(self, path: Optional[str], forced: bool = ...) -> None: ...
    def set_bgm_volume(self, volume: number) -> None: ...
    def play_bgm(self) -> None: ...
    @staticmethod
    def stop_bgm() -> None: ...
    def draw(self, _surface: ImageSurface) -> None: ...
    def draw_on_screen(self) -> None: ...

class AbstractGameSystem(SystemWithBackgroundMusic, metaclass=ABCMeta):
    folder_for_save_file: Incomplete
    name_for_save_file: Incomplete
    def __init__(self) -> None: ...
    @property
    def file_path(self) -> str: ...
    def is_initialized(self) -> bool: ...
    def get_data_of_parent_game_system(self) -> dict: ...
    def save(self) -> None: ...
    def save_progress(self, screenshot: ImageSurface, slotId: int) -> None: ...
    def load(self) -> None: ...
    @abstractmethod
    def load_progress(self, _data: dict) -> None: ...

class ProgressDataPackageSavingSystem:
    data: Incomplete
    screenshot: Incomplete
    createdAt: Incomplete
    slotId: Incomplete
    def __init__(self, _data: dict, _screenshot: ImageSurface, _info: dict) -> None: ...
    @classmethod
    def save(cls, _path: str, _data: dict, _screenshot: ImageSurface, slotId: int) -> None: ...
    @staticmethod
    def load(_path: str) -> ProgressDataPackageSavingSystem: ...

class Coordinate:
    def __init__(self, x: int_f, y: int_f) -> None: ...
    def __lt__(self, other: Coordinate) -> bool: ...
    @property
    def x(self) -> int: ...
    @property
    def left(self) -> int: ...
    def get_left(self) -> int: ...
    def set_left(self, value: int_f) -> None: ...
    def move_left(self, value: int_f) -> None: ...
    def move_right(self, value: int_f) -> None: ...
    @property
    def y(self) -> int: ...
    @property
    def top(self) -> int: ...
    def get_top(self) -> int: ...
    def set_top(self, value: int_f) -> None: ...
    def move_upward(self, value: int_f) -> None: ...
    def move_downward(self, value: int_f) -> None: ...
    @property
    def pos(self) -> tuple[int, int]: ...
    def get_pos(self) -> tuple[int, int]: ...
    def set_pos(self, _x: int_f, _y: int_f) -> None: ...
    def move_to(self, pos: tuple) -> None: ...
    def on_pos(self, pos: object) -> bool: ...

class Position:
    def __init__(self, x: number, y: number) -> None: ...
    def __lt__(self, other: Position) -> bool: ...
    @property
    def x(self) -> number: ...
    @property
    def y(self) -> number: ...
    @property
    def pos(self) -> tuple[number, number]: ...
    def get_pos(self) -> tuple[number, number]: ...
    def set_x(self, value: number) -> None: ...
    def set_y(self, value: number) -> None: ...
    def set_pos(self, x: number, y: number) -> None: ...
    def move_to(self, pos: tuple[number, number]) -> None: ...

class GameObject2d(Coordinate, metaclass=abc.ABCMeta):
    tag: str
    def __init__(self, x: int_f, y: int_f) -> None: ...
    @property
    def width(self) -> int: ...
    @abstractmethod
    def get_width(self) -> int: ...
    @property
    def height(self) -> int: ...
    @abstractmethod
    def get_height(self) -> int: ...
    @property
    def size(self) -> tuple[int, int]: ...
    def get_size(self) -> tuple[int, int]: ...
    @property
    def right(self) -> int: ...
    def get_right(self) -> int: ...
    def set_right(self, value: int_f) -> None: ...
    @property
    def bottom(self) -> int: ...
    def get_bottom(self) -> int: ...
    def set_bottom(self, value: int_f) -> None: ...
    @property
    def centerx(self) -> int: ...
    def get_centerx(self) -> int: ...
    def set_centerx(self, centerx: int_f) -> None: ...
    @property
    def centery(self) -> int: ...
    def get_centery(self) -> int: ...
    def set_centery(self, centery: int_f) -> None: ...
    @property
    def center(self) -> tuple[int, int]: ...
    def get_center(self) -> tuple[int, int]: ...
    def set_center(self, centerx: int_f, centery: int_f) -> None: ...
    @property
    def left_center(self) -> tuple[int, int]: ...
    @property
    def right_center(self) -> tuple[int, int]: ...
    @property
    def top_center(self) -> tuple[int, int]: ...
    @property
    def bottom_center(self) -> tuple[int, int]: ...
    def is_hovered(self, off_set: Optional[tuple[int, int]] = ...) -> bool: ...
    def is_overlapped_with(self, _rect: GameObject2d) -> bool: ...
    def draw(self, _surface: ImageSurface) -> None: ...
    def draw_on_screen(self) -> None: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...
    def display_on_screen(self, offSet: tuple[int, int] = ...) -> None: ...
    def blit(self, _surface: ImageSurface, pos: tuple[int, int]) -> None: ...
    def blit_on_screen(self, pos: tuple[int, int]) -> None: ...

class GameObject2point5d(Coordinate):
    z: Incomplete
    def __init__(self, x: int_f, y: int_f, z: int_f) -> None: ...
    def __lt__(self, other: GameObject2point5d) -> bool: ...
    @property
    def pos(self) -> tuple[int, int, int]: ...
    def get_pos(self) -> tuple[int, int, int]: ...
    def set_pos(self, x: int_f, y: int_f, z: int_f = ...) -> None: ...

class Axis(enum.IntEnum):
    VERTICAL: Incomplete
    HORIZONTAL: Incomplete

class Square(GameObject2d):
    def __init__(self, x: int_f, y: int_f, width: int_f) -> None: ...
    def get_height(self) -> int: ...
    def get_width(self) -> int: ...
    def set_width(self, value: int_f) -> None: ...
    @property
    def min_width(self) -> int: ...
    def get_min_width(self) -> int: ...
    def set_min_width(self, value: int_f) -> None: ...
    @property
    def max_width(self) -> int: ...
    def get_max_width(self) -> int: ...
    def set_max_width(self, value: int_f = ...) -> None: ...
    def draw_outline(self, _surface: ImageSurface, color: color_liked = ..., thickness: int = ..., offSet: tuple[int, int] = ...) -> None: ...

class Rectangle(Square):
    def __init__(self, left: int_f, top: int_f, width: int_f, height: int_f) -> None: ...
    def get_height(self) -> int: ...
    def set_height(self, value: int_f) -> None: ...
    @property
    def min_height(self) -> int: ...
    def get_min_height(self) -> int: ...
    def set_min_height(self, value: int_f) -> None: ...
    @property
    def max_height(self) -> int: ...
    def get_max_height(self) -> int: ...
    def set_max_height(self, value: int_f = ...) -> None: ...
    def set_size(self, width: int_f, height: int_f) -> None: ...
    def get_rect(self) -> tuple[int, int, int, int]: ...
    def get_rectangle(self) -> Rectangle: ...
PG_Rect = pygame.Rect
RectLiked: Incomplete

class Rectangles:
    @staticmethod
    def equal(rect1: Optional[Rectangle], rect2: Optional[Rectangle]) -> bool: ...
    @staticmethod
    def create(rect: RectLiked) -> Rectangle: ...

def convert_to_pygame_rect(rect: RectLiked) -> pygame.Rect: ...
def is_hovering(imgObject: ImageSurface, objectPos: tuple[int, int] = ...) -> bool: ...
def get_img_subsurface(img: ImageSurface, rect: RectLiked) -> ImageSurface: ...

class HidableSurface(ABC):
    def __init__(self, visible: bool = ...) -> None: ...
    def set_visible(self, visible: bool) -> None: ...
    def is_visible(self) -> bool: ...
    def is_hidden(self) -> bool: ...

class AbstractImageSurface(Rectangle, HidableSurface, metaclass=ABCMeta):
    tag: Incomplete
    def __init__(self, img: Any, x: int_f, y: int_f, width: int_f, height: int_f, tag: str) -> None: ...
    @property
    def alpha(self) -> int: ...
    def get_alpha(self) -> int: ...
    def set_alpha(self, value: int) -> None: ...
    def add_alpha(self, value: int) -> None: ...
    def subtract_alpha(self, value: int) -> None: ...
    def get_image_copy(self) -> Any: ...
    def update_image(self, img_path: PoI, ifConvertAlpha: bool = ...) -> None: ...
    def set_width_with_original_image_size_locked(self, width: int_f) -> None: ...
    def set_height_with_original_image_size_locked(self, height: int_f) -> None: ...
    def scale_n_times(self, times: float) -> None: ...
    def rotate(self, angle: int) -> None: ...

class SurfaceWithLocalPos:
    def __init__(self) -> None: ...
    def get_left(self) -> int: ...
    def get_top(self) -> int: ...
    @property
    def local_x(self) -> int: ...
    def get_local_x(self) -> int: ...
    @property
    def local_y(self) -> int: ...
    def get_local_y(self) -> int: ...
    @property
    def local_pos(self) -> tuple[int, int]: ...
    def get_local_pos(self) -> tuple[int, int]: ...
    def set_local_x(self, value: int_f) -> None: ...
    def set_local_y(self, value: int_f) -> None: ...
    def set_local_pos(self, local_x: int_f, local_y: int_f) -> None: ...
    def locally_move_to(self, local_pos: tuple[int_f, int_f]) -> None: ...
    def add_local_x(self, value: int_f) -> None: ...
    def add_local_y(self, value: int_f) -> None: ...
    def add_local_pos(self, local_x: int_f, local_y: int_f) -> None: ...
    def subtract_local_x(self, value: int_f) -> None: ...
    def subtract_local_y(self, value: int_f) -> None: ...
    def subtract_local_pos(self, local_x: int_f, local_y: int_f) -> None: ...
    @property
    def abs_x(self) -> int: ...
    def get_abs_x(self) -> int: ...
    @property
    def abs_y(self) -> int: ...
    def get_abs_y(self) -> int: ...
    @property
    def abs_pos(self) -> tuple[int, int]: ...
    def get_abs_pos(self) -> tuple[int, int]: ...

class AdvancedAbstractImageSurface(AbstractImageSurface, SurfaceWithLocalPos):
    def __init__(self, img: Any, x: int_f, y: int_f, width: int_f, height: int_f, tag: str = ...) -> None: ...
    def get_alpha(self) -> int: ...
    def set_alpha(self, value: int) -> None: ...

class AdvancedAbstractCachingImageSurface(AdvancedAbstractImageSurface):
    def __init__(self, img: Any, x: int_f, y: int_f, width: int_f, height: int_f, tag: str = ...) -> None: ...
    def set_local_offset_availability(self, value: bool) -> None: ...
    def get_abs_x(self) -> int: ...
    def get_abs_y(self) -> int: ...
    def update_image(self, img_path: PoI, ifConvertAlpha: bool = ...) -> None: ...
    def set_alpha(self, value: int) -> None: ...
    def set_width(self, value: int_f) -> None: ...
    def set_height(self, value: int_f) -> None: ...
    def is_hovered(self, off_set: Optional[tuple[int, int]] = ...) -> bool: ...
    def add_darkness(self, value: int) -> None: ...
    def subtract_darkness(self, value: int) -> None: ...
    def rotate(self, angle: int) -> None: ...
    def flip_original_img(self, horizontal: bool = ..., vertical: bool = ...) -> None: ...
    def draw_abs_outline(self, _surface: ImageSurface, color: color_liked = ..., line_width: int = ..., offSet: tuple[int, int] = ...) -> None: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...

class AbstractTextSurface(GameObject2d, HidableSurface, metaclass=ABCMeta):
    def __init__(self, text: str, x: int_f, y: int_f, size: int_f, _color: color_liked = ..., _bold: bool = ..., _italic: bool = ...) -> None: ...
    def get_text(self) -> str: ...
    def set_text(self, value: str) -> None: ...
    def get_font_size(self) -> int: ...
    def set_font_size(self, value: int) -> None: ...
    def get_color(self) -> tuple[int, int, int, int]: ...
    def set_color(self, _color: str) -> None: ...
    def get_bold(self) -> bool: ...
    def set_bold(self, value: bool) -> None: ...
    def get_italic(self) -> bool: ...
    def set_italic(self, value: bool) -> None: ...
    def get_alpha(self) -> int: ...
    def set_alpha(self, value: int) -> None: ...

class TextSurface(AbstractTextSurface):
    def __init__(self, text: str, x: int_f, y: int_f, size: int_f, _color: color_liked = ..., _bold: bool = ..., _italic: bool = ...) -> None: ...
    def set_outline_thickness(self, _thickness: int) -> None: ...
    def set_outline_color(self, _color: color_liked) -> None: ...
    def disable_outline(self) -> None: ...
    def set_text(self, value: str) -> None: ...
    def set_font_size(self, value: int) -> None: ...
    def set_bold(self, value: bool) -> None: ...
    def set_italic(self, value: bool) -> None: ...
    def set_alpha(self, value: int) -> None: ...
    def get_width(self) -> int: ...
    def get_height(self) -> int: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...

class ResizeWhenHoveredTextSurface(TextSurface):
    def __init__(self, text: str, x: int_f, y: int_f, original_size: int_f, size_when_hovered: int_f, _color: color_liked = ..., _bold: bool = ..., _italic: bool = ...) -> None: ...
    def set_color(self, _color: str) -> None: ...
    def set_left(self, value: int_f) -> None: ...
    def set_top(self, value: int_f) -> None: ...
    def set_text(self, value: str) -> None: ...
    def set_font_size(self, value: int) -> None: ...
    def set_bold(self, value: bool) -> None: ...
    def set_italic(self, value: bool) -> None: ...
    def set_alpha(self, value: int) -> None: ...
    def set_outline_thickness(self, _thickness: int) -> None: ...
    def set_outline_color(self, _color: color_liked) -> None: ...
    def disable_outline(self) -> None: ...
    def has_been_hovered(self) -> bool: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...

class StaticImage(AdvancedAbstractCachingImageSurface):
    def __init__(self, img: PoI, x: int_f, y: int_f, width: int_f = ..., height: int_f = ..., tag: str = ...) -> None: ...
    @property
    def crop_rect(self) -> Optional[Rectangle]: ...
    def get_crop_rect(self) -> Optional[Rectangle]: ...
    def disable_cropping(self) -> None: ...
    def set_crop_rect(self, rect: Optional[Rectangle]) -> None: ...
    def flip(self, horizontal: bool = ..., vertical: bool = ...) -> None: ...
    def flip_if_not(self, horizontal: bool = ..., vertical: bool = ...) -> None: ...
    def flip_back_to_normal(self) -> None: ...
    def copy(self) -> StaticImage: ...
    def light_copy(self) -> StaticImage: ...
    @staticmethod
    def new_place_holder() -> StaticImage: ...
    def get_bounding_rect(self) -> Rectangle: ...

class MovableStaticImage(StaticImage):
    def __init__(self, img: PoI, x: int_f, y: int_f, target_x: int_f, target_y: int_f, move_speed_x: int_f, move_speed_y: int_f, width: int_f = ..., height: int_f = ..., tag: str = ...) -> None: ...
    def copy(self) -> MovableStaticImage: ...
    def light_copy(self) -> MovableStaticImage: ...
    def set_pos(self, x: int_f, y: int_f) -> None: ...
    def set_real_pos(self, x: int_f, y: int_f) -> None: ...
    def set_target(self, target_x: int_f, target_y: int_f, move_speed_x: int_f, move_speed_y: int_f) -> None: ...
    def switch(self) -> None: ...
    def move_toward(self) -> None: ...
    def move_back(self) -> None: ...
    def is_moving_toward_target(self) -> bool: ...
    def has_reached_target(self) -> bool: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...

class AnimatedImage(AdvancedAbstractImageSurface):
    imgId: int
    updateGap: Incomplete
    countDown: int
    def __init__(self, imgList: tuple, x: int_f, y: int_f, width: int_f, height: int_f, updateGap: int_f, tag: str = ...) -> None: ...
    def copy(self) -> AnimatedImage: ...
    def light_copy(self) -> AnimatedImage: ...
    @property
    def current_image(self) -> StaticImage: ...
    def display(self, _surface: ImageSurface, offSet: tuple[int, int] = ...) -> None: ...

class AbstractFrame(AdvancedAbstractImageSurface, metaclass=ABCMeta):
    def __init__(self, x: int_f, y: int_f, width: int_f, height: int_f, tag: str = ...) -> None: ...
    def set_width(self, value: int_f) -> None: ...
    def set_height(self, value: int_f) -> None: ...
    def present_on(self, _surface: ImageSurface) -> None: ...

class ConfirmMessageWindow:
    def __init__(self, title: str, message: str, keep_on_top: bool = ...) -> None: ...
    @staticmethod
    def YES() -> str: ...
    @staticmethod
    def NO() -> str: ...
    def update_message(self, message: str) -> None: ...
    def show(self) -> str: ...

class LinpgVersionChecker:
    def __init__(self, action: str, recommended_revision: int, recommended_patch: int, recommended_version: int = ...) -> None: ...

class RenderedWindow(Rectangle):
    title: Incomplete
    always_on_top: Incomplete
    def __init__(self, width: int, height: int, title: str, is_win_always_on_top: bool) -> None: ...
    def set_width(self, value: int_f) -> None: ...
    def set_height(self, value: int_f) -> None: ...
    def draw_rect(self, rect_pos: RectLiked, color: color_liked) -> None: ...
    def fill_rect(self, rect_pos: RectLiked, color: color_liked) -> None: ...
    def fill(self, color: color_liked) -> None: ...
    def clear(self) -> None: ...
    def present(self) -> None: ...

class AbstractVideo(ABC):
    def __init__(self, path: str, buffer_num: int, play_range: tuple[int, int] = ...) -> None: ...
    def set_starting_point(self, index: int) -> None: ...
    @property
    def fps(self) -> int: ...
    @property
    def frame_rate(self) -> int: ...
    def get_frame_rate(self) -> int: ...
    @property
    def frame_num(self) -> int: ...
    def get_frame_num(self) -> int: ...
    @property
    def frame_index(self) -> int: ...
    def get_frame_index(self) -> int: ...
    def set_frame_index(self, num: int) -> None: ...
    def get_percentage_played(self) -> float: ...
    def stop(self) -> None: ...
    @property
    def started(self) -> bool: ...
    def restart(self) -> None: ...
    @property
    def play_range(self) -> tuple[int, int]: ...
    def is_playing(self) -> bool: ...
    def draw(self, _surface: ImageSurface) -> None: ...

class VideoSurface(AbstractVideo):
    def __init__(self, path: str, loop: bool = ..., with_audio: bool = ..., play_range: tuple[int, int] = ..., buffer_num: int = ..., cache_key: Optional[str] = ...) -> None: ...
    @staticmethod
    def get_preview(path: str, size: Optional[tuple[int, int]] = ...) -> ImageSurface: ...
    def copy(self) -> VideoSurface: ...
    @property
    def volume(self) -> float: ...
    def get_volume(self) -> float: ...
    def set_volume(self, value: float) -> None: ...
    def stop(self) -> None: ...
    def draw(self, _surface: ImageSurface) -> None: ...

class VideoPlayer(AbstractVideo):
    def __init__(self, path: str, buffer_num: int = ...) -> None: ...
    def copy(self) -> VideoPlayer: ...
    def set_frame_index(self, num: int) -> None: ...
    def stop(self) -> None: ...
    def pre_init(self) -> None: ...
    def draw(self, _surface: ImageSurface) -> None: ...

class SpriteImage:
    def __init__(self, img_path: str) -> None: ...
    def get(self, key: str) -> Union[ImageSurface, tuple[ImageSurface, ...]]: ...
    def contain(self, key: str) -> bool: ...
    def to_dict(self) -> dict[str, Union[ImageSurface, tuple[ImageSurface, ...]]]: ...
    def to_tuple(self) -> tuple: ...
    def copy(self) -> SpriteImage: ...
    def get_SHEET(self) -> ImageSurface: ...
    def set_SHEET(self, SHEET: ImageSurface) -> None: ...
    @classmethod
    def generate(cls, img_folder_path: str, minimize_pixels: bool = ..., resultFileType: str = ...) -> None: ...
