コード例 #1
0
    def __init__(self):
        super().__init__()

        self.puzzles = {
            (4, 9): BassPuzzle,  # UP
            (4, -1): DrumsPuzzle,  # DOWN
            (-1, 4): PianoPuzzle,  # LEFT
            (9, 4): GuitarPuzzle,  # RIGHT
        }

        self.puzzle_finished = {
            (4, 9): False,  # UP
            (4, -1): False,  # DOWN
            (-1, 4): False,  # LEFT
            (9, 4): False,  # RIGHT
        }

        # self.puzzle_finished = {
        #     (4, 9): True,  # UP
        #     (4, -1): True,  # DOWN
        #     (-1, 4): True,  # LEFT
        #     (9, 4): True,  # RIGHT
        # }

        self.icon_sources = {
            (4, 9): "./data/bass.png",  # UP
            (4, -1): "./data/drums.png",  # DOWN
            (-1, 4): "./data/piano.png",  # LEFT
            (9, 4): "./data/guitar.png",  # RIGHT
        }

        self.door_sources = {
            (4, 9): "./data/Door_up.png",  # UP
            (4, -1): "./data/door_down.png",  # DOWN
            (-1, 4): "./data/door_left.png",  # LEFT
            (9, 4): "./data/Door_right.png",  # RIGHT
        }

        self.last_entered = (0, 0)

        self.tile_size = (self.grid.tile_side_len, self.grid.tile_side_len)
        self.treasure_room = DoorTile(
            self.tile_size, self.grid.grid_to_pixel((4, 4)), TreasureRoom
        )
        self.treasure_room.set_color(Color(rgba=(0, 0, 0, 1)))

        self.create_objects()
        self.place_objects()
コード例 #2
0
    def create_objects(self):
        self.objects = {}
        size = (self.grid.tile_side_len, self.grid.tile_side_len)
        self.objects[(4, 9)] = DoorTile(
            size,
            self.grid.grid_to_pixel((4, 9)),
            self.prev_room,
            source=self.door_sources[(4, 9)],
        )
        self.objects[(6, 6)] = ResetButton(size, self.grid.grid_to_pixel((6, 6)))
        x_topleft, y_topleft = (2, 5)

        self.sequencer_tiles = []
        for instrument_id in range(len(instruments)):
            row = []
            for beat_id in range(4):
                size = (self.grid.tile_side_len, self.grid.tile_side_len)
                pos = self.grid.grid_to_pixel(
                    (x_topleft + beat_id, y_topleft - instrument_id)
                )
                tile = SequencerTile(
                    size,
                    pos,
                    beat_id,
                    instrument_id,
                    (x_topleft, y_topleft),
                    self.beats,
                )
                self.objects[(x_topleft + beat_id, y_topleft - instrument_id)] = tile
                row.append(tile)
            self.sequencer_tiles.append(row)
コード例 #3
0
 def on_update(self):
     self.animations.on_update()
     self.actual_sound.on_update()
     self.user_sound.on_update()
     self.key_label.set_text(f"Key: {self.user_key}")
     if not self.game_over and self.is_game_over():
         for pos, obj in self.objects.items():
             if isinstance(obj, MovingBlock):
                 obj.moveable = False
         if self.level == max(levels.keys()):
             self.on_finished_puzzle()
             self.on_game_over()
         else:
             if (-1, 4) not in self.objects:
                 size = (self.grid.tile_side_len, self.grid.tile_side_len)
                 self.objects[(-1, 4)] = DoorTile(
                     size,
                     self.grid.grid_to_pixel((-1, 4)),
                     PianoPuzzle,
                     source=self.door_sources[(-1, 4)],
                 )
             self.add(PushMatrix())
             self.add(Translate(*self.grid.pos))
             self.add(self.objects[(-1, 4)])
             self.add(PopMatrix())
コード例 #4
0
    def create_objects(self):
        self.objects = {}
        for loc, puzzle in self.puzzles.items():
            if self.puzzle_finished[loc]:
                self.objects[loc] = self.create_icon(loc, self.icon_sources[loc])
            else:
                self.objects[loc] = DoorTile(
                    self.tile_size,
                    self.grid.grid_to_pixel(loc),
                    puzzle,
                    source=self.door_sources[loc],
                )

        if self.is_game_over():
            self.objects[(4, 4)] = self.treasure_room
