class Game:
    def __init__(self):
        pg.mixer.init()
        self.level = 1
        self.background = pg.image.load(backgrounds[self.level - 1])
        self.board = pg.image.load(backimages[0])
        self.door = pg.image.load(backimages[1])
        self.right_margin = pg.image.load(backimages[2])
        self.screen = pg.display.set_mode((WIDTH, HEIGHT), pg.RESIZABLE)
        pg.display.set_caption("Client2")
        #self.screen.blit(self.background, [250,250])
        self.clock = pg.time.Clock()
        self.running = True
        self.playing = True
        self.waiting = True
        self.inf1 = ''
        self.inf2 = ''
        self.release = True
        self.pressTime = time.time()

        #sprite groups
        self.all_sprites = pg.sprite.Group()
        self.all_blocks = pg.sprite.Group()
        self.all_bullets = pg.sprite.Group()
        self.all_bonus = pg.sprite.Group()
        self.all_superbullets = pg.sprite.Group()
        for i in range(20):
            map = maps[0]
            for j in range(20):
                if map[i][j] == 1:
                    bl = Block(j, i, 1)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 2:
                    bl = Block(j, i, 0, True, 0)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 3:
                    bl = Block(j, i, 3, False, 1)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 4:
                    bl = Block(j, i, 2, False, 2)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 5:
                    bl = Block(j, i, 3, False, 3)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 6:
                    bl = Block(j, i, 1, False, 4)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 7:
                    bl = Block(j, i, 3, False, 5)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 8:
                    bl = Block(j, i, 2, False, 6)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 'b':
                    self.chef1 = Chef(j, i, chef1_moves, False,
                                      self.all_bullets, self.all_sprites,
                                      self.all_superbullets, self.all_blocks)
                    self.all_sprites.add(self.chef1)
                    # self.chef1.set_center(j, i)
                    # self.chef1.set_cabbage(10)
                    # self.chef1.set_life(1)
                elif map[i][j] == 'a':
                    self.chef2 = Chef(j, i, chef2_moves, True,
                                      self.all_bullets, self.all_sprites,
                                      self.all_superbullets, self.all_blocks)
                    self.all_sprites.add(self.chef2)
                    # self.chef2.set_center(j, i)
                    # self.chef2.set_cabbage(10)
                    # self.chef2.set_life(1)

    # def light_up()
    #if self.level == 5:
        self.fog = pg.Surface((800, 800))
        self.fog.fill(BLACK)
        self.light_mask1 = pg.image.load(light1).convert_alpha()
        self.light_mask2 = pg.image.load(light2).convert_alpha()
        self.light_mask1 = pg.transform.scale(self.light_mask1, LIGHT_RS)
        self.light_mask2 = pg.transform.scale(self.light_mask2, LIGHT_RS)
        self.light_rect1 = self.light_mask1.get_rect()
        self.light_rect2 = self.light_mask2.get_rect()

    def move(self):
        if self.inf1 == 'left':
            self.chef1.move_left()
            #print("get message")
        elif self.inf1 == 'right':
            self.chef1.move_right()
            #print("get message")
        elif self.inf1 == 'up':
            self.chef1.move_forward()
            #print("get message")
        elif self.inf1 == 'down':
            self.chef1.move_backward()
            #print("get message")
        elif self.inf1 == 'shoot':
            #print("get message")
            self.chef1.shoot()

        if self.inf2 == 'left':
            self.chef2.move_left()
            #print("get message")
        elif self.inf2 == 'right':
            self.chef2.move_right()
            #print("get message")
        elif self.inf2 == 'up':
            self.chef2.move_forward()
            #print("get message")
        elif self.inf2 == 'down':
            self.chef2.move_backward()
            #print("get message")
        elif self.inf2 == 'shoot':
            self.chef2.shoot()

    def create(self):
        #0 is nothing
        #1 is empty bl
        #2 is not shootable
        #3 is life - health = 3
        #4 is cabbage - 2
        #5 is point - 3

        #def __init__(self, x, y, health, indestructable = False, bonus = 0 ):
        map = maps[self.level - 1]
        for i in range(20):
            for j in range(20):
                if map[i][j] == 1:
                    bl = Block(j, i, 1)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 2:
                    bl = Block(j, i, 0, True, 0)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 3:
                    bl = Block(j, i, 3, False, 1)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 4:
                    bl = Block(j, i, 2, False, 2)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 5:
                    bl = Block(j, i, 3, False, 3)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 6:
                    bl = Block(j, i, 1, False, 4)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 7:
                    bl = Block(j, i, 3, False, 5)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 8:
                    bl = Block(j, i, 2, False, 6)
                    self.all_sprites.add(bl)
                    self.all_blocks.add(bl)
                elif map[i][j] == 'b':
                    # self.chef1 = Chef(j, i, chef1_moves, False, self.all_bullets, self.all_sprites,self.all_superbullets)
                    # self.all_sprites.add(self.chef1)
                    self.chef1.set_center(j, i)
                    self.chef1.set_cabbage(40)
                    self.chef1.set_life(1)
                    self.chef1.set_block_group(self.all_blocks)
                elif map[i][j] == 'a':
                    # self.chef2 = Chef(j, i, chef1_moves, True, self.all_bullets, self.all_sprites, self.all_superbullets)
                    # self.all_sprites.add(self.chef2)
                    self.chef2.set_center(j, i)
                    self.chef2.set_cabbage(40)
                    self.chef2.set_life(1)
                    self.chef2.set_block_group(self.all_blocks)

    def setup_next_level(self):
        for bul in self.all_bullets:
            bul.kill()
        for sbul in self.all_superbullets:
            sbul.kill()
        for bl in self.all_blocks:
            bl.kill()
        for bn in self.all_bonus:
            bn.kill()
        if not self.waiting:
            self.level += 1
            self.create()
        self.playing = True

    def update(self):
        self.move()
        self.reset_inf()
        hit_block = pg.sprite.groupcollide(self.all_blocks, self.all_bullets,
                                           False, True)
        hit_block2 = pg.sprite.groupcollide(
            self.all_blocks, self.all_superbullets, False,
            False)  #if the block turn into the bonus -> True, False
        shoot_chef1 = pg.sprite.spritecollide(self.chef1, self.all_bullets,
                                              True)
        shoot_chef2 = pg.sprite.spritecollide(self.chef2, self.all_bullets,
                                              True)
        shoot_chef_1 = pg.sprite.spritecollide(self.chef1,
                                               self.all_superbullets, True)
        shoot_chef_2 = pg.sprite.spritecollide(self.chef2,
                                               self.all_superbullets, True)

        if shoot_chef1 or shoot_chef_1:
            self.chef1.is_hit()
            # 	if self.chef1.get_life == 0:
            # 		self.playing= False
            self.chef2.claim_point()
            self.chef2.claim_point()
        if shoot_chef2 or shoot_chef_2:
            self.chef2.is_hit()
            # 	if self.chef2.get_life == 0:
            # 		print('client 2 should be dead')
            # 		self.playing= False
            self.chef1.claim_point()
            self.chef1.claim_point()

        for bl in hit_block.keys():
            bl.decrementHealth()
            if bl.getHealth() == 0:
                if bl.getBonus() == 0:
                    bl.kill()
                    sound = pg.mixer.Sound('blockcrack.wav')
                    sound.play()
                else:
                    sound = pg.mixer.Sound('powerupblock.wav')
                    sound.play()
                    self.all_bonus.add(bl)
                    self.all_blocks.remove(bl)

        for bl in hit_block2.keys():
            bl.setHealth(0)
            if bl.getHealth() == 0:
                if bl.getBonus() == 0:
                    bl.kill()
                    sound = pg.mixer.Sound('blockcrack.wav')
                    sound.play()
                else:
                    sound = pg.mixer.Sound('powerupblock.wav')
                    sound.play()
                    self.all_bonus.add(bl)
                    self.all_blocks.remove(bl)

        chef1_hit_bonus = pg.sprite.spritecollide(self.chef1, self.all_bonus,
                                                  True)
        for bonus in chef1_hit_bonus:
            if bonus.getBonus() == 1:
                self.chef1.claim_life()
            elif bonus.getBonus() == 2:
                self.chef1.claim_cabbage()
            elif bonus.getBonus() == 4:
                self.chef1.gainSpeed()
            elif bonus.getBonus() == 5:
                self.chef1.claim_superbullet()
            elif bonus.getBonus() == 6:
                self.chef1.gainLight()
            else:
                self.chef1.claim_point()

        chef2_hit_bonus = pg.sprite.spritecollide(self.chef2, self.all_bonus,
                                                  True)
        for bonus in chef2_hit_bonus:
            if bonus.getBonus() == 1:
                self.chef2.claim_life()
            elif bonus.getBonus() == 2:
                self.chef2.claim_cabbage()
            elif bonus.getBonus() == 4:
                self.chef2.gainSpeed()
            elif bonus.getBonus() == 5:
                self.chef2.claim_superbullet()
            elif bonus.getBonus() == 6:
                self.chef2.gainLight()
            else:
                self.chef1.claim_point()

        # chef1_old_x = self.chef1.get_x()
        # chef1_old_y = self.chef1.get_y()

        # chef2_old_x = self.chef2.get_x()
        # chef2_old_y = self.chef2.get_y()

        self.all_sprites.update()

    # 	chef1_collide_block = pg.sprite.spritecollide(self.chef1, self.all_blocks, False)
    # 	if chef1_collide_block:
    # 		self.chef1.set_x(chef1_old_x)
    # 		self.chef1.set_y(chef1_old_y)
    # # 			self.chef1.set_sound(None)

    # 	chef2_collide_block = pg.sprite.spritecollide(self.chef2, self.all_blocks, False)
    # 	if chef2_collide_block:
    # 		self.chef2.set_x(chef2_old_x)
    # 		self.chef2.set_y(chef2_old_y)
    # # 			self.chef2.set_sound(None)

    def run_level(self):
        pg.mixer.music.load('song.wav')
        pg.mixer.music.play(-1)
        while self.playing:

            # for bl in self.all_bullets:
            # 	bl.kill()
            # for bl in self.all_superbullets:
            # 	bl.kill()
            self.clock.tick(FPS)
            self.events()
            lc.handle_timeout(1)
            self.update()
            self.draw()
            # if self.chef1.is_dead() or self.chef2.is_dead():
            # 	if self.level == 5:
            # 		self.running = False
            # 	self.playing = False
            # for spr in self.all_sprites:
            # 	spr.kill()
            if self.chef1.is_dead():
                out = input_t()
                out.player = 1
                out.motion = "dead"
                lc.publish("TO SERVER", out.encode())
                if self.level == 5:
                    self.running = False
                self.playing = False
            elif self.chef2.is_dead():
                out = input_t()
                out.player = 2
                out.motion = "dead"
                lc.publish("TO SERVER", out.encode())
                if self.level == 5:
                    self.running = False
                self.playing = False

    def level_successful(self):
        if self.playing == False:
            return True
        else:
            return False

    def done(self):
        if self.running == False:
            return True
        else:
            return False

    def events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                # if self.playing:
                # 	self.playing = False
                # self.running = False
                pg.quit()
        key = pg.key.get_pressed()
        sending_out = input_t()
        sending_out.player = 2
        judgeTime = time.time()
        if key[pg.K_LEFT]:
            if judgeTime - self.pressTime > 0.1:
                sending_out.motion = "left"
                self.release = False
                lc.publish("TO SERVER", sending_out.encode())
                self.pressTime = time.time()
        elif key[pg.K_RIGHT]:
            if judgeTime - self.pressTime > 0.1:
                sending_out.motion = "right"
                self.release = False
                lc.publish("TO SERVER", sending_out.encode())
                self.pressTime = time.time()
        elif key[pg.K_UP]:
            if judgeTime - self.pressTime > 0.1:
                sending_out.motion = "up"
                self.release = False
                lc.publish("TO SERVER", sending_out.encode())
                self.pressTime = time.time()
        elif key[pg.K_DOWN]:
            if judgeTime - self.pressTime > 0.1:
                sending_out.motion = "down"
                self.release = False
                lc.publish("TO SERVER", sending_out.encode())
                self.pressTime = time.time()
        elif key[pg.K_SPACE]:
            if judgeTime - self.pressTime > 0.5:
                sending_out.motion = "shoot"
                self.release = False
                lc.publish("TO SERVER", sending_out.encode())
                self.pressTime = time.time()
        else:
            self.release = True

    def makefog(self):
        self.fog.fill(BLACK)
        if self.chef2.get_Light():
            self.light_mask1 = pg.transform.scale(self.light_mask1, LIGHT_RB)
            self.light_rect1 = self.light_mask1.get_rect()
            self.chef2.set_endLight()
            elapsed = self.chef2.get_endLight() - self.chef2.get_stLight()
            if elapsed >= 5.00:
                self.chef2.close_Light()
                self.light_mask1 = pg.transform.scale(self.light_mask1,
                                                      LIGHT_RS)
                self.light_rect1 = self.light_mask1.get_rect()

        # if self.chef1.get_Light():
        # 	self.light_mask2= pg.transform.scale(self.light_mask2,LIGHT_RB)
        # 	self.light_rect2=self.light_mask2.get_rect()
        # 	self.chef1.set_endLight()
        # 	elapsed = self.chef1.get_endLight()-self.chef1.get_stLight()
        # 	if elapsed >= 5.00:
        # 		self.chef1.close_Light()
        # 		self.light_mask2= pg.transform.scale(self.light_mask2,LIGHT_RS)
        # 		self.light_rect2=self.light_mask2.get_rect()

        self.light_rect1.center = (self.chef2.get_center()[0] - 100,
                                   self.chef2.get_center()[1] - 200)
        # self.light_rect2.center=(self.chef1.get_center()[0]-200,self.chef1.get_center()[1]-200)
        self.fog.blit(self.light_mask1, self.light_rect1)
        # self.fog.blit(self.light_mask2,self.light_rect2)
        self.screen.blit(self.fog, (100, 200), special_flags=pg.BLEND_MULT)

    def draw(self):
        self.screen.blit(self.background, [100, 200])
        self.screen.blit(self.right_margin, [900, 200])
        self.screen.blit(self.door, [-100, 200])
        self.screen.blit(self.board, [0, 0])
        self.all_sprites.draw(self.screen)
        #text to print
        if self.chef2.get_Light():
            t2 = 5.00 - self.chef2.get_endLight() + self.chef2.get_stLight()
            text_Light2 = str("%.1f" % t2)
        else:
            text_Light2 = 'No'

        # if self.chef1.get_Light():
        # 	t1 = 5.00-self.chef1.get_endLight()+self.chef1.get_stLight()
        # 	text_Light1 = str("%.1f" % t1)
        # else:
        # 	text_Light1 = 'No'

        if self.chef2.get_speed():
            t4 = 5.00 - self.chef2.get_endSpeed() + self.chef2.get_stSpeed()
            text_Speed2 = str("%.1f" % t4)
        else:
            text_Speed2 = 'No'

        if self.chef1.get_speed():
            t3 = 5.00 - self.chef1.get_endSpeed() + self.chef1.get_stSpeed()
            text_Speed1 = str("%.1f" % t3)
        else:
            text_Speed1 = 'No'

        draw_text(self.screen, str(self.level), 55, 550, 40)  #level
        draw_text(self.screen, str(self.chef2.get_cabbage()), 25, 100,
                  85)  #c2 cabbage
        draw_text(self.screen, str(self.chef1.get_cabbage()), 25, 810,
                  85)  #c1 cabbage
        draw_text(self.screen, str(self.chef2.get_life()), 25, 100,
                  127)  #c2 life
        draw_text(self.screen, str(self.chef1.get_life()), 25, 810,
                  127)  #c1 life
        draw_text(self.screen, str(self.chef2.get_point()), 40, 380,
                  130)  #c2 score
        draw_text(self.screen, str(self.chef1.get_point()), 40, 600,
                  130)  #c1 score
        draw_text(self.screen, str(self.chef2.get_superbullet()), 25, 225,
                  127)  #c2 superbullet
        draw_text(self.screen, str(self.chef1.get_superbullet()), 25, 930,
                  127)  #c1 superbullet
        draw_text(self.screen, text_Speed2, 25, 100, 167)  #c2 speed up
        draw_text(self.screen, text_Speed1, 25, 810, 167)  #c1 speed up
        draw_text(self.screen, text_Light2, 25, 225, 85)  #c2 light up
        draw_text(self.screen, '???', 25, 930, 85)  #c1 light up

        if self.level > 2:
            self.makefog()
        pg.display.update()

    def get_block(self, x, y):
        for bl in self.all_blocks:
            if bl.get_x() == x and bl.get_y() == y:
                return bl

    def show_start_screen(self):
        pg.mixer.music.load('song2.wav')
        pg.mixer.music.play(-1)
        background = pg.image.load('startscreen.png')
        self.screen.blit(background, [0, 0])
        pg.display.update()

        click = False
        # waiting = True
        #click = pg.mouse.get_pressed()
        while self.waiting:
            if click == False:
                lc.handle_timeout(10)
                for event in pg.event.get():
                    if event.type == pg.QUIT:
                        pg.quit()
                    mouse = pg.mouse.get_pos()
                    if 700 < mouse[0] < 800 and 600 < mouse[1] < 850:
                        background = pg.image.load(
                            'startscreen-select-play.png')
                        self.screen.blit(background, [0, 0])
                        if event.type == pg.MOUSEBUTTONDOWN:
                            click = True

                            start = input_t()
                            start.motion = "start"
                            start.player = 2
                            print("client2 click")
                            lc.publish("TO SERVER", start.encode())

                            #waiting = False
                    elif 212 < mouse[0] < 314 and 862 < mouse[1] < 964:
                        background = pg.image.load(
                            'startscreen-select-tut.png')
                        self.screen.blit(background, [0, 0])
                        if event.type == pg.MOUSEBUTTONDOWN:
                            self.tutorial()

                            #waiting = False
                    elif 25 < mouse[0] < 145 and 855 < mouse[1] < 975:
                        background = pg.image.load(
                            'startscreen-select-creds.png')
                        self.screen.blit(background, [0, 0])
                        if event.type == pg.MOUSEBUTTONDOWN:
                            self.show_credit_screen()
                    else:
                        background = pg.image.load('startscreen.png')
                        self.screen.blit(background, [0, 0])
                    pg.display.update()
            else:
                lc.handle_timeout(10)
                print("clicked")
                print(self.background)
                background = pg.image.load("missing1.png")
                self.screen.blit(background, [0, 0])
                pg.display.update()
                for event in pg.event.get():
                    if event.type == pg.QUIT:
                        pg.quit()

    def show_credit_screen(self):
        print("show credit screen")
        background = pg.image.load('credit.png')
        self.screen.blit(background, [0, 0])
        pg.display.update()
        credit = True
        while credit:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    pg.quit()
                mouse = pg.mouse.get_pos()
                if 735 < mouse[0] < 1000 and 915 < mouse[1] < 1000:
                    background = pg.image.load("credit-select-back.png")
                    self.screen.blit(background, [0, 0])
                    if event.type == pg.MOUSEBUTTONDOWN:
                        credit = False
                        self.show_start_screen()
                else:
                    background = pg.image.load('credit.png')
                    self.screen.blit(background, [0, 0])
                pg.display.update()

    def show_end_screen(self):
        if self.chef1.get_point() > self.chef2.get_point():
            background = pg.image.load("lose1.png")
        elif self.chef1.get_point() < self.chef2.get_point():
            background = pg.image.load("player1_end.png")
        else:
            #JUST TEMPORARY
            background = pg.image.load("tie.png")
        self.screen.blit(background, [0, 0])
        pg.display.update()
        while True:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    pg.quit()
                mouse = pg.mouse.get_pos()
                if event.type == pg.MOUSEBUTTONDOWN:
                    if 750 < mouse[0] < 1000 and 920 < mouse[1] < 1000:
                        pg.quit()

    def tutorial(self):
        title = pg.image.load("story title.PNG")
        block1 = Block(7, 6, 1)
        block2 = Block(7, 7, 3, False, 1)
        block3 = Block(7, 8, 3, False, 3)

        blocks = pg.sprite.Group()
        bonus = pg.sprite.Group()
        all_sprites = pg.sprite.Group()
        blocks.add(block1)
        blocks.add(block2)
        blocks.add(block3)
        all_sprites.add(block1)
        all_sprites.add(block2)
        all_sprites.add(block3)

        chef_test = Chef(10, 10, chef2_moves, True, self.all_bullets,
                         all_sprites, self.all_superbullets, blocks)
        all_sprites.add(chef_test)

        click = 0

        tutorial = True
        while tutorial:
            print(click)
            #self.screen.blit(skip, [100, 100])
            self.screen.blit(self.background, [100, 200])
            self.screen.blit(title, [0, 0])
            self.screen.blit(self.right_margin, [900, 200])
            self.screen.blit(self.door, [-100, 200])
            #self.screen.blit(self.board, [0, 0])

            picture_blit = pg.image.load(tutorial_graphics[click])
            if click == 0:
                self.screen.blit(picture_blit, [100, 200])
            elif click == 1:
                self.screen.blit(picture_blit, [100, 200])
                tutorial1 = pg.image.load('tutorial1.PNG')
                self.screen.blit(tutorial1, [0, 0])
            else:
                self.screen.blit(picture_blit, [0, 0])
                all_sprites.draw(self.screen)
            skip = pg.image.load("continue.png")
            skip.set_colorkey(WHITE)
            self.screen.blit(skip, [700, 930])

            self.clock.tick(FPS)
            key = pg.key.get_pressed()
            judgeTime = time.time()
            if key[pg.K_LEFT]:
                if judgeTime - self.pressTime > 0.05:
                    chef_test.move_left()
                    self.pressTime = time.time()
            elif key[pg.K_RIGHT]:
                if judgeTime - self.pressTime > 0.05:
                    chef_test.move_right()
                    self.pressTime = time.time()
            elif key[pg.K_UP]:
                if judgeTime - self.pressTime > 0.05:
                    chef_test.move_forward()
                    self.pressTime = time.time()
            elif key[pg.K_DOWN]:
                if judgeTime - self.pressTime > 0.05:
                    chef_test.move_backward()
                    self.pressTime = time.time()
            elif key[pg.K_SPACE]:
                if judgeTime - self.pressTime > 0.5:
                    chef_test.shoot()
                    self.pressTime = time.time()

            for event in pg.event.get():
                mouse = pg.mouse.get_pos()
                if event.type == pg.QUIT:
                    pg.quit()

                if event.type == pg.MOUSEBUTTONDOWN:
                    if 700 < mouse[0] < 1000 and 930 < mouse[1] < 1000:
                        click += 1
                        if click == 4:
                            #if 100 < mouse[0] < 350 and 100 < mouse[1] < 185:
                            tutorial = False
                            self.show_start_screen()

            hit_block = pg.sprite.groupcollide(blocks, self.all_bullets, False,
                                               True)
            for bl in hit_block.keys():
                bl.decrementHealth()
                if bl.getHealth() == 0:
                    if bl.getBonus() == 0:
                        bl.kill()
                        sound = pg.mixer.Sound('blockcrack.wav')
                        sound.play()
                    else:
                        sound = pg.mixer.Sound('powerupblock.wav')
                        sound.play()
                        bonus.add(bl)
                        blocks.remove(bl)
            hit_bonus = pg.sprite.spritecollide(chef_test, bonus, True)

            all_sprites.update()

            pg.display.update()


