diff --git a/main.py b/main.py index c0bf205..c880bbe 100644 --- a/main.py +++ b/main.py @@ -40,6 +40,14 @@ puzzle_data = load_data(PUZZLE_FILE) settings_data = load_data(SETTINGS_FILE) stats_data = load_data(STATS_FILE) +gui = "gui color" +sensitivity = "sensitivity" +music = "music" +sound = "sound" +style = "style" +current_size = settings_data["size"] +current_style = settings_data["style"] + # Configuration SIZE_CHOICES = ["small", "medium", "big"] STYLE_CHOICES = ["classic", "original", "dark"] @@ -50,12 +58,12 @@ DISPLAY_CHOICES = ["time", "moves"] LANGUAGE_CHOICES = ["english", "russian", "latvian"] FONTS = ["msreferencesansserif", "arial", "bahnschrift"] -if settings_data["style"] == STYLE_CHOICES[0]: +if current_style == STYLE_CHOICES[0]: FONT = FONTS[0] STYLE_PATH = "1_" text_color = (1, 35, 61) oposite_color = white -elif settings_data["style"] == STYLE_CHOICES[1]: +elif current_style == STYLE_CHOICES[1]: FONT = FONTS[1] STYLE_PATH = "2_" text_color = white @@ -66,7 +74,7 @@ else: text_color = white oposite_color = text_color -if settings_data["size"] == SIZE_CHOICES[0]: +if current_size == SIZE_CHOICES[0]: WIDTH, HEIGHT = 144, 154 INT = 0 if FONT == FONTS[0]: @@ -87,7 +95,7 @@ if settings_data["size"] == SIZE_CHOICES[0]: scaled_size = (18, 21, 108, 108) area = (72, 142) -elif settings_data["size"] == SIZE_CHOICES[1]: +elif current_size == SIZE_CHOICES[1]: WIDTH, HEIGHT = 202, 216 INT = 1 if FONT == FONTS[0]: @@ -232,43 +240,6 @@ class Button: screen.blit(self.img, self.rect) -f_line = [135, 38, 80, 12] -s_line = [135, 53, 80, 12] -s_button = [218, 38, 10, 16] -gap = (s_button[2]/2)-(s_line[3]/2) - - -class Slider: - def __init__(self, position, value_range, value, dragging): - self.position = position - self.value_range = value_range - self.value = value - self.dragging = dragging - self.update_positions() - - def update_positions(self): - self.second_x = int(80 * (self.value / self.value_range[1])) - self.value_pos = self.second_x - (s_button[2] / 2) - self.first_line_img = Image((f_line[0], f_line[1]), self.position, (f_line[2], f_line[3])) - self.second_line_img = Image((s_line[0], s_line[1]), self.position, (self.second_x, s_line[3])) - self.slider_button = Button((s_button[0], s_button[1]), (self.value_pos, self.position + gap), - (s_button[2], s_button[3])) - self.handle_event() - - def handle_event(self): - if self.dragging and pygame.mouse.get_pressed()[0]: - mouse_x, mouse_y = pygame.mouse.get_pos() - if self.slider_button.rect.collidepoint(mouse_x, mouse_y): - self.value_pos = mouse_x - s_button[2] / 2 - self.second_x = int(self.value_pos + s_button[2] / 2) - self.value = int((self.second_x / 80) * self.value_range[1]) - - def draw(self, screen): - self.first_line_img.draw(screen) - self.second_line_img.draw(screen) - self.slider_button.draw(screen) - - # Ability to move window def move_win(coordinates): hwnd = pygame.display.get_wm_info()["window"] @@ -348,7 +319,7 @@ def render_albums(): global current_mode, album_name current_hovered_index = -1 size_to_y = {"small": 25, "medium": 35, "big": 65} - y = size_to_y[settings_data["size"]] + y = size_to_y[current_size] for hover_index, album in enumerate(storage["albums"]): render_text(album, (size[1], y), screen) @@ -474,7 +445,7 @@ def cut_image(image): if puzzle_version == GRID_CHOICES[0]: layer_path = pygame.image.load("images/assets/piece32.png").convert_alpha() else: - layer_path = pygame.image.load("images/assets/piece45.png" if settings_data["size"] == SIZE_CHOICES[0] else "images/assets/piece60.png").convert_alpha() + layer_path = pygame.image.load("images/assets/piece45.png" if current_size == SIZE_CHOICES[0] else "images/assets/piece60.png").convert_alpha() layer_path = pygame.transform.scale(layer_path, (piece_width, piece_height)) layer_path.set_colorkey((0, 0, 0)) @@ -618,24 +589,72 @@ def update_puzzle_data(completed, sorted, current_time, current_moves, real_time data_file.write(json.dumps(storage, indent=3)) # SETTINGS MODE +scroll_offset = 0 +space_between_settings = 20 +settings_y_offset = 5 +f_line = [135, 38, 80, 12] +s_line = [135, 53, 80, 12] +s_button = [218, 38, 10, 16] + +settings_x_position = puzzle_size[0] +total_settings_height = len(settings_data) * (cons[0] + space_between_settings) +max_scroll_offset = max(0, total_settings_height - non_movable_area.height) +active_sliders = {gui: False, sensitivity: False, music: False, sound: False} +gap = (s_button[2]/2)-(s_line[3]/2)-1 + + +def slider(position, value_range, value, active_slider, setting): + second_x = value / value_range * s_line[2] + value_pos = second_x - s_button[2] / 2 + first_line = Image((f_line[0], f_line[1]), (position[0], position[1]), (f_line[2], f_line[3])) + second_line = Image((s_line[0], s_line[1]), (position[0], position[1]), (second_x, s_line[3])) + slider_button = Button((s_button[0], s_button[1]), (position[0] + value_pos, position[1] + gap), (s_button[2], s_button[3])) + mouse_buttons = pygame.mouse.get_pressed() + if active_slider[setting] and mouse_buttons[0]: + + mouse_pos = pygame.mouse.get_pos() + + if mouse_buttons[0] and slider_button.rect.inflate(100, 25).collidepoint(mouse_pos): + mouse_pos = pygame.mouse.get_pos() + mouse_x = mouse_pos[0] + min_x = position[0] - s_button[2] / 2 + max_x = position[0] + s_line[2] - s_button[2] / 2 + new_value_pos = min(max(mouse_x - s_button[2] / 2, min_x), max_x) + new_value = int(((new_value_pos - min_x) / (max_x - min_x)) * value_range) + second_x = new_value_pos - position[0] + s_button[2] / 2 + slider_button.rect.x = new_value_pos + value = new_value + + if setting == gui: + settings_data[gui] = value + elif setting == sensitivity: + settings_data[sensitivity] = value + elif setting == music: + settings_data[music]["volume"] = value + elif setting == sound: + settings_data[sound]["volume"] = value + + return first_line, second_line, slider_button + + def play_music(): - music_file = settings_data["music"]["version"] - volume = settings_data["music"]["volume"] + music_file = settings_data[music]["version"] + volume = settings_data[music]["volume"] pygame.mixer.music.load("misc/" + music_file + ".mp3") pygame.mixer.music.set_volume(volume) pygame.mixer.music.play(-1) -if settings_data["music"]["on"] is True: +if settings_data[music]["on"] is True: play_music() def play_sound(): - sound_file = settings_data["sound"]["version"] - volume = settings_data["sound"]["volume"] - sound = pygame.mixer.Sound("misc/" + sound_file + ".ogg") - sound.set_volume(volume) - pygame.mixer.Sound.play(sound) + sound_file = settings_data[sound]["version"] + volume = settings_data[sound]["volume"] + current_sound = pygame.mixer.Sound("misc/" + sound_file + ".ogg") + current_sound.set_volume(volume) + pygame.mixer.Sound.play(current_sound) def set_hue(): @@ -645,7 +664,6 @@ def set_hue(): elif settings_data["style"] == STYLE_CHOICES[2]: x = 1 - gui = "gui color" hue_value = settings_data[gui][x] keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: @@ -701,7 +719,7 @@ def stats(): # Buttons (maybe optimise?) -if settings_data["size"] == SIZE_CHOICES[0]: +if current_size == SIZE_CHOICES[0]: px12 = (12, 12) px14 = (14, 14) timer_button = Button((0, 0), (7, 3), px12) @@ -723,7 +741,7 @@ if settings_data["size"] == SIZE_CHOICES[0]: BACKGROUND_IMAGE = Image((0, 64), (0, 0), (WIDTH, HEIGHT)) ver1_layer = sprite_sheet.get_sprite((147, 64), WIDTH, HEIGHT, transparent) ver2_layer = sprite_sheet.get_sprite((294, 64), WIDTH, HEIGHT, transparent) -elif settings_data["size"] == SIZE_CHOICES[1]: +elif current_size == SIZE_CHOICES[1]: px16 = (16, 16) px20 = (20, 20) timer_button = Button((0, 0), (8, 4), px16) @@ -768,11 +786,6 @@ else: ver1_layer = sprite_sheet.get_sprite((399, 156), WIDTH, HEIGHT, transparent) ver2_layer = sprite_sheet.get_sprite((798, 156), WIDTH, HEIGHT, transparent) -settings_x_position = 50 -settings_y_offset = 10 -slider_size = (80, 12) -button_size = (10, 16) -space_between_settings = 20 def load_data(): path_components = puzzle_data[f'current {puzzle_version}']['selected_image'].split('/')[2:] @@ -872,48 +885,6 @@ def data_check(current_mode): return background_image, current_buttons -scroll_offset = 0 -space_between_settings = 20 -settings_x_position = puzzle_size[0] -settings_y_offset = 5 -total_settings_height = len(settings_data) * (cons[0] + space_between_settings) -max_scroll_offset = max(0, total_settings_height - non_movable_area.height) - -f_line = [135, 38, 80, 12] -s_line = [135, 53, 80, 12] -s_button = [218, 38, 10, 16] -gap = (s_button[2]/2)-(s_line[3]/2)-1 - -def slider(position, value_range, value, slider_moving, setting): - second_x = value / value_range * s_line[2] - value_pos = second_x - s_button[2] / 2 - first_line = Image((f_line[0], f_line[1]), (position[0], position[1]), (f_line[2], f_line[3])) - second_line = Image((s_line[0], s_line[1]), (position[0], position[1]), (second_x, s_line[3])) - slider_button = Button((s_button[0], s_button[1]), (position[0] + value_pos, position[1] + gap), (s_button[2], s_button[3])) - - if slider_moving: - mouse_buttons = pygame.mouse.get_pressed() - mouse_pos = pygame.mouse.get_pos() - if mouse_buttons[0] and slider_button.rect.collidepoint(mouse_pos): - mouse_x = mouse_pos[0] - new_value_pos = mouse_x - s_button[2] / 2 - position[0] - new_second_x = min(max(new_value_pos + s_button[2] / 2, 0), s_line[2]) - new_value = int((new_second_x / s_line[2]) * value_range) - - second_x = new_second_x - value_pos = new_value_pos - slider_button.rect.x = position[0] + value_pos - value = new_value - if setting == "gui color": - settings_data["gui color"] = value - elif setting == "sensitivity": - settings_data["sensitivity"] = value - elif setting == "music": - settings_data["music"]["volume"] = value - elif setting == "sound": - settings_data["sound"]["volume"] = value - - return first_line, second_line, slider_button # Game state run = True @@ -1089,7 +1060,7 @@ while run: if 0 <= clicked_row < len(puzzle_matrix) and 0 <= clicked_col < len(puzzle_matrix[0]): if puzzle_matrix[clicked_row, clicked_col] and clicked is None: moved = move_pieces(clicked_row, clicked_col) - if settings_data["sound"]["on"] is True and moved is not None: + if settings_data[sound]["on"] is True and moved is not None: current_moves += 1 user_win = True print("clicked:", current_moves) @@ -1144,8 +1115,8 @@ while run: if setting_name != "keybinds": y = f_line[3] - scroll_offset + index * (cons[0] + space_between_settings) value = settings_data[setting_name] - if setting_name in ["gui color", "sensitivity", "music", "sound"]: - if setting_name in ["music", "sound"]: + if setting_name in [gui, sensitivity, music, sound]: + if setting_name in [music, sound]: value = value["volume"] render_settings_text(setting_name.upper(), (settings_x_position // 2 + 9, y - settings_y_offset), screen, value) @@ -1153,34 +1124,42 @@ while run: render_settings_text(setting_name.upper(), (settings_x_position // 2 + 9, y - settings_y_offset), screen) - if setting_name == "gui color": - gui_color_slider = slider((settings_x_position // 2 - 26, y + 8), 360, value, slider_moving, setting) + if setting_name == gui: + gui_color_slider = slider((settings_x_position // 2 - 26, y + 8), 360, value, active_sliders, setting_name) for slider_part in gui_color_slider: slider_part.draw(screen) - if dragging and gui_color_slider[2].rect.collidepoint(event.pos): - slider_moving = True + if dragging and gui_color_slider[2].rect.collidepoint(mouse_pos): + active_sliders[gui] = True setting = setting_name - elif setting_name == "sensitivity": - sensitivity_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, slider_moving, setting) + elif not dragging: + active_sliders[gui] = False + elif setting_name == sensitivity: + sensitivity_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, active_sliders, setting_name) for slider_part in sensitivity_slider: slider_part.draw(screen) - if dragging and sensitivity_slider[2].rect.collidepoint(event.pos): - slider_moving = True + if dragging and sensitivity_slider[2].rect.collidepoint(mouse_pos): + active_sliders[sensitivity] = True setting = setting_name - elif setting_name == "music": - music_volume_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, slider_moving, setting) + elif not dragging: + active_sliders[sensitivity] = False + elif setting_name == music: + music_volume_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, active_sliders, setting_name) for slider_part in music_volume_slider: slider_part.draw(screen) - if dragging and music_volume_slider[2].rect.collidepoint(event.pos): - slider_moving = True + if dragging and music_volume_slider[2].rect.collidepoint(mouse_pos): + active_sliders[music] = True setting = setting_name - elif setting_name == "sound": - sound_volume_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, slider_moving, setting) + elif not dragging: + active_sliders[music] = False + elif setting_name == sound: + sound_volume_slider = slider((settings_x_position // 2 - 26, y + 8), 100, value, active_sliders, setting_name) for slider_part in sound_volume_slider: slider_part.draw(screen) - if dragging and sound_volume_slider[2].rect.collidepoint(event.pos): - slider_moving = True + if dragging and sound_volume_slider[2].rect.collidepoint(mouse_pos): + active_sliders[sound] = True setting = setting_name + elif not dragging: + active_sliders[sound] = False screen.set_clip(None) diff --git a/main_data.json b/main_data.json index 54a0387..08bee3e 100644 --- a/main_data.json +++ b/main_data.json @@ -5,19 +5,19 @@ 0, 0, 0, - 42, - "00:00:44", - "00:00:19", - 6 + 50, + "00:00:49", + "00:00:24", + 8 ], "2.png": [ 0, 0, 0, - 56, + 57, "00:00:23", "00:00:23", - 7 + 1 ], "3.png": [ 0, @@ -32,10 +32,10 @@ 0, 0, 0, - 7, - "00:00:08", - "00:00:08", - 7 + 11, + "00:00:11", + "00:00:11", + 0 ], "5.png": [ 0, diff --git a/main_puzzle.json b/main_puzzle.json index d8e3d10..ffd4635 100644 --- a/main_puzzle.json +++ b/main_puzzle.json @@ -1 +1 @@ -{"puzzle 4x4": [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 0]], "puzzle 3x3": [[1, 2, 3], [4, 5, 6], [7, 8, 0]], "current 4x4": {"matrix": [[6, 3, 0, 15], [4, 13, 11, 9], [10, 8, 7, 5], [2, 14, 12, 1]], "selected_image": "images/albums/Birds/1.png"}, "current 3x3": {"matrix": [[3, 6, 7], [5, 4, 1], [0, 8, 2]], "selected_image": "/images/albums/Birds/1.png"}} \ No newline at end of file +{"puzzle 4x4": [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 0]], "puzzle 3x3": [[1, 2, 3], [4, 5, 6], [7, 8, 0]], "current 4x4": {"matrix": [[2, 12, 1, 3], [7, 5, 15, 11], [13, 10, 9, 0], [14, 6, 4, 8]], "selected_image": "images/albums/Original images/4.png"}, "current 3x3": {"matrix": [[3, 6, 7], [5, 4, 1], [0, 8, 2]], "selected_image": "/images/albums/Birds/1.png"}} \ No newline at end of file