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

# 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
      circle_radius = circle_radius_float
      circle_offset = circle_y_offset_float
    elif is_floating == False:
      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
        circle_radius = circle_radius
        circle_y_offset = circle_y_offset

    # 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:
        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)