# for i in range (5):

# 	g1 = Game(i+1)
# 	lc.subscribe("SERVER_OUTPUT", get_my_handler(g1))
# 	g1.run()
# 	pg.quit()

# for i in range (5):
# 	g1 = Game(i+1)
# 	subscription = lc.subscribe("SERVER_OUTPUT", get_my_handler(g1))
# 	g1.show_start_screen()
# 	while g1.running:
# 		g1.run()
# 		g1.show_go_screen()
# 	lc.unsubscribe(subscription)
# pg.quit()

    def show_transition_screen(self):
        self.waiting = True
        if self.level == 2:
            background = pg.image.load("darktransition.png")
            background = pg.transform.scale(background, (1000, 1000))
            self.screen.blit(background, [0, 0])
            skip = pg.image.load("continue.PNG")
            self.screen.blit(skip, [700, 930])
        else:
            background = pg.image.load('transition.png')
            self.screen.blit(background, [0, 0])
        if not self.level == 2:
            draw_text(self.screen, str(self.level), 55, 550, 375)
            draw_text(self.screen, str(self.chef2.get_point()), 40, 380,
                      465)  #c2 score
            draw_text(self.screen, str(self.chef1.get_point()), 40, 600,
                      465)  #c1 score
        pg.display.update()
        while self.waiting:
            lc.handle_timeout(1)
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    pg.quit()
                mouse = pg.mouse.get_pos()
                if event.type == pg.MOUSEBUTTONDOWN:
                    if 700 < mouse[0] < 1000 and 900 < mouse[1] < 1000:
                        background = pg.image.load("missing2.png")
                        self.screen.blit(background, [0, 0])
                        pg.display.update()
                        next = input_t()
                        next.player = 2
                        next.motion = "start"
                        lc.publish("TO SERVER", next.encode())
                        #waiting = False
    def reset_inf(self):
        self.inf1 = ''
        self.inf2 = ''
