import pyxel,random

 
SOL_PLATEFORME=[(1,26),(2,26),(3,26),(7,26),(8,26),(3,25),(4,25),(5,25),(0,20),(0,21),(10,22),(10,26),(11,26),(12,26)]
MUR=[(0,25),(1,25),(2,25),(0,22),(10,21),(5,21),(12,24),(13,24),(12,25),(13,25),(11,28),(10,28),(12,28),(11,29),(10,29),(12,29),(1,28),(1,29),(2,29),(3,29),(3,28),(15,24)]
SOL=[(11,27),(10,27),(12,27),(2,28),(12,19),(13,19),(14,19),(9,16)]
ECHELLE=[(6,14)]
TREMPLIN=[(6,22)]
TRESOR=[(1,20),(10,20)]
MUR_INVISIBLE=[(6,17),(12,16),(8,17)]
PIEGE_MONSTRE=[(0,20),(0,21)]
BLOC_INVISIBLE=[(14,24)]
TELEPORTEUR=[(3,21)]
CASSE_QUE_AVEC_TETE=[(12,22)]
VIDE=[(6,0)]
PORTE={(5,21):"defi walljump",
       (10,21):"only up"
       }

def collision_mur(nx,y_joueur,ttype="joueur"):
        #flanc gauche du joueur en tuile 
        flanc_gauche_x=int((nx+2)//8)
        y=int((y_joueur)//8)
        foot_x_gauche=int((nx+1)//8)
        foot_x_droite=int((nx+5)//8)
        
        
        tete_y=int((y)//8)
        foot_y=int((y+8)//8)   
        #pareil pour le flanc droit
        flanc_droit_x=int((nx+7)//8)
        #avec pget on compare avec la tilemap
        tile_gauche=pyxel.tilemap(1).pget(flanc_gauche_x,y)
        tile_droite=pyxel.tilemap(1).pget(flanc_droit_x,y)   
        tile_pied_gauche=pyxel.tilemap(1).pget(foot_x_gauche,foot_y)
        tile_pied_droit=pyxel.tilemap(1).pget(foot_x_droite,foot_y) 
        
        
         
        #et on verifie si le joueur
        if tile_gauche in SOL_PLATEFORME or tile_gauche in MUR or tile_droite in SOL_PLATEFORME or tile_droite in MUR or tile_droite in PIEGE_MONSTRE or tile_gauche in PIEGE_MONSTRE or tile_gauche in TREMPLIN or tile_droite in TREMPLIN or tile_gauche in SOL or tile_droite in SOL:
            return True
        else:
            return False
        
            
def collision(ax1,ay1,ax2,ay2,bx1,by1,bx2,by2):
    if ax1>bx2 or ay1>by2 or bx1>ax2 or by1>ay2:
        return False
    else:
        return True
#spawn des piece 
def spawn_piece(liste,piece):
    if pyxel.frame_count%100==0 and len(liste)<=10:
        liste.append(piece(random.randint(0,816),random.randint(0,544)))
def spawn_cles(liste_cles, cle, liste_spawn, nbmax, spwn_pris):
    

    if len(liste_cles) >= nbmax:
        return

    spawns_libres = [s for s in liste_spawn if s not in spwn_pris]

    if not spawns_libres:
        return

    x_tuile, y_tuile = random.choice(spawns_libres)
    liste_cles.append(cle(x_tuile * 8, y_tuile * 8, "cles"))
    spwn_pris.append((x_tuile, y_tuile))
    

def piece_spawn_valide(liste):
    for piece in liste:
        piece_x=int((piece.x+4)//8)
        piece_y=int(piece.y//8)
        tile_piece=pyxel.tilemap(1).pget(piece_x,piece_y)
        if tile_piece in MUR or tile_piece in SOL_PLATEFORME or tile_piece in TREMPLIN:
            liste.remove(piece)
#gere le timer entre chaque walljump
def gestion_cooldown(player):
    if player.cooldown>0:
        player.cooldown-=1
#message sur la map automatisation
def carretexte(x,y,text,textcolor,carrecolor,joueur,longueurcarre=100,hauteurcarre=30,type="remplie"):
    
    if "bord" in type:
        pyxel.rectb(x*8-joueur.camera_x,y*8-joueur.camera_y-8,longueurcarre,hauteurcarre,carrecolor)
    else:
        pyxel.rect(x*8-joueur.camera_x,y*8-joueur.camera_y-8,longueurcarre,hauteurcarre,carrecolor)
        
    pyxel.text((x*8-joueur.camera_x)+5,y*8-joueur.camera_y,text,textcolor)
           
def reset(j,p,liste):
    j.score=0
    j.pv=100
    j.vy=0
    j.vx=0
    j.nb_cles=0
    for e in liste:
        e.x=e.pos_x_spawn
        e.y=e.pos_y_spawn
        e.pv=100
        e.vx=0
        e.vy=0
    if j.zone1:
        j.set_position(2,1)   #normalement (2,1) 
    elif j.zone2:
        j.set_position(132,86)#normalemnt (132,86)
    else:
        j.set_position(245,52)
    j.cooldown=0 
    p.clear()    
def envoie_piece_au_joueur(j,liste,piece):
    if j.contact_coffre:
        for i in range(25):
            liste.append(piece(random.randint(int(j.x-10),int(j.x+10)),j.y))
def localisation(j):
    
        if 0<int(j.x//8)<103 and  -12<int(j.y//8)<100:
            j.zone1=True
            j.zone2=False
            j.zone3=False
        elif 103<=int(j.x//8)<=2000 and -12<int(j.y//8)<100:
            j.zone1=False
            j.zone2=True
            j.zone3=False
        elif 100<=int(j.y//8)<=2000:
            j.zone1=False
            j.zone3=True
            j.atteint_zone3=True
            j.zone2=False
def parametre(x,y,text,colortext,variables,toucheplus,touchemoins,decalagedeplus=0):
    pyxel.text(x,y,f'{text}: {variables}',colortext)
    pyxel.text(x+70+decalagedeplus,y,f'{toucheplus}: +',8)
    pyxel.text(x+110,y,f'{touchemoins}: -',1)
def convertit(touche):
    return pyxel.btnp(touche)
def touche_condition(touche1,touche2,var,type="entier"):
    t1=convertit(touche1)
    t2=convertit(touche2)
    if not("bol") in type:
        if t1:
            var+=1
        elif t2:
            var-=1
    else:
        if t1:
            var=True
        elif t2:
            var=False
            
    return var
def ecran_perso_victoire(titre,fond,texte1,ctexte1,touche="space"):
    pyxel.cls(fond)
    if pyxel.frame_count%50<25:
        pyxel.text(0,60,texte1,ctexte1)
        
    pyxel.text(0,120,f"{touche}: rejouer",8)
    pyxel.text(90,120,"m: Menu",0)
def ecran_perso_defaite(titre,fond,texte1,ctexte1,touche="space"):
    pyxel.cls(fond)
    if pyxel.frame_count%50<25:
        pyxel.text(50,60,texte1,ctexte1)
        
    pyxel.text(0,120,f"{touche}: rejouer",8)
    pyxel.text(90,120,"m: Menu",0)
    
def menu_perso(titre,textepourjouer,ccarretextepourjouer,ctextepourjouer,ctitre,cmenu,defilement_x,defilement_y,col_astuce,text_astuce,ccarretexte_astuce):
    pyxel.cls(cmenu)
    pyxel.bltm(defilement_x,defilement_y,1,0,0,2000,2000,1)
    #titre
    pyxel.text(40,0,titre,ctitre)
    #menu
    pyxel.text(55,20,"MENU",8)
    #jouer
    pyxel.rect(0,40,65,10,ccarretextepourjouer)
    pyxel.text(5,42,textepourjouer,ctextepourjouer)
    #astuces
    pyxel.rect(0,60,65,10,ccarretexte_astuce)
    pyxel.text(5,62,text_astuce,col_astuce)
def astuce(colcar):
    pyxel.bltm(0,0,2,0,0,128,128)
    pyxel.text(90,112,"M: Menu",colcar)
    pyxel.text(3,24,"FLECHES DIRECTIONNELLES:AVANCER",colcar)
    pyxel.text(3,32,"ESPACE:SAUTER",colcar)
    pyxel.text(3,40,"JUMPAD POUR SAUTER HAUT!",colcar)
    pyxel.text(3,48,"ESPACE SUR MUR: SAUT MURAL",colcar)
    pyxel.text(3,56,"RECUPERER 8 CLES INTERDITES",colcar)
        