import pyxel
from math import *
from random import *

pyxel.init(256,256,title="Game")
pyxel.load("image.pyxres")


def distance(x1, y1, x2, y2):
    distance = sqrt(((x1-x2)**2) + ((y1-y2)**2))
    return distance



pausestate = 0
state = "menu"
framecount = 0
eye_diff = 0
pos_x = pyxel.mouse_x
pos_y = pyxel.mouse_y
score = 120.0
diff = 1
cause = False
list_poussiere = []
for x in range(100) :
    list_poussiere.append([randint(0,256), randint(0, 256)])


#ENNEMI 1 : FAILLES

list_failles = [] # (pos_x, pos_y, état, rotation)

def ajouter_failles() :
    list_failles.append([randint(10, 240), randint(10, 240), 0, randint(0, 360), "faille"])

# ENNEMI 2 : SMILERS

list_smilers = [] # (pos_x, pos_y, état, cmpte à rebourd)

def ajouter_smilers() :
    list_smilers.append([randint(10, 240), randint(10, 240), 1, 300, "smiler"])

#ENNEMMI 3 : EYES

list_eyes = []  # (pos_x, pos_y, état, cmpte à rebourd)

def ajouter_eyes() : 
    list_eyes.append([randint(10, 240), randint(10, 240), 1, randint(180, 240), "eye"])
ajouter_eyes()
ajouter_eyes()


demon_eye = ["Haut/bas/gauche/droite", "emplacement 1/emplacement 2", "pos x", "pos y", "rotation"]
demon_eye_framerate = 2
demon_eye = [0, 0, 55, -100, 270, "demon_eye"]

def restart(framecount, state, diff, eye_diff, score, list_failles, list_smilers, cause) :
    framecount = 0
    state = "game"
    diff = 1
    eye_diff = 0
    score = 120.0
    list_failles = []
    list_smilers = []
    list_eyes = []
    cause = False
    ajouter_eyes()
    ajouter_eyes()



def update():
    global pos_x, pos_y, score, diff, eye_diff,list_poussiere, framecount, list_eyes, list_failles, list_smilers, cause, state, pausestate, demon_eye, demon_eye_framerate
    
    if state == "menu" :
        if pos_x > 87 and pos_x < 167 and pos_y > 119 and pos_y < 159 and pyxel.btn(pyxel.MOUSE_BUTTON_LEFT):
            state = "game"
            framecount = 0
            state = "game"
            eye_diff = 0
            score = 120.0
            list_failles = []
            list_smilers = []
            list_eyes = []
            cause = False
            ajouter_eyes()
            ajouter_eyes()
            demon_eye = [0, 0, 55, -100, 270, "demon_eye"]
        if pos_x > 103 and pos_x < 120 and pos_y > 206 and pos_y < 221 and pyxel.btn(pyxel.MOUSE_BUTTON_LEFT):
            diff = 1
        if pos_x > 119 and pos_x < 136 and pos_y > 206 and pos_y < 221 and pyxel.btn(pyxel.MOUSE_BUTTON_LEFT):
            diff = 2
        if pos_x > 135 and pos_x < 152 and pos_y > 206 and pos_y < 221 and pyxel.btn(pyxel.MOUSE_BUTTON_LEFT):
            diff = 3
    
    
    
    
    if state == "game" :
        if pyxel.btn(pyxel.KEY_P) and pausestate > 8:
            state = "pause"
            pausestate = 0
        pausestate += 1
        framecount += 1
        score -= 0.03
        if score < 0:
            state = "win"
        if score < 90:
            if eye_diff == 0 :
                eye_diff = 1
                diff += 1
                ajouter_eyes()
                ajouter_eyes()
            
        if score < 60:
            if eye_diff == 1 :
                eye_diff = 2
                diff += 1
                ajouter_eyes()
                ajouter_eyes()
            
        if score < 30:
            if eye_diff == 2 :
                eye_diff = 3
                diff += 1
                ajouter_eyes()
                ajouter_eyes()
            
            
        #ENNEMI 1 : FAILLES
        for faille in list_failles :
            faille[2] += 1         # 1 seconde = 30 ticks
            if faille[2] > 480 :
                cause = faille
                state = "gameover"
            if (distance(pos_x, pos_y, faille[0]+4, faille[1]+4) < 15) and pyxel.btnp(pyxel.MOUSE_BUTTON_LEFT) :
                list_failles.remove(faille)
        if framecount%(140-((diff-1)*20)) == 0 :
            ajouter_failles()
        
        
        #ENNEMI 2 : SMILERS
        for smiler in list_smilers :
            smiler[3] -= 1
            if smiler[3] < 0 :
                cause = smiler
                state = "gameover"
            if (distance(pos_x, pos_y, smiler[0]+8, smiler[1]+4) < 25) and (framecount%2 == 0) :
                smiler[2] += 1
            if smiler[2] > 15 :
                list_smilers.pop()
        if framecount%(200-((diff-1)*12)) == 0 :
            ajouter_smilers()
        
        #ENNEMI 3 : EYES
        for eye in list_eyes :
            eye[3] -= 1
            if eye[3] < 0:
                eye[0], eye[1], eye[3] = randint(10, 240), randint(10, 240), randint(180, 240)
            if eye[2] > 60 :
                cause = eye
                state = "gameover"
            if distance(pos_x, pos_y, eye[0]+8, eye[1]+4) < 20 :
                eye[2] += 2
            else :
                eye[2] -= 1
            if eye[2] < 0 :
                eye[2] = 0
        
        
        #ENNEMI 4 : DEMON EYE
        
        if diff >=  4:
            demon_eye_framerate += 1
            if demon_eye_framerate%700 == 0 :
                demon_eye_framerate = 2
                demon_eye = [randint(1,4), randint(0,1)]
                if demon_eye[0] == 1 :
                    demon_eye.extend([55, -500, 270])
                    if demon_eye[1] == 1 :
                        demon_eye[2] = 185
                if demon_eye[0] == 2 :
                    demon_eye.extend([756, 55, 0])
                    if demon_eye[1] == 1 :
                        demon_eye[3] = 185
                if demon_eye[0] == 3 :
                    demon_eye.extend([59, 756, 90])
                    if demon_eye[1] == 1 :
                        demon_eye[2] = 190
                if demon_eye[0] == 4 :
                    demon_eye.extend([-500, 55, 180])
                    if demon_eye[1] == 1 :
                        demon_eye[3] = 195
                demon_eye.append("demon_eye")
            
            if demon_eye[0] == 1 and demon_eye[3] < 400 :
                demon_eye[3] += 12
            
            if demon_eye[0] == 2 and demon_eye[2] > -100  :
                demon_eye[2] -= 12
            
            if demon_eye[0] == 3 and demon_eye[3] > -100  :
                demon_eye[3] -= 12
            
            if demon_eye[0] == 4 and demon_eye[2] < 400  :
                demon_eye[2] += 12
            
            if distance(pos_x, pos_y, demon_eye[2]+8, demon_eye[3]+5) < 30 :
                cause = demon_eye
                state = "gameover"
            
        


    
    if pyxel.btn(pyxel.KEY_Q):
        state = "menu"
    pos_x = pyxel.mouse_x
    pos_y = pyxel.mouse_y
    
    