Beispiel #2
0
class Tutorial:
    def __init__(self):

        self.screen = pg.display.set_mode((WIDTH - 200, HEIGHT))
        #self.background = pg.image.load(backgrounds[level-1])
        self.background = pg.image.load('background.png')
        self.screen.blit(pg.image.load('background.png'), (0, 0))

        pg.display.set_caption("Chef War")
        #self.screen.blit(self.background, [250,250])
        self.clock = pg.time.Clock()
        self.running = True
        self.playing = True
        # groups
        self.all_sprites = pg.sprite.Group()
        self.all_blocks = pg.sprite.Group()
        self.all_bullets = pg.sprite.Group()
        self.all_bonus = pg.sprite.Group()
        self.all_superbullets = pg.sprite.Group()

        self.chef1 = Chef(5, 5, chef1_moves, False, self.all_bullets,
                          self.all_sprites, self.all_superbullets)
        self.chef1.cabbage = 100
        self.all_sprites.add(self.chef1)

        #font variable
        self.font1 = pg.font.Font('caligraphy.ttf', 50)
        self.font2 = pg.font.Font('Organo.ttf', 20)
        self.font3 = pg.font.Font('Arial.ttf', 15)
        self.font4 = pg.font.Font('Arial.ttf', 15)
        self.font5 = pg.font.Font('Organo.ttf', 10)
        self.map = maps[1]

        self.block2 = Block(8, 7, 4, False, 4)
        self.block3 = Block(8, 6, 3, False, 1)
        self.block4 = Block(8, 5, 0, True, 0)

        self.g = g = gm.Game(8)

        self.story_progress = True
        self.story_progress2 = True
        self.story_progress3 = True
        self.story_progress4 = True
        self.story_progress5 = True

    def button(self, msg, x, y, w, h, ic, ac):
        self.mouse = pg.mouse.get_pos()
        self.click = pg.mouse.get_pressed()
        self.screen.blit(pg.image.load('conf.png'), (300, 950))

        if x + w > self.mouse[0] > x and y + h > self.mouse[1] > y:
            self.screen.blit(pg.image.load('conf-select.png'), (300, 950))
            if self.click[0] == 1:
                self.story_progress = False
                self.story2()

    def button2(self, msg, x, y, w, h, ic, ac):
        self.mouse2 = pg.mouse.get_pos()
        self.click2 = pg.mouse.get_pressed()
        if x + w > self.mouse2[0] > x and y + h > self.mouse2[1] > y:
            self.screen.blit(pg.image.load('story2-select-con.png'),
                             (100, 200))
            if self.click2[0] == 1:
                self.story_progress2 = False
                self.players()

    def button3(self, msg, x, y, w, h, ic, ac):
        self.mouse3 = pg.mouse.get_pos()
        self.click3 = pg.mouse.get_pressed()

        self.screen.blit(pg.image.load('conf.png'), (x, y))

        if x + w > self.mouse3[0] > x and y + h > self.mouse3[1] > y:
            self.screen.blit(pg.image.load('conf-select.png'), (x, y))
            if self.click3[0] == 1:
                self.story_progress4 = False
                self.blockex()

    def button4(self, msg, x, y, w, h, ic, ac):
        self.mouse4 = pg.mouse.get_pos()
        self.click4 = pg.mouse.get_pressed()

        self.screen.blit(pg.image.load('bigcon.png'), (x, y))

        if x + w > self.mouse4[0] > x and y + h > self.mouse4[1] > y:
            self.screen.blit(pg.image.load('bigcon-select.png'), (x, y))
            if self.click4[0] == 1:
                self.story_progress3 = False
                self.controls()

    def learnButton(self, msg, x, y, w, h, ic, ac):
        if self.lhold == False:
            self.mousel = pg.mouse.get_pos()
            self.clickl = pg.mouse.get_pressed()
        #pg.draw.rect(self.screen, ac,(x,y,w,h))
        text = self.font2.render(msg, True, (0, 0, 0))
        textRect = text.get_rect()
        textRect.center = ((x + (w / 2)), (y + (h / 2)))
        self.screen.blit(text, textRect)
        if x + w > self.mousel[0] > x and y + h > self.mousel[1] > y:
            if self.clickl[0] == 1:
                #self.lhold = True
                self.story()

    def gameButton(self, msg, x, y, w, h, ic, ac):
        self.mouseg = pg.mouse.get_pos()
        self.clickg = pg.mouse.get_pressed()
        self.screen.blit(pg.image.load('pred.png'), (x, y))
        #pg.draw.rect(self.screen, ac,(x,y,w,h))
        if x + w > self.mouseg[0] > x and y + h > self.mouseg[1] > y:
            self.screen.blit(pg.image.load('pgreen.png'), (x, y))
            if self.clickg[0] == 1:
                self.playing = False
                self.g.run()

    def run(self):
        pg.mixer.music.load('song.wav')
        pg.mixer.music.play(-1)
        while self.playing:
            self.clock.tick(FPS)
            self.events()
            self.update()
            #play the walking sound but will be none if movmt was invalid
            if self.chef1.get_sound() != None:
                #self.chef1.get_sound().play()
                pass

            self.story()

    def update(self):

        hit_block = pg.sprite.groupcollide(self.all_blocks, self.all_bullets,
                                           False, True)
        hit_block2 = pg.sprite.groupcollide(
            self.all_blocks, self.all_superbullets, False,
            False)  #if the block turn into the bonus -> True, False
        shoot_chef1 = pg.sprite.spritecollide(self.chef1, self.all_bullets,
                                              True)
        shoot_chef_1 = pg.sprite.spritecollide(self.chef1,
                                               self.all_superbullets, True)

        if shoot_chef1 or shoot_chef_1:
            self.chef1.is_hit()
            if self.chef1.get_life == 0:
                self.running = False

        for bl in hit_block.keys():
            bl.decrementHealth()
            if bl.getHealth() == 0:
                if bl.getBonus() == 0:
                    bl.kill()
                else:
                    self.all_bonus.add(bl)
                    self.all_blocks.remove(bl)

        for bl in hit_block2.keys():
            bl.setHealth(0)
            if bl.getHealth() == 0:
                if bl.getBonus() == 0:
                    bl.kill()
                else:
                    self.all_bonus.add(bl)
                    self.all_blocks.remove(bl)

        chef1_hit_bonus = pg.sprite.spritecollide(self.chef1, self.all_bonus,
                                                  True)
        for bonus in chef1_hit_bonus:
            if bonus.getBonus() == 1:
                self.chef1.claim_life()
            elif bonus.getBonus() == 2:
                self.chef1.claim_cabbage()
            elif bonus.getBonus() == 4:
                self.chef1.gainSpeed()
            elif bonus.getBonus() == 5:
                self.chef1.claim_superbullet()
            elif bonus.getBonus() == 6:
                self.chef1.gainLight()
            else:
                self.chef1.claim_point()

        chef1_old_x = self.chef1.get_x()
        chef1_old_y = self.chef1.get_y()

        self.all_sprites.update()

        chef1_collide_block = pg.sprite.spritecollide(self.chef1,
                                                      self.all_blocks, False)
        if chef1_collide_block:
            self.chef1.set_x(chef1_old_x)
            self.chef1.set_y(chef1_old_y)

    # 			self.chef1.set_sound(None)

        chef1_old_x = self.chef1.get_x()
        chef1_old_y = self.chef1.get_y()

        self.all_sprites.update()

        chef1_collide_block = pg.sprite.spritecollide(self.chef1,
                                                      self.all_blocks, False)
        if chef1_collide_block:
            self.chef1.set_x(chef1_old_x)
            self.chef1.set_y(chef1_old_y)
            self.chef1.set_sound(None)

    def events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                print("Quit")
                if self.playing:
                    self.playing = False
                self.running = False

    def draw(self):

        # create a text suface object for drawing text
        text = self.font1.render('Chef War', True, (0, 0, 255))
        #self.screen.blit(pg.image.load('sushibar.png'),(400,130))
        textRect = text.get_rect()

        # set the center of the rectangular object.
        textRect.center = (400, 100)

        self.screen.blit(pg.image.load('left_margin.png'), (0, 0))
        self.screen.blit(pg.image.load('right_margin.png'), (800, 0))

        self.screen.blit(text, textRect)

        self.screen.blit(pg.image.load('2-R3.png'), (250, 75))
        self.screen.blit(pg.image.load('1-L2.png'), (620, 75))

        self.screen.blit(pg.image.load('sushi1.png'), (325, 125))
        self.screen.blit(pg.image.load('sushi2.png'), (475, 125))

        pg.display.update()

        self.learnButton("Learn to Play", 250, 500, 300, 50, (0, 0, 0),
                         (255, 0, 0))
        pg.display.update()

    def story(self):
        if self.story_progress == True:
            self.screen.blit(pg.image.load('story title.png'), (0, 0))
            self.screen.blit(pg.image.load('left_margin.png'), (0, 200))
            self.screen.blit(pg.image.load('right_margin.png'), (800, 200))
            self.screen.blit(pg.image.load('story1.png'), (150, 200))
            self.button("next", 350, 950, 200, 50, (0, 0, 0), (194, 81, 77))
            pg.display.update()
        else:
            self.story2()

        #self.screen.fill(pg.Color("black"))
    def story2(self):
        if self.story_progress2 == True:
            self.screen.blit(pg.image.load('story title.png'), (0, 0))
            self.screen.blit(pg.image.load('left_margin.png'), (0, 200))
            self.screen.blit(pg.image.load('right_margin.png'), (800, 200))
            self.screen.blit(pg.image.load('story2.png'), (100, 200))
            self.button2("next", 500, 900, 300, 60, (0, 0, 0), (194, 81, 77))
            pg.display.update()
        else:
            self.players()
        #self.screen.fill(pg.Color("black"))

    def controls(self):
        if self.story_progress4 == True:
            #clear the screen
            self.screen.blit(pg.image.load('background.png'), (200, 200))
            self.screen.blit(pg.image.load('left_margin.png'), (0, 200))
            self.screen.blit(pg.image.load('right_margin.png'), (800, 200))
            self.screen.blit(pg.image.load('p1.png'), (0, 0))
            self.screen.blit(pg.image.load('p2.png'), (0, 600))
            self.button3("next", 793, 850, 200, 50, (0, 0, 0), (194, 81, 77))
            pg.display.update()
        else:
            self.blockex()

    def players(self):
        if self.story_progress3 == True:
            #clear the screen
            self.screen.blit(pg.image.load('players.png'), (5, 5))
            self.screen.blit(pg.image.load('background.png'), (200, 200))
            self.screen.blit(pg.image.load('left_margin.png'), (0, 200))
            self.screen.blit(pg.image.load('right_margin.png'), (800, 200))
            #self.screen.blit(pg.image.load('fill.png'),(0,200))
            self.button4("next", 250, 450, 500, 100, (0, 0, 0), (194, 81, 77))
            pg.display.update()
        else:
            self.controls()

    def blockex(self):
        if self.story_progress5 == True:
            self.screen.blit(pg.image.load('bonus.png'), (0, 0))
            self.screen.blit(pg.image.load('background.png'), (200, 200))
            self.screen.blit(pg.image.load('left_margin.png'), (0, 200))
            self.screen.blit(pg.image.load('right_margin.png'), (800, 200))
            self.all_sprites.draw(self.screen)
            #self.screen.blit(pg.image.load('sushibar.png'),(-10,800))

            self.all_blocks.add(self.block2)
            self.all_blocks.add(self.block3)
            self.all_blocks.add(self.block4)

            self.all_sprites.add(self.block2)
            self.all_sprites.add(self.block3)
            self.all_sprites.add(self.block4)
            self.all_sprites.update()

            self.gameButton("play game!", 860, 325, 100, 190, (0, 0, 0),
                            (255, 0, 0))
            pg.display.update()