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 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)
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())
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 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
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())
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())
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)
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)], )
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()