From dc3eed681bfee92f91bbaf54e72ef7cf6dbe75f9 Mon Sep 17 00:00:00 2001 From: elukjanovica Date: Mon, 4 Mar 2024 00:37:28 +0200 Subject: [PATCH] --- TODO | 12 +- images/assets/01_sprites.png | Bin 4437 -> 4614 bytes images/assets/11_sprites.png | Bin 5869 -> 5895 bytes main.py | 214 ++++++++++++++++++++++++++++------- main_data.json | 16 +-- main_puzzle.json | 2 +- main_settings.json | 4 +- 7 files changed, 188 insertions(+), 60 deletions(-) diff --git a/TODO b/TODO index 5387531..5e53afa 100644 --- a/TODO +++ b/TODO @@ -3,14 +3,14 @@ TODO main: [x] fix image loading from last album [x] fix image choosing [x] add proper image loading from storage -[ ] add setting - move pieses = slow/normal/fast/instant -[ ] fix quick game window moving thing -[ ] add popup when loading time - load previous or reset +[meh] add setting - move pieses = slow/normal/fast/instant +[meh] fix quick game window moving thing +[meh] add popup when loading time - load previous or reset [ ] add small notes on button hover [ ] add functionality in select and menu mode -[ ] add settings, info and stats with full functionality -[ ] optimise code as possible -[ ] add splash screen +[sorta] add settings, info and stats with full functionality +[meh] optimise code as possible +[no] add splash screen [ ] add keybinds TODO additional: diff --git a/images/assets/01_sprites.png b/images/assets/01_sprites.png index 6f3fe36449c16d8949ea8dab158bbffb91fa3650..6a526c73e443b102d5e247e2425e43ac6a7b27eb 100644 GIT binary patch literal 4614 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 HZ5{GIbKO#1 diff --git a/images/assets/11_sprites.png b/images/assets/11_sprites.png index 7583652891d46d9cd9efaa8cf3f025d267697c03..6bcb10837a791fa5e2fe8f39d7a69842fdbe5e8c 100644 GIT binary patch literal 5895 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 literal 5869 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 ZC= len(choices): + index = 0 + value = choices[index] + data_set(setting, value) + + return first_arrow, value_text, second_arrow + + def data_set(setting, value): - if setting == gui: + if setting == "size": + settings_data["size"] = value + elif setting == "style": + settings_data["style"] = value + elif setting == "grid": + settings_data["grid"] = value + elif setting == gui: settings_data[gui] = value elif setting == music: - settings_data[music]["volume"] = value - update_music_volume() + if isinstance(value, str): + settings_data[sound]["version"] = value + else: + settings_data[music]["volume"] = value + update_music_volume() elif setting == sound: - settings_data[sound]["volume"] = value - update_sound_volume() + if isinstance(value, str): + settings_data[sound]["version"] = value + else: + settings_data[sound]["volume"] = value + update_sound_volume() with open(SETTINGS_FILE, "w") as settings_file: json.dump(settings_data, settings_file, indent=2) @@ -750,16 +802,49 @@ def reset(): # Reset all data function, not finished yet pass - -def info(): - # Not finished yet - pass +# STATS MODE -# Stats -def stats(): - # Not finished yet - pass +#INFO MODE +text_size = [3, 5] + +def render_text_in_rect(long_text, rect_area): + font = pygame.font.SysFont(FONT, FONT_SIZE-text_size[0]) + lines = [] + words = long_text.split() + current_line = "" + for word in words: + test_line = current_line + word + " " + if font.size(test_line)[0] <= rect_area.width: + current_line = test_line + else: + lines.append(current_line.strip()) + current_line = word + " " + lines.append(current_line.strip()) + + line_height = font.get_linesize() + text_surfaces = [] + text_rects = [] + for i, line in enumerate(lines): + text_render = font.render(line, True, pygame.Color(*text_color)) + text_rect = text_render.get_rect(topleft=(rect_area.x, rect_area.y + i * line_height)) + text_surfaces.append(text_render) + text_rects.append(text_rect) + + return text_surfaces, text_rects + +# Example usage +rect_area = non_movable_area +rect_area.x += text_size[1] +rect_area.width -= text_size[1] +long_text = ( + "Picture Puzzle, once a feature in Windows Vista and 7's 'Desktop Gadgets,' " + "faced an end in 2012 due to security concerns. This game is a remake of original " + "Picture Puzzle with modified and upgraded functionality. Music autor is SmugBurger, " + "sounds taken from open sources." +) + +text_surfaces, text_rects = render_text_in_rect(long_text, rect_area) # Buttons (maybe optimise?) @@ -896,9 +981,9 @@ def button_check(pressed_button, run, current_mode, timer_running): # Not finished yet pass elif pressed_button == info_button: - info() + current_mode = "info" elif pressed_button == stats_button: - stats() + current_mode = "stats" return run, current_mode, timer_running, do_not_save @@ -935,11 +1020,12 @@ run = True current_mode = "menu" # Dragging and mouse interaction dragging = False -slider_moving = False -setting = None can_move = False start_pos = (0, 0) pressed_button = None +slider_moving = False +setting = None +arrow = None # Select mode clicked_image = False image_display = None @@ -987,7 +1073,9 @@ while run: selected_image.render(screen) - for event in pygame.event.get(): + event_list = pygame.event.get() + + for event in event_list: if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: save_puzzle_state() update_puzzle_data(completed, not_shuffled, current_timer_text, current_moves, real_time) @@ -1058,7 +1146,7 @@ while run: pressed_button = None can_move = False setting = None - + elif event.type == pygame.MOUSEBUTTONDOWN and current_mode == "settings": if event.button == 4: scroll_offset -= 20 @@ -1107,7 +1195,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"] and moved is not None: current_moves += 1 user_win = True print("clicked:", current_moves) @@ -1160,18 +1248,39 @@ while run: for index, setting_name in enumerate(settings_data): if setting_name != "keybinds": - y = f_line[3] - scroll_offset + index * (cons[0] + spaces[2]) - spaces[1] + y = f_line[3] - scroll_offset + index * (cons[0] + spaces[2]) + spaces[1] value = settings_data[setting_name] if setting_name in [gui, music, sound]: if setting_name in [music, sound]: - value = value["volume"] - render_settings_text(setting_name.upper(), - (settings_x_position // 2 + spaces[4], y), screen, value) - else: - render_settings_text(setting_name.upper(), - (settings_x_position // 2 + spaces[4], y), screen) + value = settings_data[setting_name]["volume"] + value2 = settings_data[setting_name]["version"] - if setting_name == gui: + if setting_name == "size": + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y), screen) + size_choosing = arrows((settings_x_position // 2 - spaces[3], y + spaces[0]), setting_name, value, SIZE_CHOICES, event_list) + size_choosing[0].update(mouse_pos) + size_choosing[2].update(mouse_pos) + size_choosing[0].draw(screen) + size_choosing[2].draw(screen) + active_selects["size"] = True + elif setting_name == "style": + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y), screen) + style_choosing = arrows((settings_x_position // 2 - spaces[3], y + spaces[0]), setting_name, value, STYLE_CHOICES, event_list) + style_choosing[0].update(mouse_pos) + style_choosing[2].update(mouse_pos) + style_choosing[0].draw(screen) + style_choosing[2].draw(screen) + active_selects["style"] = True + elif setting_name == "grid": + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y), screen) + grid_choosing = arrows((settings_x_position // 2 - spaces[3], y + spaces[0]), setting_name, value, GRID_CHOICES, event_list) + grid_choosing[0].update(mouse_pos) + grid_choosing[2].update(mouse_pos) + grid_choosing[0].draw(screen) + grid_choosing[2].draw(screen) + active_selects["grid"] = True + elif setting_name == gui: + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y), screen, value) gui_color_slider = slider((settings_x_position // 2 - spaces[3], y + spaces[0]), 360, value, active_sliders, setting_name) for slider_part in gui_color_slider: slider_part.draw(screen) @@ -1181,6 +1290,7 @@ while run: elif not dragging: active_sliders[gui] = False elif setting_name == music: + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y), screen, value) music_volume_slider = slider((settings_x_position // 2 - spaces[3], y + spaces[0]), 100, value, active_sliders, setting_name) for slider_part in music_volume_slider: slider_part.draw(screen) @@ -1189,8 +1299,16 @@ while run: setting = setting_name elif not dragging: active_sliders[music] = False + music_choosing = arrows((settings_x_position // 2 - spaces[3], y + spaces[0]+24), setting_name, value2, MUSIC_CHOICES, event_list) + music_choosing[0].update(mouse_pos) + music_choosing[2].update(mouse_pos) + music_choosing[0].draw(screen) + music_choosing[2].draw(screen) + active_selects["music_version"] = True elif setting_name == sound: - sound_volume_slider = slider((settings_x_position // 2 - spaces[3], y + spaces[0]), 100, value, active_sliders, setting_name) + render_settings_text(setting_name.upper(),(settings_x_position // 2 + spaces[4], y+20), screen, value) + y += spaces2[5] + sound_volume_slider = slider((settings_x_position // 2 - spaces[3], y-10), 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(mouse_pos): @@ -1198,8 +1316,18 @@ while run: setting = setting_name elif not dragging: active_sliders[sound] = False + sound_choosing = arrows((settings_x_position // 2 - spaces[3], y + spaces[0]), setting_name, value2, SOUND_CHOICES, event_list) + sound_choosing[0].update(mouse_pos) + sound_choosing[2].update(mouse_pos) + sound_choosing[0].draw(screen) + sound_choosing[2].draw(screen) + active_selects["sound_version"] = True screen.set_clip(None) + + if current_mode == "info": + for text_surface, text_rect in zip(text_surfaces, text_rects): + screen.blit(text_surface, text_rect) pygame.display.flip() diff --git a/main_data.json b/main_data.json index ebfb6b2..3e4e99c 100644 --- a/main_data.json +++ b/main_data.json @@ -5,19 +5,19 @@ 0, 0, 0, - 93, - "00:01:05", - "00:00:40", - 0 + 99, + "00:01:11", + "00:00:46", + 6 ], "2.png": [ 0, 0, 0, - 57, - "00:00:23", - "00:00:23", - 1 + 85, + "00:00:40", + "00:00:40", + 0 ], "3.png": [ 0, diff --git a/main_puzzle.json b/main_puzzle.json index 9ed675e..212d5dc 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": [[13, 2, 9, 12], [4, 1, 6, 8], [5, 3, 10, 15], [14, 7, 11, 0]], "selected_image": "images/albums/Original images/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": [[10, 2, 5, 12], [13, 4, 3, 15], [6, 14, 8, 0], [11, 1, 7, 9]], "selected_image": "images/albums/Original images/2.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 diff --git a/main_settings.json b/main_settings.json index eaae2fc..5b6fc6a 100644 --- a/main_settings.json +++ b/main_settings.json @@ -1,5 +1,5 @@ { - "size": "big", + "size": "medium", "style": "classic", "grid": "4x4", "gui color": 0, @@ -10,7 +10,7 @@ }, "sound": { "on": true, - "volume": 16, + "volume": 12, "version": "wood" }, "display": "time",