import pygame
import sys

pygame.init()

# Set up display
screen = pygame.display.set_mode((900, 700))

# Set the Kirby pink color (RGB format)
kirby_pink_color = (255, 105, 180)
ground_color = (0, 255, 0)  # Green color for the ground

# Circle properties
circle_radius = 25  # Initial radius
circle_y_offset = 25  # Offset from the top of the circle

# Circle position and velocity
circle_x, circle_y = 425, 500
circle_x_speed, circle_y_speed = 0, 0
gravity = 1
jump_height = -15  # Set jump height

# Variables for crouching and in-air state
is_crouching = False
crouch_scale = 0.5  # Scale factor for crouching
in_air = False

# Movement flags
is_moving_left = False
is_moving_right = False
is_floating = False

# Flatten effect
flatten_duration = 0.3  # Duration of the flattening effect in seconds
flatten_timer = 0  # Timer for the flattening effect

# Game loop
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_s and not is_crouching:
                is_crouching = True
            elif event.key == pygame.K_w and not in_air:
                circle_y_speed = jump_height  # Set jump speed
                in_air = True  # Circle is in the air after jumping
            elif event.key == pygame.K_e and not is_crouching:
                is_floating = True
            elif event.key == pygame.K_r:
                is_floating = False
            elif event.key == pygame.K_a:
                is_moving_left = True
            elif event.key == pygame.K_d:
                is_moving_right = True
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_s:
                is_crouching = False
            elif event.key == pygame.K_a:
                is_moving_left = False
            elif event.key == pygame.K_d:
                is_moving_right = False

    # Floating set up
    if is_floating == True:
        gravity = 0.3
        jump_height = -6.5
        in_air = False
        is_crouching = False
    elif is_floating == False:
        gravity = 1
        jump_height = -15

    # Apply gravity
    circle_y_speed += gravity

    # Apply horizontal motion
    if is_moving_left:
        circle_x_speed = -5
    elif is_moving_right:
        circle_x_speed = 5
    else:
        circle_x_speed = 0

    # Update circle position
    circle_x += circle_x_speed
    circle_y += circle_y_speed

    # Collision with the ground
    if circle_y + circle_radius >= 575:
        circle_y = 575 - circle_radius
        circle_y_speed = 0
        gravity = 1
        jump_height = -15
        is_floating = False
        in_air = False  # Circle is on the ground

        if flatten_timer <= 0:
            flatten_timer = flatten_duration

    # Update flatten timer
    if flatten_timer > 0:
        flatten_timer -= 1 / 60  # Subtract the time elapsed since the last frame

    # Draw background
    screen.fill((0, 0, 255))  # Blue background

    # Draw ground
    pygame.draw.rect(screen, ground_color, (0, 600, 900, 50))

    # Draw Kirby pink sphere (circle)
    if flatten_timer > 0:
        # Apply flatten effect
        flatten_scale = 0.5  # Scale factor for the flatten effect
        pygame.draw.ellipse(screen, kirby_pink_color,
                            (int(circle_x), int(circle_y + circle_radius),
                             int(2 * circle_radius), int(flatten_scale * 2 * circle_radius)))
    elif is_crouching:
        pygame.draw.ellipse(screen, kirby_pink_color,
                            (int(circle_x), int(circle_y + circle_radius),
                             int(2 * circle_radius), int(crouch_scale * 2 * circle_radius)))
    else:
        pygame.draw.circle(screen, kirby_pink_color,
                           (int(circle_x + circle_radius), int(circle_y + circle_radius)),
                           circle_radius)

    # Update the display
    pygame.display.flip()

    # Cap the frame rate
    pygame.time.Clock().tick(60)