import pygame
import sys
pygame.init()

CLOCK = pygame.time.Clock()
SCREEN = pygame.display.set_mode((1000, 800))
BLACK = (0,0,0)
BACKGROUND = pygame.image.load("images/back.png")
BACK_MAIN = pygame.image.load("images/back_main.jpg")
BACK_MAIN = pygame.transform.scale(BACK_MAIN, (1000, 800)).convert_alpha()
level = 0


class Goblin:
    def __init__(self):
        self.x = 100
        self.y = 800
        self.gravity = 1
        self.jump_height = 20
        self.y_velocity = 20
        self.jumping = False
        self.start_x = 100
        self.start_y = 800

    def reset_position(self):
        self.x = self.start_x
        self.y = self.start_y
g_facing_right = True

class Knight:
    def __init__(self):
        self.x = 300
        self.y = 700
        self.gravity = 1
        self.jump_height = 20
        self.y_velocity = 20
        self.jumping = False

        self.start_x = 300
        self.start_y = 700

    def reset_position(self):
        self.x = self.start_x
        self.y = self.start_y

k_facing_right = True

def get_image(sheet,frame_w, frame_h, width, height, scale, color):
    image = pygame.Surface((width, height)).convert_alpha()
    image.blit(sheet, (0,0),((frame_w*width),(frame_h*height), width, height))
    image = pygame.transform.scale(image, (width*scale, height*scale)).convert_alpha()
    if color is not None:
        image.set_colorkey(color)
    return image

# GOBLIN
goblin = pygame.image.load("images/GoblinWorker/GoblinWorker.png").convert_alpha()
STANDING_SURFACE = get_image(goblin, 1, 1, 48, 48, 3, BLACK)

frame_0 = get_image(goblin, 0,0, 48, 48, 3, BLACK)
frame_1 = get_image(goblin, 4,2 , 48, 48, 3, BLACK)
walk_a = get_image(goblin, 5, 1, 48, 48, 3, BLACK)
walk_b = get_image(goblin, 0, 2, 48, 48, 3, BLACK)

# KNIGHT
knight = pygame.image.load("images/sprites/knight.png").convert_alpha()
K_STAND = get_image(knight, 2, 0, 32, 32, 3, BLACK)
k_walk_a = get_image(knight, 1, 2, 32, 32, 3, BLACK)
k_walk_b = get_image(knight, 5, 2, 32, 32, 3, BLACK)


k_jump_start = get_image(knight, 3, 5, 32, 32, 3, BLACK)
k_jump_apex  = get_image(knight, 4, 5, 32, 32, 3, BLACK)
k_jump_fall  = get_image(knight, 5, 5, 32, 32, 3, BLACK)

# SPRITES / WORLD
door_image = pygame.image.load("images/door.png")
door_rect = door_image.get_rect(center = (800, 700))
wall_image = pygame.image.load("images/wall.png")
wall_right = pygame.Rect(1000, 0, 1, 800)
wall_left = pygame.Rect(0, 0, 1, 800)
wall_bottom = pygame.Rect(0, 800, 1000, 1)
wall_up = pygame.Rect(0, 0, 1000, 1)

#BUTTONS
button_play = pygame.image.load("images/play_button.png")
button_play_rect = button_play.get_rect(center=(500, 400))
#PLATFORM
platform_image = pygame.image.load("images/sprites/platforms.png")
platform = get_image(platform_image, 0, 0, 16, 9, 3, BLACK)
platform_rect = platform.get_rect(topleft=(400, 700))

# ANIMATION
g_anim_counter = 0
k_anim_counter = 0
ANIM_SPEED = 8

