import pygame 
from pygame.locals import *
from random import randint 
from pygame.mixer import music #musique
pygame.mixer.init() #initialiser la musique 

LARGEUR = 610 #largeur de la fenêtre
HAUTEUR = 600 #hauteur de la fenêtre
fenetre = pygame.display.set_mode((LARGEUR, HAUTEUR)) #créer la fenêtre
fond = pygame.sprite.Sprite() #créer un sprite pour le fond de la terre 
fond.image = pygame.image.load("terre.jpg").convert() #charger l'image de la terre
fond.rect = fond.image.get_rect() #obtenir les coordonnées de l'image de la terre
fond.rect.x = 0 #position x de l'image "terre.jpg"
fond.rect.y = 0 #position y de l'image "terre.jpg"

def creer_ananas(pos_x, pos_y): #créer un ananas (adversaire)
    ananas = pygame.sprite.Sprite() #créer un sprite
    pygame.sprite.Sprite.__init__(ananas) #initialiser le sprite
    ananas.image = pygame.image.load("ananas.png").convert_alpha() #charger l'image de l'ananas
    ananas.image = pygame.transform.scale(ananas.image,[200, 100]) #redimensionner l'image de l'ananas
    ananas.rect = ananas.image.get_rect() #obtenir les coordonnées de l'image de l'ananas 
    ananas.rect.x = pos_x # position x de l'image de l'ananas
    ananas.rect.y = pos_y # position y de l'image de l'ananas 
    return ananas #retourner l'ananas 

def tirer_missiles(pos_x, pos_y): #créer un missile
    missiles = pygame.sprite.Sprite() #créer un sprite
    pygame.sprite.Sprite.__init__(missiles) #initialiser le sprite
    missiles.image = pygame.image.load("missiles.png").convert_alpha() #charger l'image du missile
    missiles.image = pygame.transform.scale(missiles.image,[10, 100]) #redimensionner l'image du missile
    missiles.rect = missiles.image.get_rect() #obtenir les coordonnées de l'image du missile
    missiles.rect.x = pos_x # position x de l'image du missile
    missiles.rect.y = pos_y # position y de l'image du missile
    return missiles #retourner le missile

liste_sprites_ananas = pygame.sprite.LayeredUpdates() #créer une liste pour les ananas
liste_de_missiles = [] #créer une liste vide pour stocker les missiles
liste_sprites_missiles = pygame.sprite.Group() #créer un groupe pour stocker les missiles

pygame.init() #initialiser pygame
clock = pygame.time.Clock() #créer un horloge pour contrôler la vitesse de rafraîchissement de la fenêtre
running = True #définir la variable running

avion = pygame.sprite.Sprite() #créer un sprite pour l'avion
pygame.sprite.Sprite.__init__(avion) #initialiser le sprite de l'avion
avion.image = pygame.image.load("avion.png").convert_alpha() #charger l'image de l'avion
avion.image = pygame.transform.scale(avion.image,[120, 120]) #redimensionner l'image de l'avion
avion.rect = avion.image.get_rect() #obtenir les coordonnées de l'image de l'avion
avion.rect.x = 200 #position x de l'image de l'avion
avion.rect.y = 450 #position y de l'image de l'avion
liste_des_sprites = pygame.sprite.LayeredUpdates() #créer un groupe pour stocker les sprites
liste_des_sprites.add(fond) #ajouter le fond à la liste des sprites
liste_des_sprites.add(avion) #ajouter l'avion à la liste des sprites
liste_d_ananas = [] #créer une liste vide pour stocker les ananas

gameover = False #définir la variable gameover

intro = int(input("Voulez-vous sauver la Terre ? 1 pour oui, 2 pour non: ")) #demander à l'utilisateur s'il veut sauver la Terre
sauver = (intro == 1)