def draw():
    global diff, list_poussiere, framecount, cause, state, pausestate, demon_eye, demon_eye_framerate
    if state == "gameover" :
        pyxel.bltm(0, 0, 0, 0, 0, 256, 256)
        pyxel.blt(103, 90, 2, 16, 112, 70, 20, scale = 2)
        
        
        if cause[4] == "faille" :
            pyxel.blt(cause[0], cause[1], 0, 56, 0, 8, 8, 15, rotate=cause[3], scale=2)
        if cause[4] == "smiler" :
            pyxel.blt(cause[0], cause[1], 0, 80, 12, 16, 12, 15, scale=2)
        if cause[4] == "eye" :
            pyxel.blt(cause[0], cause[1], 0, 144, 24, 16, 8, 15, scale = 2)
        else :
            pyxel.blt(cause[2], cause[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = cause[4])
            if (pyxel.frame_count%40) < 20 :  
                pyxel.text(82, 180, "press q to return to menu", 7)

    elif state == "menu" :
        pyxel.cls(0)
        pyxel.blt(105, 50, 2, 0, 0, 60, 20, scale = 3)        
        pyxel.blt(107, 130, 2, 0, 24, 43, 21, scale = 2)
        pyxel.blt(102, 190, 2, 48, 25, 53, 8)
        pyxel.blt(104, 205, 2, 0, 48+(16*(diff-1)), 48, 16, scale = 1)
        pyxel.pset(pos_x, pos_y, 7)
        

        
    elif state == "win" :
        pyxel.cls(0)
        pyxel.blt(85, 95, 2, 0, 144, 100, 40, scale = 2)
        if (pyxel.frame_count%40) < 20 :
            pyxel.text(49, 180, "you can now try a higher difficulty level", 7)
        
    elif state == "pause" :
        pausestate += 1
        pyxel.rect(75, 65, 40, 120, 7)
        pyxel.rect(145, 65, 40, 120, 7)
        if pyxel.btn(pyxel.KEY_P) and pausestate > 8:
            state = "game"
            pausestate = 0
    elif state == "game" :
        pyxel.cls(0)
        pyxel.bltm(0, 0, 1, 0, 0, 256, 256)
        
        for x in list_poussiere :
            pyxel.pset(x[0], x[1], 13)
        
        #ENNEMI 3 : EYES
        for eye in list_eyes :
            pyxel.blt(eye[0], eye[1], 0, 16+(16*(eye[2]//8)), 24, 16, 8, 15, scale = 2)
        
        #ENNEMI 1 : FAILLES
        for faille in list_failles :
            pyxel.blt(faille[0], faille[1], 0, 16+(8*(faille[2]//80)), 0, 8, 8, 15, rotate=faille[3], scale=2)
            
        #ENNEMI 2 : SMILERS
        for smiler in list_smilers :
            pyxel.blt(smiler[0], smiler[1], 0, 16+(16*(smiler[2]%4)), 12, 16, 9, 15, scale=2)
        
        

        
        
        
        
        
        pyxel.rect(0,0,pos_x-(40-((diff-1)*6)),256,0)
        pyxel.rect(pos_x+(40-((diff-1)*6)),0,256,256,0)
        pyxel.rect(0,0,256,pos_y-(40-((diff-1)*6)),0)
        pyxel.rect(0,pos_y+(40-((diff-1)*6)),256,256,0)
        
        for x in range(pos_x-(40-((diff-1)*6)),pos_x+(40-((diff-1)*6))):
            for y in range(pos_y-(40-((diff-1)*6)),pos_y+(40-((diff-1)*6))):
                if distance(x, y, pos_x, pos_y) > 40-((diff-1)*6) :
                    pyxel.pset(x, y, 0)
                    
                    
    
    
                #ENNEMI 4 : DEMON EYE
        if demon_eye[0] == 1 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            if demon_eye_framerate < 60 :
                if demon_eye_framerate%20 < 10 :
                    pyxel.rect(0+(demon_eye[1]*128), 0, 128, 10, 8)
                    pyxel.blt(50+(demon_eye[1]*138), 30, 0, 15, 56, 12, 13, scale = 3, colkey = 15)
        
        if demon_eye[0] == 2 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            if demon_eye_framerate < 60 :
                if demon_eye_framerate%20 < 10 :
                    pyxel.rect(246, 0+(demon_eye[1]*128), 10, 128, 8)
                    pyxel.blt(210, 50+(demon_eye[1]*142), 0, 15, 56, 12, 13, scale = 3, colkey = 15)
                
        if demon_eye[0] == 3 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            if demon_eye_framerate < 60 :
                if demon_eye_framerate%20 < 10 :
                    pyxel.rect(0+(demon_eye[1]*128), 246, 128, 10, 8)
                    pyxel.blt(55+(demon_eye[1]*138), 210, 0, 16, 56, 12, 13, scale = 3, colkey = 15)
    
        if demon_eye[0] == 4 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            if demon_eye_framerate < 60 :
                if demon_eye_framerate%20 < 10 :
                    pyxel.rect(0, 0+(demon_eye[1]*128), 10, 128, 8)
                    pyxel.blt(30, 50+(demon_eye[1]*142), 0, 15, 56, 12, 13, scale = 3, colkey = 15)
                    
                    
        pyxel.text(232, 250, str(round(score, 2)), 7)
        pyxel.text(0, 250, "ennemies restants : "+str(len(list_failles)+len(list_smilers)), 7)
        pyxel.pset(pos_x, pos_y, 7)
        
    
    elif state == "screenshot" :
        pyxel.cls(0)
        pyxel.blt(105, 120, 2, 0, 0, 60, 20, scale = 3) 
        pyxel.blt(40, 40, 0, 16, 24, 16, 8, 15, scale = 3)
        pyxel.blt(205, 210, 0, 32, 0, 8, 8, 15, rotate=-10, scale=4)
        pyxel.blt(85, 190, 0, 16, 9, 16, 16, colkey = 15, scale = 3)
        pyxel.blt(145, 60, 0, 16, 40, 20, 16, scale = 3, rotate = 10, colkey = 15)
    
    elif state == "essai" :
        if demon_eye[0] == 1 :
            demon_eye.extend([55, 0, 270])
            if demon_eye[1] == 1 :
                demon_eye[2] = 185
        if demon_eye[0] == 2 :
            demon_eye.extend([256, 55, 0])
            if demon_eye[1] == 1 :
                demon_eye[3] = 185
        if demon_eye[0] == 3 :
            demon_eye.extend([59, 256, 90])
            if demon_eye[1] == 1 :
                demon_eye[2] = 190
        if demon_eye[0] == 4 :
            demon_eye.extend([0, 55, 180])
            if demon_eye[1] == 1 :
                demon_eye[3] = 195
        
        
        if demon_eye[0] == 1 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            pyxel.rect(0+(demon_eye[1]*128), 0, 128, 10, 8)
            pyxel.blt(50+(demon_eye[1]*138), 30, 0, 15, 56, 12, 13, scale = 3, colkey = 15)
        
        if demon_eye[0] == 2 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            pyxel.rect(246, 0+(demon_eye[1]*128), 10, 128, 8)
            pyxel.blt(210, 50+(demon_eye[1]*142), 0, 15, 56, 12, 13, scale = 3, colkey = 15)
            
        if demon_eye[0] == 3 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            pyxel.rect(0+(demon_eye[1]*128), 246, 128, 10, 8)
            pyxel.blt(55+(demon_eye[1]*138), 210, 0, 16, 56, 12, 13, scale = 3, colkey = 15)
    
        if demon_eye[0] == 4 :
            pyxel.blt(demon_eye[2], demon_eye[3], 0, 16, 42, 17, 10, scale = 4, colkey = 15, rotate = demon_eye[4])
            pyxel.rect(0, 0+(demon_eye[1]*128), 10, 128, 8)
            pyxel.blt(30, 50+(demon_eye[1]*142), 0, 15, 56, 12, 13, scale = 3, colkey = 15)
        

pyxel.run(update,draw)