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_radius_float = 35
circle_y_offset_float = 35

# 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 variables
flatten = False
flatten_time = 0.3  # Flatten duration in seconds
flatten_timer = 0

# 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
                flatten = False  # Reset flatten when 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

    # Flatten timer
    if flatten:
        flatten_timer += pygame.time.get_ticks() / 1000  # Convert ticks to seconds
        if flatten_timer >= flatten_time:
            flatten = False
            flatten_timer = 0

    # Floating set up
    if is_floating:
        gravity = 0.3
        jump_height = -6.5
        in_air = False
        is_crouching = False
        circle_radius = circle_radius_float
        circle_y_offset = circle_y_offset_float
    else:
        gravity = 1
        jump_height = -15
        circle_radius = circle_radius
        circle_y_offset = circle_y_offset

    # 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
        
        # Flatten if jumping
        if flatten:
            circle_radius = circle_radius_float * crouch_scale
            circle_y_offset = circle_y_offset_float * crouch_scale
        else:
            circle_radius = circle_radius_float
            circle_y_offset = circle_y_offset_float

        flatten_timer = 0

    # Collision with the sides of the screen
    if circle_x < 0:
        circle_x = 0
    elif circle_x > 900 - 2 * circle_radius:
        circle_x = 900 - 2 * circle_radius

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

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

    # Draw Kirby pink sphere (circle)
    if is_crouching or flatten:
        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)