if sauver == True: #si l'utilisateur veut sauver la Terre
    print("ALERTE! La planète Terre est attaquée par une flotte d’avions spatiaux! Vous vous trouvez dans l’engin SU-PER12. Votre mission est d’éliminer le plus d’ennemis possible! En éliminant les adversaires, vous gagnez 10 points. La planète sera sauvée, lorsque vous aurez atteind les 100 points! Pour ce faire, appuyez sur votre souris pour tirer et manoeuvrez-la en la pour bouger votre SU-PER12. Bonne chance!") #afficher un message
    music = pygame.mixer.music.load("musique fond.mp3") 
#charger la musique de fond correspondant à sauver == True
    pygame.mixer.music.play(-1) #jouer la musique de fond en boucle
    pygame.mixer.music.set_volume(0.3) # changer le volume de la musique de fond

else: #si l'utilisateur ne veut pas sauver la Terre
    gameover == True #définir la variable gameover
    print("Dommage, la fin du Monde est proche...")
    avion.kill() # enlever l'avion de la liste des sprites (et donc de la fenetre)
    liste_sprites_missiles.empty() #enlever tout les missiles du groupe
    music = pygame.mixer.music.load("invasion musique.mp3") #charger la musique de fond correspondant à sauver == False
    pygame.mixer.music.play(1) #jouer la musique de fond qu'une seule fois

