import pyxel 
from joueur import*
from piece import*
from ennemi import *
from sound import*
class App:
    def __init__(self):
        pyxel.init(128,128,title="MUSHROOM BROS",fps=50)
        pyxel.load("4.pyxres")
        
        self.joueur=Joueur(54,122 )
        self.ennemies=[Ennemi(131,86),Ennemi(158,4),Ennemi(91,68),Ennemi(54,21),Ennemi(169,92),Ennemi(172,92),Ennemi(172,78),Ennemi(189,78),Ennemi(160,94),Ennemi(158,94),Ennemi(12,26),Ennemi(13,26),Ennemi(45,134)]
        #pieces et cles + etat du jeu(menu,jeu,defaite etc...)
        self.pieces=[]
        self.nb_max_cles=8
        self.spawn_cles=[(12,26),(45,79),(180,60),(177,73),(77,68),(139,72),(51,3),(164,93),(66,73),(59,119),(51,131),(21,106),(22,114),(27,132)]
        self.cles=[]
        self.spawn_pris=[]
        self.limite_ajout=1
        self.teleporteurs=[DoubleTeleporteur(7,13,12,26,20,-20)]
        #menu
        self.defilement_x=0
        self.defilement_y=0
        self.vitesse_defilement=1
        self.mode_camera=False
        self.distance_cam=30
        self.etat="menu"
        self.son=Sounds()
        pyxel.run(self.update,self.draw)
    def update(self):
        
        if self.etat=="jeu":
            self.update_jeu()
        elif self.etat=="defaite":
            self.update_defaite()
        elif self.etat=="parametre":
            self.update_parametre()
        elif self.etat=="victoire":
            self.update_victoire()
        elif self.etat=='menu':
            self.update_menu()
        elif self.etat=="astuce":
            self.update_astuce()
    def draw(self):
        if self.etat=="jeu":
            self.draw_jeu()
        elif self.etat=="defaite":
            self.draw_defaite()
        elif self.etat=="parametre":
            self.draw_parametre()
        elif self.etat=="victoire":
            self.draw_victoire()
        elif self.etat=="menu":
            self.draw_menu()
        elif self.etat=="astuce":
            self.draw_astuce()
            
    def update_jeu(self):
        if self.mode_camera==False:
            self.joueur.update()
        gestion_cooldown(self.joueur)
        spawn_piece(self.pieces,Objet)
        spawn_cles(self.cles,Objet,self.spawn_cles,self.nb_max_cles,self.spawn_pris)
        piece_spawn_valide(self.pieces)
        envoie_piece_au_joueur(self.joueur,self.pieces,Objet)
        for piece in self.pieces:
            piece.collision(self.joueur,self.pieces)
        for cle in self.cles:
            cle.collision(self.joueur,self.cles)
        for telep in self.teleporteurs:
            telep.collision(self.joueur)
           
        #ennemi
        for ennemi in self.ennemies:
            ennemi.affichage_optimisation(self.joueur)
            if ennemi.affiche:
                for autre in self.ennemies:
                    if autre.affiche and  ennemi != autre:
                        ennemi.repousse(autre)
                if ennemi.pv<=0:
                    self.ennemies.remove(ennemi)
                
                
                ennemi.patrouille(self.joueur)
                ennemi.update()
                ennemi.collision_avec_joueur(self.joueur)
        if self.joueur.atteint_zone3 and self.limite_ajout>0:
            self.teleporteurs.append(DoubleTeleporteur(73,110,67,66,20,-10))
            self.teleporteurs.append(DoubleTeleporteur(245,52,56,120,-20,20))  
            self.limite_ajout-=1 
        #conditions pour passer du jeu aux autres etats
        if self.joueur.pv<=0:
            self.etat="defaite"
        if self.joueur.nb_cles>=self.nb_max_cles:
            self.etat="victoire"
        if convertit(pyxel.KEY_P):
            self.etat="parametre"
        #mode camera
        if convertit(pyxel.KEY_C):
            if self.mode_camera==False:
                self.mode_camera=True
            else:
                self.mode_camera=False
        if self.mode_camera  :
            if convertit(pyxel.KEY_RIGHT):
                self.joueur.camera_x+=self.distance_cam
            if convertit(pyxel.KEY_DOWN):
                self.joueur.camera_y+=self.distance_cam
            if convertit(pyxel.KEY_LEFT):
                self.joueur.camera_x-=self.distance_cam
            if convertit(pyxel.KEY_UP):
                self.joueur.camera_y-=self.distance_cam
            
            
    
    def draw_jeu(self):
        
        pyxel.cls(5)
        #map
        pyxel.bltm(-self.joueur.camera_x,-self.joueur.camera_y,1,0,0,2000,2000,1)
        #ennemi
        for ennemi in self.ennemies:
            if ennemi.affiche:
                ennemi.draw(self.joueur)
        #partie message
        if not(self.joueur.defis['defi walljump']):
            carretexte(90,61,"bloquée requis reussir walljump",13,0,self.joueur,250,30)
        else:
            carretexte(90,61,"vous pouvez passer!",13,0,self.joueur,100,30)
            
        carretexte(79,58,"wall jump challenge!!",13,0,self.joueur,100,30)
        if self.joueur.defis['defi walljump']:
            carretexte(74,0,"Bravo! Belle Bite! defi reussi!",8,0,self.joueur,150)
        if self.joueur.nb_saut<=4:
            carretexte(2,15,"space:jump fleches:avancer",10,0,self.joueur,120,25,"bord")
        if self.joueur.nb_saut_muraux<=4:
            carretexte(24,25,"space sur mur:saut mural",10,0,self.joueur,120,30,"bord")
        if self.joueur.nb_saut_sur_tremplin<=3:
            carretexte(13,22,"propulsez vous sur les ressort!",10,0,self.joueur,120,25,"bord")
        carretexte(233,45,"trouver le secret! ASTUCE:illusion,saut",8,0,self.joueur,160,25)
        pyxel.text(0,32,f"x:{self.joueur.x//8}",8)    
        pyxel.text(0,48,f"y:{self.joueur.y//8}",8)
        pyxel.text(0,64,f"cles: {self.joueur.nb_cles}",8)
        #affichage zone du joueur hud
        if self.joueur.zone1:
            pyxel.text(0,56,f"Zone 1",8)
        elif self.joueur.zone2:
            pyxel.text(0,56,f"Zone 2",8)
        else:
            pyxel.text(0,56,f"Zone 3",8)
            
        #########################################################################################
        self.joueur.draw()
        for piece in self.pieces:
            piece.draw(self.joueur)
        for cle in self.cles:
            cle.draw(self.joueur)
        for telep in self.teleporteurs:
            telep.draw(self.joueur)
    #ecran si le joueur echoue
    def update_defaite(self):
        if pyxel.btnp(pyxel.KEY_SPACE):
            self.etat="jeu"
            reset(self.joueur,self.pieces,self.ennemies)
            
    def draw_defaite(self):
        ecran_perso_defaite("defaite",0,"vous etes mort!",8)
    def update_parametre(self):
        if convertit(pyxel.KEY_SPACE):
            self.etat="jeu"
        #detection touches incrémentant les variables
        self.joueur.force_saut=touche_condition(pyxel.KEY_1,pyxel.KEY_2,self.joueur.force_saut)
        self.joueur.degat_chute=touche_condition(pyxel.KEY_3,pyxel.KEY_4,self.joueur.degat_chute,"bol")
        self.joueur.vitesse_sol=touche_condition(pyxel.KEY_5,pyxel.KEY_6,self.joueur.vitesse_sol)
    def draw_parametre(self):
        pyxel.cls(5)
        parametre(0,0,"force saut",0,self.joueur.force_saut,1,2)
        parametre(0,8,"degat de chute",0,self.joueur.degat_chute,3,4,10)
        parametre(0,16,"vitesse",9,self.joueur.vitesse_sol,5,6)
    def update_victoire(self):
        if pyxel.btnp(pyxel.KEY_E):
            self.etat="jeu"
            self.cles=[]
            reset(self.joueur,self.pieces,self.ennemies)
        if convertit(pyxel.KEY_M):
            self.etat="menu"
            reset(self.joueur,self.pieces,self.ennemies)
            self.cles=[]
    
    def draw_victoire(self):
        ecran_perso_victoire("victoire",10,"vous avez rassemble les etoiles!",9,'E')
    def update_menu(self):
        if convertit(pyxel.KEY_SPACE):
            self.etat="jeu"
            self.joueur.set_position(2,2)
        if convertit(pyxel.KEY_A):
            self.etat="astuce"
        
        self.defilement_x-=self.vitesse_defilement
        if self.defilement_x<-1472:
            self.defilement_x=0
            if self.defilement_y>-600:
                self.defilement_y-=120
            else:
                self.defilement_y=0
        
             
        
    def draw_menu(self):
        menu_perso("MUSHROOM BROS","espace: jouer",8,0,0,5,self.defilement_x,self.defilement_y,0,"A: ASTUCES",9)
    def update_astuce(self):
        if pyxel.btn(pyxel.KEY_M):
            self.etat="menu"
            
        
    def draw_astuce(self): 
        pyxel.cls(1)
        astuce(6)
App()