import pygame
pygame.init()
win=pygame.display.set_mode((500,480))
pygame.display.set_caption('flappy bird')



walkRight = [pygame.image.load('R1.png'), pygame.image.load('R2.png'), pygame.image.load('R3.png'), pygame.image.load('R4.png'), pygame.image.load('R5.png'), pygame.image.load('R6.png'), pygame.image.load('R7.png'), pygame.image.load('R8.png'), pygame.image.load('R9.png')]
walkLeft = [pygame.image.load('L1.png'), pygame.image.load('L2.png'), pygame.image.load('L3.png'), pygame.image.load('L4.png'), pygame.image.load('L5.png'), pygame.image.load('L6.png'), pygame.image.load('L7.png'), pygame.image.load('L8.png'), pygame.image.load('L9.png')]
bg = pygame.image.load('bg.jpg')
char = pygame.image.load('standing.png')


clock=pygame.time.Clock()
class player(object):
    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.isjump = False
        self.left = False
        self.right = False
        self.walkcount = 0
        self.jumpcount = 10
        self.standing=True
        self.hitbox=(self.x+17,self.y,25,60)
    def draw(self, win):
        if self.walkcount + 1 >= 27:
            self.walkcount = 0
        if not (self.standing):
            if self.left:
                win.blit(walkLeft[self.walkcount//3], (self.x,self.y))
                self.walkcount += 1
            elif self.right:
                win.blit(walkRight[self.walkcount//3], (self.x,self.y))
                self.walkcount +=1
        else:
            if self.left:
                win.blit(walkLeft[0], (self.x,self.y))
            else:
                win.blit(walkRight[0], (self.x,self.y))
        self.hitbox=(self.x+17,self.y,28,60)
        #pygame.draw.rect(win,(255,0,0),self.hitbox,2) hitbxo
    def hit(self):
        self.x = 60 # We are resetting the player position
        self.y = 410
        self.walkCount = 0
        font1 = pygame.font.SysFont('comicsans', 100)
        text = font1.render('-5', 1, (255,0,0))
        win.blit(text, (250 - (text.get_width()/2),200))
        pygame.display.update()
        i = 0
        while i < 300:
            pygame.time.delay(10)
            i += 1
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    i = 301
                    pygame.quit()
                
       
class enemy(object):
    walkRight = [pygame.image.load('R1E.png'), pygame.image.load('R2E.png'), pygame.image.load('R3E.png'), pygame.image.load('R4E.png'), pygame.image.load('R5E.png'), pygame.image.load('R6E.png'), pygame.image.load('R7E.png'), pygame.image.load('R8E.png'), pygame.image.load('R9E.png'), pygame.image.load('R10E.png'), pygame.image.load('R11E.png')]
    walkLeft = [pygame.image.load('L1E.png'), pygame.image.load('L2E.png'), pygame.image.load('L3E.png'), pygame.image.load('L4E.png'), pygame.image.load('L5E.png'), pygame.image.load('L6E.png'), pygame.image.load('L7E.png'), pygame.image.load('L8E.png'), pygame.image.load('L9E.png'), pygame.image.load('L10E.png'), pygame.image.load('L11E.png')]
    
    def __init__(self, x, y, width, height, end):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.path = [x, end]  # This will define where our enemy starts and finishes their path.
        self.walkCount = 0
        self.vel = 3
        self.hitbox=(self.x+20,self.y,15,60)
        self.health=10
        self.visible=True
    def draw(self, win):
        self.move()
        if self.visible:
            if self.walkCount + 1 >= 33: # Since we have 11 images for each animtion our upper bound is 33. 
                                     # We will show each image for 3 frames. 3 x 11 = 33.
                self.walkCount = 0
            
            if self.vel > 0:
                win.blit(self.walkRight[self.walkCount//3], (self.x,self.y))
                self.walkCount += 1
            else:  
                win.blit(self.walkLeft[self.walkCount//3], (self.x,self.y))
                self.walkCount += 1

            pygame.draw.rect(win,(255,0,0),(self.hitbox[0],self.hitbox[1]-20,50,10))
            pygame.draw.rect(win,(0,128,0),(self.hitbox[0],self.hitbox[1]-20,50-(5*(10-self.health)),10))
            self.hitbox=(self.x+17,self.y,31,57)
        else:
            self.hitbox=(0,0,0,0)
        #pygame.draw.rect(win,(255,0,0),self.hitbox,2) hitbox
        
    def move(self):
        if self.vel>0:
            if self.x<self.vel+self.path[1]:
                self.x+=self.vel
            else:
                self.vel*=-1
                self.x+=self.vel
                self.walkCount=0
        else:
            if self.x>self.path[0]-self.vel:
                self.x+=self.vel
            else:
                self.vel*=-1
                self.walkCount=0 #take images from list
                self.x+=self.vel
    def hit(self):
        hitSound.play() 
        if self.health>0:
            self.health-=1
        else:
            self.visible=False
        print('hit')
        
    def __del__(self):
        print('dleted')
                
    
score=0
bulletSound = pygame.mixer.Sound("bullet.wav")
hitSound = pygame.mixer.Sound("hit.wav")

music = pygame.mixer.music.load("music.mp3")
pygame.mixer.music.play(-1)


class projectile(object):
    def __init__(self,x,y,radius,color,facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel=8*facing
    def draws(self,win):
        pygame.draw.circle(win,self.color,(self.x,self.y),self.radius)



def redraw():
    #win.fill((0,0,0))
    win.blit(bg,(0,0))
    text=font.render('Score:'+ str(score), 1, (0,0,0))
    win.blit(text,(390,10))
    #pygame.draw.rect(win,(255,0,0),(x,y,width,height))
    man.draw(win)
    #goblin1.draw(win)
    goblin.draw(win)
    
    
    for bullet in bullets:
        bullet.draws(win)
    pygame.display.update()

font = pygame.font.SysFont('comicsans',20,True)






goblin = enemy(100, 410, 64, 64, 300)
#goblin1=enemy
(50,410,64,64,100)
man = player(200, 410, 64,64)
bullets=[]
shoot=0
run=True
while run:
    if man.hitbox[1] < goblin.hitbox[1] + goblin.hitbox[3] and man.hitbox[1] + man.hitbox[3] > goblin.hitbox[1]:
        if man.hitbox[0] + man.hitbox[2] > goblin.hitbox[0] and man.hitbox[0] < goblin.hitbox[0] + goblin.hitbox[2]:
            man.hit()
            score -= 5
    clock.tick(27)
    pygame.time.delay(27)
    if shoot>0:
        shoot+=1
    if shoot>5:
        shoot=0
    for event in pygame.event.get():
        if event.type== pygame.QUIT:
            run=False

    for bullet in bullets:
        if bullet.y-bullet.radius<goblin.hitbox[1]+goblin.hitbox[3] and bullet.y+bullet.radius>goblin.hitbox[1]:
            if bullet.x+bullet.radius>goblin.hitbox[0] and bullet.x-bullet.radius<goblin.hitbox[0]+goblin.hitbox[2]:
                goblin.hit()
                bullets.pop(bullets.index(bullet))
                score+=1
        if bullet.x < 500 and bullet.x>0:
            bullet.x+=bullet.vel
        else:
            bullets.pop(bullets.index(bullet))

    
    keys=pygame.key.get_pressed()


    if keys[pygame.K_SPACE] and shoot==0:
        bulletSound.play()
        if man.left:
            facing=-1
        else:
            facing=1
        if len(bullets)< 5:
            bullets.append(projectile(round(man.x+man.width//2),round(man.y+man.height//2),6,(0,0,0),facing))
        shoot=1
    if keys[pygame.K_LEFT] and man.x>man.vel:
        man.x -= man.vel
        man.left = True
        man.right = False
        man.standing=False
    elif keys[pygame.K_RIGHT] and man.x<500-man.vel-man.width:
        man.x += man.vel
        man.right = True
        man.left = False
        man.standing=False
    else:
        man.standing=True
        man.walkCount = 0
    if not(man.isjump):

        #if keys[pygame.K_SPACE]:
        if keys[pygame.K_UP]:
            man.isjump = True
            #man.right = False
            #man.left = False
            man.walkCount = 0
    else:
        if man.jumpcount>=-10:
            neg=1
            if man.jumpcount<0:
                neg=-1
            man.y-=man.jumpcount ** 2 * 0.5 *neg
            man.jumpcount-=1
        else:
            man.isjump=False
            man.jumpcount=10
    #pygame.display.update()
    redraw()
    

pygame.quit()



'''

import pygame
pygame.init()

win = pygame.display.set_mode((500,480))

pygame.display.set_caption("First Game")

walkRight = [pygame.image.load('R1.png'), pygame.image.load('R2.png'), pygame.image.load('R3.png'), pygame.image.load('R4.png'), pygame.image.load('R5.png'), pygame.image.load('R6.png'), pygame.image.load('R7.png'), pygame.image.load('R8.png'), pygame.image.load('R9.png')]
walkLeft = [pygame.image.load('L1.png'), pygame.image.load('L2.png'), pygame.image.load('L3.png'), pygame.image.load('L4.png'), pygame.image.load('L5.png'), pygame.image.load('L6.png'), pygame.image.load('L7.png'), pygame.image.load('L8.png'), pygame.image.load('L9.png')]
bg = pygame.image.load('bg.jpg')
char = pygame.image.load('standing.png')

clock = pygame.time.Clock()


class player(object):
    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.isJump = False
        self.left = False
        self.right = False
        self.walkCount = 0
        self.jumpCount = 10
        self.standing = True

    def draw(self, win):
        if self.walkCount + 1 >= 27:
            self.walkCount = 0

        if not(self.standing):
            if self.left:
                win.blit(walkLeft[self.walkCount//3], (self.x,self.y))
                self.walkCount += 1
            elif self.right:
                win.blit(walkRight[self.walkCount//3], (self.x,self.y))
                self.walkCount +=1
        else:
            if self.right:
                win.blit(walkRight[0], (self.x, self.y))
            else:
                win.blit(walkLeft[0], (self.x, self.y))
                


class projectile(object):
    def __init__(self,x,y,radius,color,facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing
        self.vel = 8 * facing

    def draw(self,win):
        pygame.draw.circle(win, self.color, (self.x,self.y), self.radius)



def redrawGameWindow():
    win.blit(bg, (0,0))
    man.draw(win)
    for bullet in bullets:
        bullet.draw(win)
    
    pygame.display.update()


#mainloop
man = player(200, 410, 64,64)
bullets = []
run = True
while run:
    clock.tick(27)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        
    for bullet in bullets:
        if bullet.x < 500 and bullet.x > 0:
            bullet.x += bullet.vel
        else:
            bullets.pop(bullets.index(bullet))

    keys = pygame.key.get_pressed()

    if keys[pygame.K_SPACE]:
        if man.left:
            facing = -1
        else:
            facing = 1
            
        if len(bullets) < 5:
            bullets.append(projectile(round(man.x + man.width //2), round(man.y + man.height//2), 6, (0,0,0), facing))

    if keys[pygame.K_LEFT] and man.x > man.vel:
        man.x -= man.vel
        man.left = True
        man.right = False
        man.standing = False
    elif keys[pygame.K_RIGHT] and man.x < 500 - man.width - man.vel:
        man.x += man.vel
        man.right = True
        man.left = False
        man.standing = False
    else:
        man.standing = True
        man.walkCount = 0
        
    if not(man.isJump):
        if keys[pygame.K_UP]:
            man.isJump = True
            man.right = False
            man.left = False
            man.walkCount = 0
    else:
        if man.jumpCount >= -10:
            neg = 1
            if man.jumpCount < 0:
                neg = -1
            man.y -= (man.jumpCount ** 2) * 0.5 * neg
            man.jumpCount -= 1
        else:
            man.isJump = False
            man.jumpCount = 10
            
    redrawGameWindow()

'''
