import pyxel
import random as rd

def init_couleurs():
    """Remplace les couleurs de Pyxel par des couleurs personnalisées"""
    vert = 8
    rouge = 10
    bleu = 12
    jaune = 14
    pyxel.colors[vert+1] = 0x30f130
    pyxel.colors[vert] = 0x305030
    pyxel.colors[rouge+1] = 0xf13030
    pyxel.colors[rouge] = 0x503030
    pyxel.colors[bleu+1] = 0x3030f1
    pyxel.colors[bleu] = 0x303050
    pyxel.colors[jaune+1] = 0xf1f100
    pyxel.colors[jaune] = 0x505000
    return

def son(couleur):
    """Produit un son selon la couleur d'entrée"""
    if couleur == 'vert':
        pyxel.play(0,0)
    if couleur == 'rouge':
        pyxel.play(0,1)
    if couleur == 'bleu':
        pyxel.play(0,2)
    if couleur == 'jaune':
        pyxel.play(0,3)
    return

def allumer(couleur):
    """Affiche l'image de la couleur d'entrée lumineuse"""
    if couleur == 'vert':
        pyxel.blt(50,70,0,32,0,16,16, scale=6)
    if couleur == 'rouge':
        pyxel.blt(146,70,0,48,0,16,16, scale=6)
    if couleur == 'bleu':
        pyxel.blt(146,166,0,48,16,16,16, scale=6)
    if couleur == 'jaune':
        pyxel.blt(50,166,0,32,16,16,16, scale=6)
    return

def initialisation():
    """Affiche les images, toutes les frames"""
    pyxel.cls(0)
    pyxel.blt(50,70,0,0,0,16,16, scale=6)
    pyxel.blt(146,70,0,16,0,16,16, scale=6)
    pyxel.blt(146,166,0,16,16,16,16, scale=6)
    pyxel.blt(50,166,0,0,16,16,16, scale=6)
    pyxel.text(90,10,"NIVEAU "+str(len(seq_couleurs)),7)
    return

def cond_couleur():
    """Renvoie une couleur selon l'emplacement de la souris"""
    if pyxel.mouse_x <= 108 and pyxel.mouse_y > 30 and pyxel.mouse_y <= 138:
        return "vert"
    elif pyxel.mouse_x > 108 and pyxel.mouse_y > 30 and pyxel.mouse_y <= 138:
        return "rouge"
    elif pyxel.mouse_x > 108 and pyxel.mouse_y > 138:
        return "bleu"
    elif pyxel.mouse_x <= 108 and pyxel.mouse_y > 138:
        return "jaune"
    return ""

def fin_de_jeu():
    """Arrête le jeu et affiche l'écran de fin"""
    global fin
    fin = True
    pyxel.cls(0)
    pyxel.mouse(False)
    pyxel.text(42,90,"Vous etes arrive(e) au niveau : "+str(len(seq_couleurs)),7)
    pyxel.text(80,110,"Felicitations !",7)
    pyxel.text(42,150,"Appuyez sur Q pour quitter Simon",7)
    return


seq_couleurs = [rd.choice(['bleu', 'rouge', 'vert', 'jaune'])] #Crée une liste de couleurs avec une première couleur aléatoire

#Initialisation des variables
compteur_affichage = 0
compteur_clic = 0
chrono_affichage = 0
timer_clic_lumiere = 0
couleur_clic = ''
fin = False

def update():
    """Une fois par frame"""
    global compteur_affichage,compteur_clic,chrono_affichage, fin #Permet la modification des variables globales
    if not fin:
        if compteur_clic == len(seq_couleurs): #si l'utilisateur a appuyé sur toutes les couleurs dans le bon ordre
            seq_couleurs.append(rd.choice(['bleu', 'rouge', 'vert', 'jaune'])) #Rajout d'une couleur
            compteur_affichage = 0
            compteur_clic = 0
            chrono_affichage = -30 #Permet une attente de 30 frames avant l'affichage des couleurs

        if compteur_affichage>=len(seq_couleurs) and pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT) and timer_clic_lumiere == 0: #Si, après l'affichage, l'utilisateur clique quand une lumière est pas allumé
            couleur = cond_couleur()
            if couleur != "":
                if couleur == seq_couleurs[compteur_clic]: #Si la couleur est la bonne
                    compteur_clic+=1 #On passe à la prochaine couleur
                else:
                    fin_de_jeu()


    if pyxel.btnp(pyxel.KEY_Q): #Permet de quitter le jeu quand la touche 'Q' est appuyé
        pyxel.quit()

def draw():
    """Une fois par frame, après update()"""
    global compteur_affichage,chrono_affichage, timer_clic_lumiere, couleur_clic, fin #Permet la modification des variables globales
    if not fin:
        initialisation()
        if compteur_affichage < len(seq_couleurs): #Si c'est pendant l'affichage
            chrono_affichage+=1 #Augmente le chrono d'1
            if chrono_affichage == 15: #Produit le son de la couleur allumé après 15 frames
                son(seq_couleurs[compteur_affichage])
            if chrono_affichage >= 15: #Allume la lumière de la couleur après 15 frames, pendant 25 frames
                allumer(seq_couleurs[compteur_affichage])
            if chrono_affichage == 40: #Monte le compteur d'1 et met le chrono à 0 après 40 frames
                compteur_affichage+=1
                chrono_affichage = 0
        else:
            if pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT) and timer_clic_lumiere == 0: #Si, après l'affichage, l'utilisateur clique quand une lumière est pas allumé
                couleur_clic = cond_couleur()
                if couleur_clic != "": #Active le timer pendant 10 frames et produit le son de la couleur
                    timer_clic_lumiere = 10
                    son(couleur_clic)

        if timer_clic_lumiere > 0: #Si le timer est activé, allume la lumière
            allumer(couleur_clic)
            timer_clic_lumiere-=1


pyxel.init(212,232)
init_couleurs()
pyxel.mouse(True)
pyxel.load("simon.pyxres")
pyxel.run(update, draw)