コード例 #5
0
    def create_objects(self):
        self.objects = {}
        # Add door to switch between rooms
        self.objects[(-1, 4)] = DoorTile(
            self.tile_size,
            self.grid.grid_to_pixel((-1, 4)),
            self.prev_room,
            source=self.door_sources[(-1, 4)],
        )

        self.mummy = self.create_mummy((4, 8))
        self.objects[(4, 8)] = self.mummy

        self.simons = []
        for idx in range(5):
            pos = (idx + 2, 3)
            simon = self.create_simon_says(pos, idx)
            self.simons.append(simon)
            self.objects[pos] = simon
コード例 #6
0
 def on_update(self):
     self.audio.on_update()
     if not self.game_over and self.is_game_over():
         if self.level >= max(string_heights.keys()):
             self.on_finished_puzzle()
             self.on_game_over()
         else:
             if self.next_room is None:
                 self.next_room = DoorTile(
                     self.tile_size,
                     self.grid.grid_to_pixel((4, 9)),
                     BassPuzzle,
                     self.door_sources[(4, 9)],
                 )
                 self.objects[(4, 9)] = self.next_room
             self.add(PushMatrix())
             self.add(Translate(*self.grid.pos))
             self.add(self.next_room)
             self.add(PopMatrix())
コード例 #7
0
 def on_update(self):
     self.sound.on_update()
     if self.sequencer_tiles:
         if not self.game_over and self.is_game_over():
             if self.level >= max(levels.keys()):
                 self.on_finished_puzzle()
                 self.on_game_over()
             else:
                 if (4, -1) not in self.objects:
                     size = (self.grid.tile_side_len, self.grid.tile_side_len)
                     self.objects[(4, -1)] = DoorTile(
                         size,
                         self.grid.grid_to_pixel((4, -1)),
                         DrumsPuzzle,
                         source=self.door_sources[(4, -1)],
                     )
                 self.add(PushMatrix())
                 self.add(Translate(*self.grid.pos))
                 self.add(self.objects[(4, -1)])
                 self.add(PopMatrix())
コード例 #8
0
    def create_objects(self):
        self.objects = {}
        self.objects[(4, -1)] = DoorTile(
            self.tile_size,
            self.grid.grid_to_pixel((4, -1)),
            self.prev_room,
            self.door_sources[(4, -1)],
        )

        self.strings = []
        for i in range(self.num_strings):
            # Create each string
            height = self.string_heights[i]
            self.strings.append(self.create_string(height, i))

            # Create the play buttons
            button_pos = (0, height)
            self.objects[button_pos] = self.create_play_button(button_pos)

            # Create the corresponding fret
            fret_x = self.current_frets[i]
            fret_y = self.string_heights[i]
            grid_loc = (fret_x, fret_y)
            self.objects[grid_loc] = self.create_fret(grid_loc, i)
コード例 #9
0
    def create_objects(self):
        size = (self.grid.tile_side_len, self.grid.tile_side_len)

        # PITCH
        self.objects[(4, 7)] = MovingBlock(
            size,
            self.grid.grid_to_pixel((4, 7)),
            ((1, 7), (8, 7)),
            "./data/pitch_slider.png",
            self.on_pitch_change,
        )

        # RHYTHM
        duration = self.user_notes[0].get_dur()
        self.objects[(durations.index(duration) + 3, 2)] = MovingBlock(
            size,
            self.grid.grid_to_pixel((durations.index(duration) + 3, 2)),
            ((3, 2), (7, 2)),
            "./data/rhythm_slider.png",
            self.on_duration_change,
        )

        # KEY
        self.objects[(key_names.index(self.user_key) + 1, 5)] = MovingBlock(
            size,
            self.grid.grid_to_pixel((key_names.index(self.user_key) + 1, 5)),
            ((1, 5), (7, 5)),
            "./data/key_slider.png",
            self.on_key_change,
        )
        self.objects[(9, 4)] = DoorTile(
            size,
            self.grid.grid_to_pixel((9, 4)),
            self.prev_room,
            source=self.door_sources[(9, 4)],
        )