# GAME LOOP
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys_pressed = pygame.key.get_pressed()
    mouse_pos = pygame.mouse.get_pos()

    SCREEN.fill((0,0,0))


    g_moving = False
    if keys_pressed[pygame.K_d]:
        G_X += 5
        g_facing_right = True
        g_moving = True
    if keys_pressed[pygame.K_a]:
        G_X -= 5
        g_facing_right = False
        g_moving = True
    if keys_pressed[pygame.K_SPACE] and not g_jumping:
        g_jumping = True
        g_y_velocity = G_JUMP_HEIGHT

    k_moving = False
    if keys_pressed[pygame.K_KP6]:
        K_X += 5
        k_facing_right = True
        k_moving = True
    if keys_pressed[pygame.K_KP4]:
        K_X -= 5
        k_facing_right = False
        k_moving = True
    if keys_pressed[pygame.K_KP8] and not k_jumping:
        k_jumping = True
        k_y_velocity = K_JUMP_HEIGHT

    # Goblin
    g_y_velocity -= G_GRAVITY
    G_Y -= g_y_velocity

    # Knight
    k_y_velocity -= K_GRAVITY
    K_Y -= k_y_velocity

    if G_X < 0: G_X = 0
    if G_X > 1000: G_X = 1000

    if K_X < 0: K_X = 0
    if K_X > 1000: K_X = 1000

    # Пол
    if G_Y >= 800:
        G_Y = 800
        g_y_velocity = 0
        g_jumping = False

    if K_Y >= 800:
        K_Y = 800
        k_y_velocity = 0
        k_jumping = False

    g_anim_counter = g_anim_counter + 1 if g_moving else 0
    k_anim_counter = k_anim_counter + 1 if k_moving else 0

    if g_jumping:
        g_surface = frame_1
    elif g_moving:
        g_frame_index = (g_anim_counter // ANIM_SPEED) % 2
        g_surface = walk_a if g_frame_index == 0 else walk_b
    else:
        g_surface = STANDING_SURFACE

    if not g_facing_right:
        g_surface = pygame.transform.flip(g_surface, True, False)
        g_surface.set_colorkey(BLACK)

    g_rect = g_surface.get_rect(center=(G_X, G_Y))

    if k_jumping:
        up_thresh = K_JUMP_HEIGHT // 3
        down_thresh = -up_thresh
        if k_y_velocity > up_thresh:
            k_surface = k_jump_start
        elif k_y_velocity > down_thresh:
            k_surface = k_jump_apex
        else:
            k_surface = k_jump_fall
    elif k_moving:
        k_frame_index = (k_anim_counter // ANIM_SPEED) % 2
        k_surface = k_walk_a if k_frame_index == 0 else k_walk_b
    else:
        k_surface = K_STAND

    if not k_facing_right:
        k_surface = pygame.transform.flip(k_surface, True, False)
        k_surface.set_colorkey(BLACK)

    k_rect = k_surface.get_rect(center=(K_X, K_Y))


    if level == 0:
        SCREEN.blit(BACK_MAIN, (0, 0))
        SCREEN.blit(button_play, button_play_rect)

        if button_play_rect.collidepoint(mouse_pos) and pygame.mouse.get_pressed()[0]:
            level = 1
    if level == 1:
        SCREEN.blit(BACKGROUND, (0, 0))
        SCREEN.blit(door_image, door_rect)
        SCREEN.blit(platform, platform_rect)
        SCREEN.blit(g_surface, g_rect)
        SCREEN.blit(k_surface, k_rect)
        # Goblin
        if g_rect.colliderect(platform_rect) and g_y_velocity <= 0:
            G_Y = platform_rect.top - g_rect.height / 2
            g_y_velocity = 0
            g_jumping = False

        # Knight
        if k_rect.colliderect(platform_rect) and k_y_velocity <= 0:
            K_Y = platform_rect.top - k_rect.height / 2
            k_y_velocity = 0
            k_jumping = False

        if g_rect.colliderect(door_rect) and keys_pressed[pygame.K_e]:
            print("Goblin wins!")
            level = 0

        if k_rect.colliderect(door_rect) and keys_pressed[pygame.K_KP5]:
            print("Knight wins!")
            level = 0
        pygame.display.update()

    pygame.display.update()
    CLOCK.tick(60)