示例#1
0
class Cutscene:
    def __init__(self, screen=None):
        self.cutscenes = []
        for i in range(8):
            self.cutscenes.append(pygame.image.load(data.filepath("scene" + str(i + 1) + ".png")))
        if screen is None:
            pygame.init()
            self.screen = pygame.display.set_mode((Constants.SCREEN_WIDTH, Constants.SCREEN_HEIGHT))
        else:
            self.screen = screen
        self.clock = pygame.time.Clock()
        self.running = True
        
        self.font = pygame.font.Font(None, 24)
        
        self.music_player = MusicPlayer("palnap4.ogg")
            
    def display(self, number):
        self.music_player.play()
        done = False
        while not done:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.blit(self.cutscenes[number], (0, 0))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#2
0
class TitleScreen:
    """ Just a stage clear intermission screen. Nothing at all
        fancy here. """
    def __init__(self, screen=None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True

        self.music_player = MusicPlayer("palnap4.ogg")

        self.clock = pygame.time.Clock()

        self.choice = 0

    def main(self):
        """ Display the screen and a little bit of text at the bottom
            of the screen. """
        self.music_player.play()
        xasm_logo = pygame.image.load(data.filepath("xasm.png"))
        title_screen = pygame.image.load(data.filepath("title.png"))
        font = pygame.font.Font(None, 24)
        start_game = False
        alpha = 0
        fade_in = True

        logo_alpha = 0

        skip = False

        while logo_alpha < 255 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha += 3
            pygame.display.flip()
            self.clock.tick(30)

        while logo_alpha > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha -= 3
            pygame.display.flip()
            self.clock.tick(30)

        skip = False
        counter = 50
        while counter > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            text = font.render("Dedicated to the memory of Phoebe...", 1,
                               (255, 255, 255))
            text2 = font.render("We'll miss you...", 1, (255, 255, 255))
            self.screen.blit(text, (150, 300))
            self.screen.blit(text2, (225, 325))
            pygame.display.flip()
            self.clock.tick(30)
            counter -= 1

        choice = 0

        while not start_game:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.choice -= 1
                    elif event.key == pygame.K_DOWN:
                        self.choice += 1
                    elif event.key == pygame.K_RETURN:
                        start_game = True
                    elif event.key == pygame.K_ESCAPE:
                        self.running = False
                        return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            if self.choice < 0:
                self.choice = 1
            elif self.choice > 1:
                self.choice = 0
            new_game = "[ new game ]"
            continue_game = "[ continue game ]"
            if self.choice == 0:
                new_game = "> " + new_game
            elif self.choice == 1:
                continue_game = "> " + continue_game
            # There's some weird-ass PyGame font bug in 1.7, so the text is
            # ant-aliased.
            text = font.render(new_game, 1, (5, 231, 96))
            text2 = font.render(continue_game, 1, (5, 231, 96))
            self.screen.blit(title_screen, (0, 0))
            self.screen.blit(text, (200, 525))
            self.screen.blit(text2, (200, 550))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#3
0
class Alarm:
    def __init__(self):
        self.hour = None
        self.minute = None
        self.time_window_hours = ConfigManager.get_config()['hours_to_check']
        self.time_window_minutes = ConfigManager.get_config(
        )['minutes_to_check']

        self.music_player = MusicPlayer()
        self.camera = Camera()
        self.model = Model()

        # for storing images
        self.counter = 0

    def set_alarm(self, hour, minute):
        self.hour = hour
        self.minute = minute
        self.stop_alarm()

    def verify_alarm(self):
        d = datetime.now()
        hour = int(d.hour)
        minute = int(d.minute)

        if self.in_time_window(hour, minute):
            is_present, image = self.verify_present()
            if is_present:
                self.launch_alarm()
            else:
                self.stop_alarm()

            self.store_image(image)

    def verify_present(self):
        image = Camera.capture_screenshot()
        predictable_image = prepare_for_prediction(image)
        prediction = self.model.predict(predictable_image)

        print("Predicted: {}".format(prediction))
        return prediction < 0.5, image

    def in_time_window(self, curr_hour, curr_minute):
        if self.hour is None or self.minute is None:
            return False

        if curr_hour is None or curr_minute is None:
            d = datetime.now()
            curr_hour = int(d.hour)
            curr_minute = int(d.minute)

        # Compare hour
        after_alarm = self.hour < curr_hour

        # CCompare minute if needed
        if not after_alarm:
            after_alarm = self.hour == curr_hour and \
                          self.minute <= curr_minute

        target_hour = self.hour + self.time_window_hours
        target_minute = self.minute + self.time_window_minutes

        # Compare hour
        before_wind_end = curr_hour < target_hour

        # Compare minute if needed
        if not before_wind_end:
            before_wind_end = curr_hour == target_hour and \
                              curr_minute <= target_minute

        return after_alarm and before_wind_end

    def launch_alarm(self):
        self.music_player.play()

    def stop_alarm(self):
        self.music_player.stop()

    def store_image(self, image):
        # activates once every 3 iterations
        self.counter = self.counter + 1
        if self.counter >= 2:
            self.counter = 0
            Camera.save_image(image)
示例#4
0
class TitleScreen:
    """ Just a stage clear intermission screen. Nothing at all
        fancy here. """
    def __init__(self, screen = None):
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen
        self.running = True
        
        self.music_player = MusicPlayer("palnap4.ogg")
        
        self.clock = pygame.time.Clock()
        
        self.choice = 0

    def main(self):
        """ Display the screen and a little bit of text at the bottom
            of the screen. """
        self.music_player.play()
        xasm_logo = pygame.image.load(data.filepath("xasm.png"))
        title_screen = pygame.image.load(data.filepath("title.png"))
        font = pygame.font.Font(None, 24)
        start_game = False
        alpha = 0
        fade_in = True
        
        logo_alpha = 0
        
        skip = False
        
        while logo_alpha < 255 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha += 3
            pygame.display.flip()
            self.clock.tick(30)
        
        while logo_alpha > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            xasm_logo.set_alpha(logo_alpha)
            self.screen.blit(xasm_logo, (0, 0))
            logo_alpha -= 3
            pygame.display.flip()
            self.clock.tick(30)
        
        skip = False
        counter = 50
        while counter > 0 and not skip:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    skip = True
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            self.screen.fill((0, 0, 0))
            text = font.render("Dedicated to the memory of Phoebe...", 1, (255, 255, 255))
            text2 = font.render("We'll miss you...", 1, (255, 255, 255))
            self.screen.blit(text, (150, 300))
            self.screen.blit(text2, (225, 325))
            pygame.display.flip()
            self.clock.tick(30)
            counter -= 1
            
        choice = 0
        
        while not start_game:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.choice -= 1
                    elif event.key == pygame.K_DOWN:
                        self.choice += 1
                    elif event.key == pygame.K_RETURN:
                        start_game = True
                    elif event.key == pygame.K_ESCAPE:
                        self.running = False
                        return
                elif event.type == pygame.QUIT:
                    self.running = False
                    return
            if self.choice < 0:
                self.choice = 1
            elif self.choice > 1:
                self.choice = 0
            new_game = "[ new game ]"
            continue_game = "[ continue game ]"
            if self.choice == 0:
                new_game = "> " + new_game
            elif self.choice == 1:
                continue_game = "> " + continue_game
            # There's some weird-ass PyGame font bug in 1.7, so the text is
            # ant-aliased.
            text = font.render(new_game, 1, (5, 231, 96))
            text2 = font.render(continue_game, 1, (5, 231, 96))
            self.screen.blit(title_screen, (0, 0))
            self.screen.blit(text, (200, 525))
            self.screen.blit(text2, (200, 550))
            pygame.display.flip()
            self.clock.tick(30)
        self.music_player.stop()
示例#5
0
class EscortEngine:
    """ This is the main engine to be used in the game. This is the
        Lemmings-esque escort engine. Call set_stage(#) before calling main(). """
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"

        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player

    def set_stage(self, stage_number):
        """ Set the current stage to the specified number and load the
            appropriate images. In addition, set the starting information
            for the player. Then, set the mask/image to the proper images
            and blit the background to the screen. """
        if stage_number == 1:
            self.background = pygame.image.load(data.filepath("stage8.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage8_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 150)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 2:
            self.background = pygame.image.load(data.filepath("stage1.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage1_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 525)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 3:
            self.background = pygame.image.load(data.filepath("stage5.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage5_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 500)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 4:
            self.background = pygame.image.load(data.filepath("stage4.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage4_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 5:
            self.background = pygame.image.load(data.filepath("stage2.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage2_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (25, 100)

            self.music_player.load("alma_mater.ogg")
        elif stage_number == 6:
            self.background = pygame.image.load(data.filepath("stage10.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage10_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 7:
            self.background = pygame.image.load(data.filepath("stage3.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage3_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 8:
            self.background = pygame.image.load(data.filepath("stage13.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage13_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 9:
            self.background = pygame.image.load(data.filepath("stage6.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage6_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 225)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 10:
            self.background = pygame.image.load(data.filepath("stage7.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage7_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 300)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 11:
            self.background = pygame.image.load(data.filepath("stage14.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage14_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("rejects.ogg")
        elif stage_number == 12:
            self.background = pygame.image.load(data.filepath("stage9.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage9_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 450)

            self.music_player.load("rejects.ogg")
        elif stage_number == 13:
            self.background = pygame.image.load(data.filepath("stage12.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage12_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)

            self.music_player.load("rejects.ogg")
        elif stage_number == 14:
            self.background = pygame.image.load(data.filepath("stage11.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage11_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)

            self.music_player.load("rejects.ogg")
        elif stage_number == 15:
            self.background = pygame.image.load(data.filepath("stage15.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage15_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (305, 311)

            self.music_player.load("rejects.ogg")
        elif stage_number == 16:
            self.background = pygame.image.load(data.filepath("stage16.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage16_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 17:
            self.background = pygame.image.load(data.filepath("stage17.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage17_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 125)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 18:
            self.background = pygame.image.load(data.filepath("stage18.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage18_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 140)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False,
                                                    True)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 19:
            self.background = pygame.image.load(data.filepath("stage19.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage19_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 410)

            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 20:
            self.background = pygame.image.load(data.filepath("stage20.png"))
            self.original_mask = pygame.image.load(
                data.filepath("stage20_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (75, 110)

            self.music_player.load("manna_and_me.ogg")
        # All of that is done; now set up the initial environment to have the
        # player wander around in.
        self.mask = pygame.surface.Surface(self.original_mask.get_rect().size)
        self.mask.blit(self.original_mask, (0, 0))
        self.screen.blit(self.background, (0, 0))

    def grab_screenshot(self):
        """ Take a screenshot of the current screen. """
        pygame.image.save(self.screen,
                          "screenshot" + str(self.screenshot_counter) + ".bmp")
        self.screenshot_counter += 1

    def main(self):
        """ The main game loop. Be sure to call set_stage(#) first! """
        # Initialize our player sprite group
        player_group = pygame.sprite.RenderPlain(self.girl)

        # Initialize all of our "wrenches", or in-game draggable objects
        wrenches = []
        wrench_group = GobjectGroup()
        for i in range(Constants.START_BLOCKS):
            wrenches.append(WrenchBlock())
            wrench_group.add(wrenches[i])

        self.music_player.play()

        # Game loop!
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_s:
                        self.grab_screenshot()
                    elif event.key == pygame.K_ESCAPE:
                        self.state = "exit"
                        self.running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        wrench_group.handle_click(True)
                elif event.type == pygame.MOUSEBUTTONUP:
                    if event.button == 1:
                        wrench_group.handle_click(False)
                elif event.type == pygame.QUIT:
                    self.running = False

            # Clear all of the drawn sprites
            player_group.clear(self.screen, self.background)
            wrench_group.clear(self.screen, self.background)

            # This special little bit right here is for handling masks with the
            # draggable objects.
            wrench_group.clear(self.mask, self.original_mask)
            wrench_group.update()
            wrench_group.draw_to_mask(self.mask)

            # Update the player
            player_group.update(self.mask)

            # Draw the player and the wrenches to the screen
            player_group.draw(self.screen)
            wrench_group.draw(self.screen)

            pygame.display.flip()
            self.clock.tick(Constants.MAX_FPS)

            # If we've hit a condition to end the game, do so.
            if self.girl.done:
                self.girl.done = False
                self.state = "victory"
                self.running = False
            elif not self.girl.living:
                self.girl.living = True
                self.state = "failure"
                self.running = False

        self.music_player.stop()
示例#6
0
class EscortEngine:
    """ This is the main engine to be used in the game. This is the
        Lemmings-esque escort engine. Call set_stage(#) before calling main(). """
    def __init__(self, screen=None):
        # See if we've been given a screen to use
        if screen is None:
            self.screen = pygame.display.set_mode((600, 600))
        else:
            self.screen = screen

        self.running = True
        self.clock = pygame.time.Clock()

        # Gots to have us a background and a walkable mask
        self.background = None
        self.mask = None

        # If anyone takes screenshots, they can do so with this!
        self.screenshot_counter = 0

        # Initialize our reusable robotic girl
        self.girl = Girl()

        # What is the current state of our game
        self.state = "Running"
        
        # Load our music player
        self.music_player = MusicPlayer()
        self.sound_player = SoundPlayer()
        self.girl.sound_player = self.sound_player

    def set_stage(self, stage_number):
        """ Set the current stage to the specified number and load the
            appropriate images. In addition, set the starting information
            for the player. Then, set the mask/image to the proper images
            and blit the background to the screen. """
        if stage_number == 1:
            self.background = pygame.image.load(data.filepath("stage8.png"))
            self.original_mask = pygame.image.load(data.filepath("stage8_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 150)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 2:
            self.background = pygame.image.load(data.filepath("stage1.png"))
            self.original_mask = pygame.image.load(data.filepath("stage1_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 525)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 3:
            self.background = pygame.image.load(data.filepath("stage5.png"))
            self.original_mask = pygame.image.load(data.filepath("stage5_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 500)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 4:
            self.background = pygame.image.load(data.filepath("stage4.png"))
            self.original_mask = pygame.image.load(data.filepath("stage4_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 5:
            self.background = pygame.image.load(data.filepath("stage2.png"))
            self.original_mask = pygame.image.load(data.filepath("stage2_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (25, 100)
            
            self.music_player.load("alma_mater.ogg")
        elif stage_number == 6:
            self.background = pygame.image.load(data.filepath("stage10.png"))
            self.original_mask = pygame.image.load(data.filepath("stage10_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 7:
            self.background = pygame.image.load(data.filepath("stage3.png"))
            self.original_mask = pygame.image.load(data.filepath("stage3_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 100)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 8:
            self.background = pygame.image.load(data.filepath("stage13.png"))
            self.original_mask = pygame.image.load(data.filepath("stage13_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 9:
            self.background = pygame.image.load(data.filepath("stage6.png"))
            self.original_mask = pygame.image.load(data.filepath("stage6_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 225)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 10:
            self.background = pygame.image.load(data.filepath("stage7.png"))
            self.original_mask = pygame.image.load(data.filepath("stage7_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 300)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("jam_box_public.ogg")
        elif stage_number == 11:
            self.background = pygame.image.load(data.filepath("stage14.png"))
            self.original_mask = pygame.image.load(data.filepath("stage14_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 135)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 12:
            self.background = pygame.image.load(data.filepath("stage9.png"))
            self.original_mask = pygame.image.load(data.filepath("stage9_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 450)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 13:
            self.background = pygame.image.load(data.filepath("stage12.png"))
            self.original_mask = pygame.image.load(data.filepath("stage12_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 14:
            self.background = pygame.image.load(data.filepath("stage11.png"))
            self.original_mask = pygame.image.load(data.filepath("stage11_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 75)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 15:
            self.background = pygame.image.load(data.filepath("stage15.png"))
            self.original_mask = pygame.image.load(data.filepath("stage15_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (305, 311)
            
            self.music_player.load("rejects.ogg")
        elif stage_number == 16:
            self.background = pygame.image.load(data.filepath("stage16.png"))
            self.original_mask = pygame.image.load(data.filepath("stage16_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 475)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 17:
            self.background = pygame.image.load(data.filepath("stage17.png"))
            self.original_mask = pygame.image.load(data.filepath("stage17_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 125)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 18:
            self.background = pygame.image.load(data.filepath("stage18.png"))
            self.original_mask = pygame.image.load(data.filepath("stage18_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 140)
            self.girl.modifier = Constants.ANTIGRAVITY
            self.girl.image = pygame.transform.flip(self.girl.image, False, True)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 19:
            self.background = pygame.image.load(data.filepath("stage19.png"))
            self.original_mask = pygame.image.load(data.filepath("stage19_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (0, 410)
            
            self.music_player.load("manna_and_me.ogg")
        elif stage_number == 20:
            self.background = pygame.image.load(data.filepath("stage20.png"))
            self.original_mask = pygame.image.load(data.filepath("stage20_mask.png"))
            self.girl.direction = 0
            self.girl.rect.topleft = (75, 110)
            
            self.music_player.load("manna_and_me.ogg")
        # All of that is done; now set up the initial environment to have the
        # player wander around in.
        self.mask = pygame.surface.Surface(self.original_mask.get_rect().size)
        self.mask.blit(self.original_mask, (0, 0))
        self.screen.blit(self.background, (0, 0))

    def grab_screenshot(self):
        """ Take a screenshot of the current screen. """
        pygame.image.save(self.screen, "screenshot" + str(self.screenshot_counter) + ".bmp")
        self.screenshot_counter += 1

    def main(self):
        """ The main game loop. Be sure to call set_stage(#) first! """
        # Initialize our player sprite group
        player_group = pygame.sprite.RenderPlain(self.girl)

        # Initialize all of our "wrenches", or in-game draggable objects
        wrenches = []
        wrench_group = GobjectGroup()
        for i in range(Constants.START_BLOCKS):
            wrenches.append(WrenchBlock())
            wrench_group.add(wrenches[i])
            
        self.music_player.play()

        # Game loop!
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_s:
                        self.grab_screenshot()
                    elif event.key == pygame.K_ESCAPE:
                        self.state = "exit"
                        self.running = False
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:
                        wrench_group.handle_click(True)
                elif event.type == pygame.MOUSEBUTTONUP:
                    if event.button == 1:
                        wrench_group.handle_click(False)
                elif event.type == pygame.QUIT:
                    self.running = False

            # Clear all of the drawn sprites
            player_group.clear(self.screen, self.background)
            wrench_group.clear(self.screen, self.background)

            # This special little bit right here is for handling masks with the
            # draggable objects.
            wrench_group.clear(self.mask, self.original_mask)
            wrench_group.update()
            wrench_group.draw_to_mask(self.mask)

            # Update the player
            player_group.update(self.mask)

            # Draw the player and the wrenches to the screen
            player_group.draw(self.screen)
            wrench_group.draw(self.screen)

            pygame.display.flip()
            self.clock.tick(Constants.MAX_FPS)

            # If we've hit a condition to end the game, do so.
            if self.girl.done:
                self.girl.done = False
                self.state = "victory"
                self.running = False
            elif not self.girl.living:
                self.girl.living = True
                self.state = "failure"
                self.running = False

        self.music_player.stop()
示例#7
0
class AlarmWorker(Worker):
    def __init__(self, holder):
        super().__init__(holder)
        self._config = Config()
        self._player = MusicPlayer()
        self._load_alarms()
        self._time_pattern = re.compile('^([012]\d):(\d\d)$')
        self._old_time_str = ''
        self._alarm_is_playing = False

    def on_connect(self, client, userdata, flags):
        super().on_connect(client, userdata, flags)
        client.subscribe(ALARM_TOPIC_SUBSCRIBE)

    def on_message(self, client, userdata, msg):
        super().on_message(client, userdata, msg)

        payload = msg.payload.decode('UTF-8')

        if msg.topic.startswith(ALARM_TOPIC_ROOT):
            command = msg.topic.rsplit("/", 1)[-1]
            if command == 'add':
                alarm_time = payload
                if alarm_time != '':
                    rst = self._time_pattern.match(alarm_time)
                    if rst is not None:
                        hour = int(rst.group(1))
                        minute = int(rst.group(2))
                        if hour < 24 and minute < 60:
                            alarm = self._find_alarm(alarm_time)
                            if alarm is None:
                                self._alarms.append(Alarm(alarm_time))
                            else:
                                alarm.enable()
                            self._save_alarms()
            elif command == 'stop':
                self._stop_alarm()
            elif command == 'delete':
                alarm_time = payload
                alarm = self._find_alarm(alarm_time)
                if alarm is not None:
                    self._alarms.remove(alarm)
                    print('delete:', self._alarms)
                    client.publish(msg.topic + '/reply', payload='ok', qos=1)
                    self._save_alarms()
                else:
                    client.publish(msg.topic + '/reply', payload='Alarm not exist!', qos=1)
            elif command == 'enable':
                alarm_time = payload
                alarm = self._find_alarm(alarm_time)
                if alarm is not None:
                    alarm.enable()
                    client.publish(msg.topic + '/reply', payload='ok', qos=1)
                    self._save_alarms()
                else:
                    client.publish(msg.topic + '/reply', payload='Alarm not exist!', qos=1)
            elif command == 'disable':
                alarm_time = payload
                alarm = self._find_alarm(alarm_time)
                if alarm is not None:
                    alarm.disable()
                    client.publish(msg.topic + '/reply', payload='ok', qos=1)
                    self._save_alarms()
                else:
                    client.publish(msg.topic + '/reply', payload='Alarm not exist!', qos=1)
            elif command == 'list_alarm':
                alarm_list = self._get_alarm_list()
                print('list:', '{}:{}'.format(payload, ','.join(alarm_list)))

                client.publish(msg.topic + '/reply',
                               payload='{}:{}'.format(payload, ','.join(alarm_list)), qos=1, retain=True)
            elif command == 'alarm_at_once':
                self._play_alarm()

    def _play_alarm(self):
        #self._stop_alarm()
        self._holder.pause_music_players(self)
        mp3_list = self._get_alarm_mp3_list()
        mp3_file = random.choice(mp3_list)
        print('Playing: {}'.format(mp3_file))
        self._player.play(mp3_file)
        # 好像这个音量被 music_worker 干扰了
        # 设置不起作用,get_volume 返回 -1!
        #self._player.set_volume(100)
        #print('Alarm volume:', self._player.get_volume())
        self._alarm_is_playing = True

    def _stop_alarm(self):
        self._player.stop()

    def _get_alarm_list(self):
        return sorted(['{}{}'.format(alarm.alarm_time, '' if alarm.enabled else ' 已停用') for alarm in self._alarms])

    def _find_alarm(self, alarm_time):
        for alarm in self._alarms:
            if alarm.alarm_time == alarm_time:
                return alarm
        return None

    def _save_alarms(self):
        with open(ALARM_SAVE_FILE, 'wb') as f:
            pickle.dump(self._alarms, f)

    def _load_alarms(self):
        self._alarms = []
        if os.path.isfile(ALARM_SAVE_FILE):
            try:
                with open(ALARM_SAVE_FILE, 'rb')as f:
                    self._alarms = pickle.load(f)
            except:
                self._alarms = []

    def update(self):
        super().update()
        current_time_str = datetime.now().strftime('%H:%M')

        for alarm in self._alarms:
            if alarm.enabled:
                if alarm.alarm_time != self._old_time_str and alarm.alarm_time == current_time_str:
                    self._play_alarm()
                    break

        self._old_time_str = current_time_str

        if self._alarm_is_playing:
            if not self._player.is_playing():
                self._alarm_is_playing = False
                self._holder.resume_music_players(self)

    def _get_alarm_mp3_list(self):
        mp3_list = glob.glob('{}/*.mp3'.format(self._config.alarm_mp3_folder))
        return mp3_list

    def pause(self):
        self._player.pause()

    def resume(self):
        self._player.resume()
示例#8
0
class Bot(commands.Bot):
    def __init__(
        self,
        spam_time=600,
        spam_messages=[],
        custom_rewards=[],
        tts_engine=None,
        greeting_message=''
    ):
        super().__init__(
            irc_token=os.environ.get('TMI_TOKEN'),
            client_id=os.environ.get('CLIENT_ID'),
            nick=os.environ.get('BOT_NICK'),
            prefix=os.environ.get('BOT_PREFIX'),
            initial_channels=[os.environ.get('CHANNEL')],
            client_secret=os.environ.get('CLIENT_SECRET'))

        self.user_id = os.environ.get('TWITCH_USER_ID')
        self.ignore_users = [self.nick]
        self.only_owner_commands = ['dtts', 'atts']
        self.only_mod_commands = ['vol', 'next', 'stop']
        self.owner_nick = os.environ.get('CHANNEL').replace('#', '').lower()
        self.spam_time = spam_time
        self.spam_messages = spam_messages
        self.chatters_list = []
        self.custom_rewards = custom_rewards
        self.greeting_message = greeting_message

        self.riot_api = RiotAPI()
        self.cats_api = CatsAPI()
        self.tts_engine = tts_engine
        self.music_player = MusicPlayer(os.environ.get('DOWNLOADS_PATH'))
        self.music_dl = MusicDL(download_path=os.environ.get('DOWNLOADS_PATH'))

    async def event_ready(self):
        print(f'{self.nick} is ready')
        if len(self.spam_messages) > 0:
            await self.spam()

    async def event_command_error(self, message, ex):
        if ex.__class__ is CommandNotFound:
            await send_exception(message, 'No se reconoce el comando. Usa !c para ver todos los comandos.')
            return
        await send_exception(message, ex)

    async def event_raw_usernotice(self, channel, tags):
        print(tags)

    async def event_message(self, message):
        try:
            if message.author.name.lower() in self.ignore_users:
                return

            if message.author.name.lower() not in self.chatters_list:
                await message.channel.send(self.greeting_message.format(message.author.name))
                self.chatters_list.append(message.author.name)

            await self.handle_commands(message)
            await self.handle_custom_rewards(message)
        except Exception as ex:
            print(ex)

    async def handle_custom_rewards(self, message):
        try:
            reward_id = message.tags.get("custom-reward-id", None)

            if not reward_id:
                return
            if reward_id not in self.custom_rewards:
                return

            reward_action = self.custom_rewards[reward_id]

            if type(reward_action) == str:
                return

            reward_action(message)
        except Exception as ex:
            print(ex)

    async def spam(self):
        channel = self.get_channel(self.owner_nick)
        while True:
            await asyncio.sleep(self.spam_time)
            selected_message = random.choice(self.spam_messages)
            await channel.send(selected_message)

    @commands.command(name='michi')
    async def cat(self, message):
        try:
            cat_url = self.cats_api.get_random_cat()
            await message.channel.send(f'{message.author.name}, disfruta tu michi {cat_url}')
        except RandomCatException as ex:
            await self.send_exception(message, ex)
        except Exception as ex:
            print(ex)

    @commands.command(name='redes')
    async def social_media(self, message):
        try:
            social_media = [
                'https://twitter.com/Luis_LiraC',
                'https://www.youtube.com/c/luislira',
                'https://www.instagram.com/luislirac/',
            ]
            response = 'Me puedes seguir en:\n' + '\n'.join(social_media)
            await message.channel.send(response)
        except Exception as ex:
            print(ex)

    @commands.command(name='mt')
    async def mastery(self, message):
        try:
            result = self.riot_api.get_mastery_info(message.message.content)
            await message.channel.send(f"""{message.author.name}. 
            Tengo {result['points']} puntos de maestría con {result['name']}.
            La última vez que lo jugué fue en {result['date']}
            """)
        except ChampionException as ex:
            await send_exception(message, ex)
        except NotPlayedException as ex:
            await send_exception(message, ex)
        except Exception as ex:
            print(ex)

    @commands.command(name='c')
    async def cmd(self, message):
        try:
            keys = list(map(lambda c: f'!{c}' if c not in self.only_owner_commands and c not in self.only_mod_commands else '', [
                        *self.commands.keys()]))

            if message.author.is_mod:
                for c in self.only_mod_commands:
                    keys.append(f'{c}')

            response = f'{message.author.name} Puedes usar estos comandos:\n' + \
                '\n'.join(keys)
            await message.channel.send(response)
        except Exception as ex:
            print(ex)

    @commands.command(name='followage')
    async def follow_age(self, message):
        try:
            follower_name = message.author.name.lower()
            followers_list = await self.get_followers(self.user_id)
            follow_date = None

            for follower in followers_list:
                if follower['from_name'].lower() == follower_name:
                    follow_date = follower['followed_at']
                    break

            if follow_date is None:
                await message.channel.send(f'{follower_name}, no me sigues :(')
                return

            utc_date = datetime.strptime(follow_date, '%Y-%m-%dT%H:%M:%SZ')
            date = utc_date.replace(tzinfo=timezone.utc).astimezone(tz=None)
            now = datetime.utcnow().replace(tzinfo=timezone.utc).astimezone(tz=None)
            following_days = (now - date).days

            if following_days == 1 or following_days == 0:
                await message.channel.send(f'{follower_name}, tienes 1 día siguiéndome. Muchas gracias 🥳')
            elif following_days > 1:
                await message.channel.send(f'{follower_name}, tienes {following_days} días siguiéndome. Muchas gracias 🥳')
        except Exception as ex:
            print(ex)

    @commands.command(name='atts')
    async def activate_tts(self, message):
        if self.tts_engine is None:
            return
        if message.author.name.lower() == self.owner_nick:
            self.tts_engine.activate()

    @commands.command(name='dtts')
    async def deactivate_tts(self, message):
        if self.tts_engine is None:
            return
        if message.author.name.lower() == self.owner_nick:
            self.tts_engine.deactivate()

    @commands.command(name='bonk')
    async def bonk(self, message):
        playsound('./sounds/bonk.mp3')

    @commands.command(name='sr')
    async def song_request(self, message):
        try:
            user_input = message.content.replace('!sr', '').strip()
            if user_input == '':
                raise NotResultsException

            song_reference = self.music_dl.download(user_input)

            if song_reference is None:
                raise NotResultsException
            song_name = self.music_dl.get_song_name(song_reference)
            await self.music_player.add_to_playlist(song_reference, message, song_name)
        except MaxDurationException as ex:
            await send_exception(message, ex)
        except NotResultsException as ex:
            await send_exception(message, ex)
        except Exception as ex:
            print('----------')
            print(ex)
            print('----------')
            # I needed to do this because only this "fix" a weird bug
            # When the player stop and then play music again the volume change to -1 and it ignore every
            # validation that I do to change it again to the initial volume
            self.music_player = MusicPlayer(os.environ.get('DOWNLOADS_PATH'))
            print(f'[Music Player Restarted at {datetime.now()}]')
            print('----------')

    @commands.command(name='next')
    async def next_song(self, message):
        try:
            if message.author.is_mod:
                await self.music_player.next()
        except Exception as ex:
            print(ex)

    @commands.command(name='vol')
    async def volume(self, message):
        try:
            if message.author.is_mod:
                volume = message.content.replace('!vol ', '').strip()
                self.music_player.set_volume(volume)
        except Exception as ex:
            print(ex)

    @commands.command(name='currentsong')
    async def currentsong(self, message):
        try:
            reference = self.music_player.get_song_reference()
            song_name = self.music_dl.get_song_name(reference)

            if song_name is not None:
                await message.channel.send(f'{message.author.name}. La canción es: {song_name}')
        except Exception as ex:
            print(ex)

    @commands.command(name='stop')
    async def stop(self, message):
        try:
            if message.author.is_mod:
                self.music_player.stop()
        except Exception as ex:
            print(ex)
示例#9
0
class MusicWorker(Worker):
    def __init__(self, holder):
        super().__init__(holder)
        random.seed()
        self._config = Config()
        self._player = MusicPlayer()
        self._load_config()

    def on_connect(self, client, userdata, flags):
        super().on_connect(client, userdata, flags)
        client.subscribe(MUSIC_TOPIC_SUBSCRIBE)

    def on_message(self, client, userdata, msg):
        super().on_message(client, userdata, msg)

        payload = msg.payload.decode('UTF-8')

        if msg.topic.startswith(MUSIC_TOPIC_ROOT):
            command = msg.topic.rsplit("/", 1)[-1]
            if command == 'play':
                mp3_file = payload
                result = self._play_music(mp3_file)
                client.publish(msg.topic + '/reply', payload=result, qos=1)
            elif command == 'stop':
                self._stop_music()
            elif command == 'play_random_one':
                self._play_random_one()
            elif command == 'list_music':
                mp3_list = self._get_mp3_list()
                file_list = [mp3.rsplit('/', 1)[-1] for mp3 in mp3_list]
                client.publish(msg.topic + '/reply',
                               payload='{}:{}'.format(payload,
                                                      ','.join(file_list)),
                               qos=1,
                               retain=True)
            elif command == 'get_volume':
                volume = self._get_volume()
                client.publish(msg.topic + '/reply',
                               payload='{}'.format(volume),
                               qos=1,
                               retain=True)
            elif command == 'set_volume':
                result = self._set_volume(payload)
                client.publish(msg.topic + '/reply', payload=result, qos=1)
                if result == 'ok':
                    client.publish(MUSIC_TOPIC_ROOT + 'get_volume/reply',
                                   payload='{}'.format(payload),
                                   qos=1,
                                   retain=True)

    def _play_music(self, mp3_file=None, remote_command=True):
        self._stop_music()

        result = 'ok'

        if mp3_file is None or len(mp3_file) == 0:
            self._player.play(SAFE_MP3)
            result = 'ok'
        elif remote_command:
            if mp3_file.find('..') != -1 or mp3_file.find(
                    '/') != -1 or mp3_file.find('\\') != -1:
                # bad guy
                self._player.play(SAFE_MP3)
                result = 'File not exist!'
            else:
                full_path = '{}/{}'.format(self._config.mp3_folder, mp3_file)
                if os.path.isfile(full_path):
                    self._player.play(full_path)
                    result = 'ok'
                else:
                    self._player.play(SAFE_MP3)
                    result = 'File not exist!'
        else:
            self._player.play(mp3_file)
            result = 'ok'

        return result

    def _stop_music(self):
        self._player.stop()

    def _get_mp3_list(self):
        mp3_list = glob.glob('{}/*.[mM][pP]3'.format(self._config.mp3_folder))
        return mp3_list

    def _play_random_one(self):
        mp3_list = self._get_mp3_list()
        mp3_file = random.choice(mp3_list)
        print('Playing: {}'.format(mp3_file))
        self._play_music(mp3_file, remote_command=False)

    def _get_volume(self):
        return self._player.get_volume()

    def _set_volume(self, volume):
        v = -1
        try:
            v = int(volume)
        except:
            pass

        if v >= 0 and v <= 100:
            self._player.set_volume(v)
            self._music_config.volume = v
            self._save_config()
            return 'ok'
        else:
            return 'volume is valid!'

    def _save_config(self):
        with open(MUSIC_SAVE_FILE, 'wb') as f:
            pickle.dump(self._music_config, f)

    def _load_config(self):
        self._music_config = None
        if os.path.isfile(MUSIC_SAVE_FILE):
            try:
                with open(MUSIC_SAVE_FILE, 'rb') as f:
                    self._music_config = pickle.load(f)
            except:
                pass

        if self._music_config is None:
            self._music_config = MusicConfig()

        print('Volume:', self._music_config.volume)

        self._player.set_volume(self._music_config.volume)

    def pause(self):
        self._player.pause()
        # 为了解决 alarm 设置不了音量的问题
        # 也不彻底,先这样了!
        self._player.set_volume(100)

    def resume(self):
        self._player.resume()
        # 为了解决 alarm 设置不了音量的问题
        # 也不彻底,先这样了!
        self._player.set_volume(self._music_config.volume)