コード例 #10
0
class CenterRoom(Puzzle):
    def __init__(self):
        super().__init__()

        self.puzzles = {
            (4, 9): BassPuzzle,  # UP
            (4, -1): DrumsPuzzle,  # DOWN
            (-1, 4): PianoPuzzle,  # LEFT
            (9, 4): GuitarPuzzle,  # RIGHT
        }

        self.puzzle_finished = {
            (4, 9): False,  # UP
            (4, -1): False,  # DOWN
            (-1, 4): False,  # LEFT
            (9, 4): False,  # RIGHT
        }

        # self.puzzle_finished = {
        #     (4, 9): True,  # UP
        #     (4, -1): True,  # DOWN
        #     (-1, 4): True,  # LEFT
        #     (9, 4): True,  # RIGHT
        # }

        self.icon_sources = {
            (4, 9): "./data/bass.png",  # UP
            (4, -1): "./data/drums.png",  # DOWN
            (-1, 4): "./data/piano.png",  # LEFT
            (9, 4): "./data/guitar.png",  # RIGHT
        }

        self.door_sources = {
            (4, 9): "./data/Door_up.png",  # UP
            (4, -1): "./data/door_down.png",  # DOWN
            (-1, 4): "./data/door_left.png",  # LEFT
            (9, 4): "./data/Door_right.png",  # RIGHT
        }

        self.last_entered = (0, 0)

        self.tile_size = (self.grid.tile_side_len, self.grid.tile_side_len)
        self.treasure_room = DoorTile(
            self.tile_size, self.grid.grid_to_pixel((4, 4)), TreasureRoom
        )
        self.treasure_room.set_color(Color(rgba=(0, 0, 0, 1)))

        self.create_objects()
        self.place_objects()

    def on_finished_puzzle(self):
        if self.last_entered in self.puzzle_finished:
            self.puzzle_finished[self.last_entered] = True
        else:
            print("Incorrect dimensions for finished puzzle")

        for pos, obj in self.objects.items():
            self.remove(obj)
        self.create_objects()
        self.place_objects()

    def create_icon(self, loc, source):
        tile = Tile(self.tile_size, self.grid.grid_to_pixel(loc))
        tile.set_color(Tile.base_color, source=source)
        tile.passable = False
        return tile

    """ Mandatory Puzzle methods """

    def is_game_over(self):
        for loc, finished in self.puzzle_finished.items():
            if not finished:
                return False
        return True

    def create_objects(self):
        self.objects = {}
        for loc, puzzle in self.puzzles.items():
            if self.puzzle_finished[loc]:
                self.objects[loc] = self.create_icon(loc, self.icon_sources[loc])
            else:
                self.objects[loc] = DoorTile(
                    self.tile_size,
                    self.grid.grid_to_pixel(loc),
                    puzzle,
                    source=self.door_sources[loc],
                )

        if self.is_game_over():
            self.objects[(4, 4)] = self.treasure_room

    def place_objects(self):
        self.add(PushMatrix())
        self.add(Translate(*self.grid.pos))

        for pos, obj in self.objects.items():
            self.add(obj)

        self.add(PopMatrix())

    def on_player_input(self, button):
        player_pos = self.character.grid_pos
        if button in [Button.UP, Button.DOWN, Button.LEFT, Button.RIGHT]:
            # Move the player
            x, y = button.value
            new_pos = (player_pos[0] + x, player_pos[1] + y)

            # Check if we are walking through a door
            if new_pos in self.objects:
                obj = self.objects[new_pos]
                if isinstance(obj, DoorTile):
                    self.last_entered = new_pos
                    if not isinstance(obj.other_room, Puzzle):
                        # instantiate class when we enter the door
                        self.objects[new_pos].other_room = obj.other_room(
                            prev_room=self, on_finished_puzzle=self.on_finished_puzzle
                        )

                    next_room_pos = (8 - new_pos[0] + x, 8 - new_pos[1] + y)
                    self.objects[new_pos].other_room.character.change_direction(
                        button.value
                    )
                    self.objects[new_pos].other_room.character.move_player(
                        next_room_pos
                    )
                    return self.objects[new_pos].other_room

            self.character.change_direction(button.value)
            self.character.move_player(new_pos)
            player_pos = self.character.grid_pos

    def on_update(self):
        if not self.game_over and self.is_game_over():
            self.add(PushMatrix())
            self.add(Translate(*self.grid.pos))
            self.add(self.treasure_room)
            self.add(PopMatrix())

    def on_layout(self, win_size):
        self.remove(self.character)
        self.remove(self.grid)
        self.grid.on_layout(win_size)
        for pos, obj in self.objects.items():
            self.remove(obj)
        self.tile_size = (self.grid.tile_side_len, self.grid.tile_side_len)

        self.add(self.grid)
        self.place_objects()
        self.character.on_layout(win_size)
        self.add(self.character)

        if self.game_over:
            self.remove(self.game_over_window_color)
            self.remove(self.game_over_window)
            self.remove(self.game_over_text_color)
            self.remove(self.game_over_text)

            self.on_game_over()