police = pygame.font.Font(None, 30) #créer une police
texte= pygame.sprite.Sprite() #créer un sprite
texte.image = police.render("ALERTE, PLANETE TERRE EST SOUS ATTAQUE", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour annoncer l'invasion
texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte
texte.rect.centerx = 310 #position x du texte
texte.rect.centery = 20 #position y du texte
liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites

rapidite_ananas = 4 # mouvement de l'ananas (4 pixels par refraichissement de la fenêtre))

delay = 10 #définir le délai (10sec) des ananas pour que l'utilisateur puisse lire la consigne 

missiles_sound = pygame.mixer.Sound("bruitstirs.wav") #créer un son pour les missiles

timer = 0 #initialiser le timer

score = 0 #initialiser le score

while running: #tant que running est vrai
    if sauver == False: #si l'utilisateur choisit l'sauver == False
        timer += 1 #incrément du timer à chaque phase d'exécution
        if timer >= 30 * 60: #si le timer est plus grand ou égal à 30 sec * 60 cadres par sec
            gameover = True #définir gameover comme True
            music = pygame.mixer.music.load("gameover.mp3") #charger la musique du gameover
            pygame.mixer.music.play(1)#jouer la musique du gameover qu'une seule fois

            police = pygame.font.Font(None, 50) #créer une police pour le texte
            texte = pygame.sprite.Sprite() #créer un texte pour le gameover
            texte.image = police.render("GAMEOVER", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour le gameover
            texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte
            texte.rect.centerx = 310 #position x du texte
            texte.rect.centery = 200 #position y du texte
            liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites
            texte = pygame.sprite.Sprite() #créer un second message
            texte.image = police.render("INVASION ABOUTIE", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour informer le joueur de l'invasion
            texte.rect = texte.image.get_rect() #obtenir les coordonnées de l'image
            texte.rect.centerx = 310
            texte.rect.centery = 240
            liste_des_sprites.add(texte) #ajouter le texte


    liste_des_sprites.draw(fenetre) #dessiner les sprites 
    liste_sprites_ananas.draw(fenetre) #dessiner les ananas
    liste_sprites_missiles.draw(fenetre) #dessiner les missiles
    for event in pygame.event.get(): #pour chaque événement
        if event.type == pygame.QUIT: #si l'événement est quitter
            running = False
        if event.type == MOUSEMOTION: #si l'événement est la position de la souris
            avion.rect.x = event.pos[0]
        if event.type == MOUSEBUTTONDOWN: #si l'événement est le clic de la souris
            if gameover == False and sauver == True: #if gameover is not true
                nouveau_missile = tirer_missiles(avion.rect.centerx, HAUTEUR/2) #créer un nouveau missile
                pygame.mixer.Sound.play(missiles_sound) #jouer le son du tir
                liste_de_missiles.append(nouveau_missile) #ajouter le nouveau missile à la liste
                liste_sprites_missiles.add(nouveau_missile) #ajouter le nouveau missile au groupe

    if gameover == False: #si le jeu n'est pas terminé
        if score < 100: # only spawn ananas if score is less than 100
            nombre_aleatoire = randint(0, 100) #obtenir un nombre aléatoire pour contrôler la fréquence des ananas
            if nombre_aleatoire == 100: #si le nombre aléatoire est 100
                position_x_aleatoire = randint(0, LARGEUR - 60) #obtenir une position x aléatoire pour l'ananas
                nouvel_ananas = creer_ananas(position_x_aleatoire, -100) #créer une nouvelle ananas
                liste_d_ananas.append(nouvel_ananas) #l'ajouter à la liste
                liste_sprites_ananas.add(nouvel_ananas) #l'ajouter au groupe
                nouvel_ananas.delay_timer = delay * 60 #définir le délai
        for ananas in liste_d_ananas:
            if ananas.delay_timer > 0: #si le délai est supérieur à 0
                ananas.delay_timer -= 1 #soustraire le délai d'une ananas
            else:
                ananas.rect.y += rapidite_ananas #ajouter la vitesse à la position y de l'ananas
            if ananas.rect.colliderect(avion) and sauver == True: #si l'ananas touche l'avion ET si sauver == True
                print("COLLISION, L'OBJET A ÉTÉ ÉLIMINÉ, MALHEUREUSEMENT, VOUS AUSSI.") #message pour informer la mort de l'utilisateur
                avion.kill() #enlever l'avion de la liste des sprites (et donc de la fenetre))
                music = pygame.mixer.music.load("gameover.mp3") #charger la musique du gameover
                pygame.mixer.music.play(1) #jouer la musique du gameover qu'une seule fois

                police = pygame.font.Font(None, 50) #créer une police pour le texte
                texte = pygame.sprite.Sprite() #créer un texte
                texte.image = police.render("GAMEOVER", 1, (10, 10, 10),(255, 90, 20))
                texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte
                texte.rect.centerx = 310 #position x du texte
                texte.rect.centery = 200 #position y du texte
                liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites

                liste_d_ananas.remove(ananas) #retirer l'ananas de la liste
                ananas.kill() #supprimer l'ananas (de la fenetre)
                gameover = True #définir la variable gameover comme vrai

            if ananas.rect.y > HAUTEUR: #si l'ananas dépasse l'hauteur de la fenêtre

                if sauver == False: #si l'utilisateur a choisi de ne pas sauver la Terre
                    gameover = False #définir la variable gameover comme faux
                else:
                    gameover = True #définir la variable gameover comme vrai

                    police = pygame.font.Font(None, 36)
                    texte1 = pygame.sprite.Sprite() #créer un texte du gameover
                    pygame.sprite.Sprite.__init__(texte1) #initialiser le sprite 
                    texte1.image = police.render("GAMEOVER", 1, (10,10,10),(255, 90, 20)) #créer un texte du gameover
                    texte1.rect = texte1.image.get_rect() #obtenir les coordonnées du texte
                    texte1.rect.centerx = 310 #position x du texte
                    texte1.rect.centery = 200 #position y du texte
                    liste_des_sprites.add(texte1) #ajouter le texte1 à la liste des sprites

                    police = pygame.font.Font(None, 36) #créer une police pour le texte
                    texte22 = pygame.sprite.Sprite() #créer un texte pour informer de l'invasion des adversaires
                    pygame.sprite.Sprite.__init__(texte22) #initialiser le sprite
                    texte22.image = police.render("L'ennemi est entré dans notre atmosphère!", 1, (10,10,10),(255, 90, 20)) #créer un texte pour informer de l'invasion des adversaires
                    texte22.rect = texte22.image.get_rect() #obtenir les coordonnées du texte
                    texte22.rect.centerx = 310 #position x du texte
                    texte22.rect.centery = 250 #position y du texte
                    liste_des_sprites.add(texte22) #ajouter le texte22 à la liste des sprites

                    police = pygame.font.Font(None, 36) #créer une police pour le texte
                    texte33 = pygame.sprite.Sprite() #créer un texte motivant l'utilisateur d'une (nouvelle) mission
                    pygame.sprite.Sprite.__init__(texte33) #initialiser le sprite
                    texte33.image = police.render("Réessayez de tuer tout les ennemis!", 1, (10,10,10),(255, 90, 20)) #créer un texte motivant l'utilisateur d'une (nouvelle) mission
                    texte33.rect = texte33.image.get_rect() #obtenir les coordonnées du texte
                    texte33.rect.centerx = 310 #position x du texte
                    texte33.rect.centery = 300 #position y du texte
                    liste_des_sprites.add(texte33) #ajouter le texte33 à la liste des sprites

    for missiles in liste_de_missiles: #pour chaque missile dans la liste des missiles
        missiles.rect.y -= 10 #soustraire 10 à la position y du missile (10 pixels, le missile monte dans l'écran)
        if missiles.rect.y <= 0: #si la position y du missile est inférieure ou égale à 0
            liste_de_missiles.remove(missiles) #retirer le missile de la liste 
            missiles.kill() #supprimer le missile (de la fenetre)    
        else: 
            for ananas in liste_d_ananas: #pour chaque ananas dans la liste des ananas
                if ananas.rect.colliderect(missiles): #si l'ananas touche le missile
                    liste_d_ananas.remove(ananas) #retirer l'ananas de la liste des ananas
                    ananas.kill() #supprimer l'ananas (de la fenetre)
                    liste_de_missiles.remove(missiles) #retirer le missile de la liste des missiles
                    missiles.kill() #supprimer le missile (de la fenetre)
                    score += 10 # augmenter le score de l'utilisateur de 10 points
                    print(f"Score:", score) # print le score
                    texte_score = police.render("Score: " + str(score), 1, (10, 10, 10), (255, 90, 20)) #actualiser le texte du score
                    texte_score_rect = texte_score.get_rect() #obtenir les coordonnées du texte
                    texte_score_rect.topleft = (10, 10) #position du texte
                    if score >= 100: #vérifier le jeu pour une victoire
                        gameover = True #définir la variable gameover comme vrai
                        music = pygame.mixer.music.load("victoire.mp3") #charger la musique de la victoire
                        pygame.mixer.music.play(1) #jouer la musique de la victoire qu'une seule fois

                        police = pygame.font.Font(None, 50) #créer une police pour le texte
                        texte = pygame.sprite.Sprite() #créer un texte pour informer de la victoire
                        texte.image = police.render("VICTOIRE!", 1, (10, 10, 10),(255, 90, 20)) #créer un texte pour informer de la victoire
                        texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte
                        texte.rect.centerx = 310 #position x du texte
                        texte.rect.centery = 200 #position y du texte
                        liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites

                        texte = pygame.sprite.Sprite() #créer un second texte pour informer de la victoire
                        texte.image = police.render("LA TERRE EST SAUVÉE!", 1, (10, 10, 10),(255, 90, 20)) #créer un second texte pour informer de la victoire
                        texte.rect = texte.image.get_rect() #obtenir les coordonnées du texte
                        texte.rect.centerx = 310 #position x du texte
                        texte.rect.centery = 235 #position y du texte
                        liste_des_sprites.add(texte) #ajouter le texte à la liste des sprites

    pygame.display.flip() #mettre à jour la fenêtre 
    fenetre.fill((0,0,0)) #remplir la fenêtre avec la couleur noire (derrière la terre)
    clock.tick(50) #mettre le nombre de cadres par sec
pygame.quit() #quitter pygame
