From fa3353c47103e96532fc1e01c0573200ca2d6dbe Mon Sep 17 00:00:00 2001 From: Tucan444 Date: Wed, 16 Dec 2020 20:47:09 +0100 Subject: [PATCH] adding files cc --- Hashi.py | 864 ++++++++++++++++ assets/images/game/back.png | Bin 0 -> 1062 bytes assets/images/game/back_hover.png | Bin 0 -> 731 bytes assets/images/game/num_circle.png | Bin 0 -> 352 bytes assets/images/game/num_circle_hover.png | Bin 0 -> 279 bytes assets/images/game/tutorial_circle.png | Bin 0 -> 281 bytes assets/images/game/tutorial_circle_hover.png | Bin 0 -> 280 bytes assets/images/general/hashi_logo.ico | Bin 0 -> 130247 bytes assets/images/general/hashi_logo.png | Bin 0 -> 101553 bytes assets/images/menu/arrow.png | Bin 0 -> 968 bytes assets/images/menu/arrow_hover.png | Bin 0 -> 805 bytes assets/images/menu/continue.png | Bin 0 -> 1976 bytes assets/images/menu/continue_hover.png | Bin 0 -> 1743 bytes assets/images/menu/custom.png | Bin 0 -> 918 bytes assets/images/menu/custom_pressed.png | Bin 0 -> 522 bytes assets/images/menu/fs.png | Bin 0 -> 586 bytes assets/images/menu/fs_hover.png | Bin 0 -> 509 bytes assets/images/menu/ms.png | Bin 0 -> 590 bytes assets/images/menu/ms_hover.png | Bin 0 -> 521 bytes assets/images/menu/new_game.png | Bin 0 -> 2000 bytes assets/images/menu/new_game_hover.png | Bin 0 -> 1866 bytes assets/images/menu/palette.png | Bin 0 -> 1237 bytes assets/images/menu/palette_hover.png | Bin 0 -> 1236 bytes assets/images/menu/play.png | Bin 0 -> 2080 bytes assets/images/menu/play_hover.png | Bin 0 -> 1666 bytes assets/images/menu/template.png | Bin 0 -> 1157 bytes assets/images/menu/template_hover.png | Bin 0 -> 560 bytes assets/images/menu/writing.png | Bin 0 -> 370 bytes assets/maps/custom.txt | 0 assets/maps/easy.txt | 0 assets/maps/extreme.txt | 0 assets/maps/hard.txt | 0 assets/maps/medium.txt | 0 assets/maps/tutorial.txt | 5 + .../palette_manager.cpython-39.pyc | Bin 0 -> 2429 bytes assets/palettes/aqua.json | 6 + assets/palettes/emerald.json | 6 + assets/palettes/lavender.json | 6 + assets/palettes/palette_manager.py | 71 ++ assets/palettes/reddish.json | 6 + assets/palettes/sakura.json | 6 + assets/palettes/vanilla.json | 6 + assets/saves/default.json | 11 + assets/saves/game_saves/custom.json | 1 + assets/saves/game_saves/easy.json | 1 + assets/saves/game_saves/extreme.json | 1 + assets/saves/game_saves/hard.json | 1 + assets/saves/game_saves/medium.json | 1 + assets/saves/setup.json | 11 + assets/sounds/click.wav | Bin 0 -> 8236 bytes assets/sounds/join.wav | Bin 0 -> 7212 bytes assets/sounds/remove.wav | Bin 0 -> 23596 bytes assets/tutorial/tutorial.json | 239 +++++ game_effect.py | 51 + garbage.py | 9 + hashi_functions.py | 229 +++++ hashi_game.py | 933 ++++++++++++++++++ hashi_generator.py | 232 +++++ menu_effect.py | 50 + s_engine.py | 527 ++++++++++ sounds.py | 12 + widget_engine.py | 99 ++ 62 files changed, 3384 insertions(+) create mode 100644 Hashi.py create mode 100644 assets/images/game/back.png create mode 100644 assets/images/game/back_hover.png create mode 100644 assets/images/game/num_circle.png create mode 100644 assets/images/game/num_circle_hover.png create mode 100644 assets/images/game/tutorial_circle.png create mode 100644 assets/images/game/tutorial_circle_hover.png create mode 100644 assets/images/general/hashi_logo.ico create mode 100644 assets/images/general/hashi_logo.png create mode 100644 assets/images/menu/arrow.png create mode 100644 assets/images/menu/arrow_hover.png create mode 100644 assets/images/menu/continue.png create mode 100644 assets/images/menu/continue_hover.png create mode 100644 assets/images/menu/custom.png create mode 100644 assets/images/menu/custom_pressed.png create mode 100644 assets/images/menu/fs.png create mode 100644 assets/images/menu/fs_hover.png create mode 100644 assets/images/menu/ms.png create mode 100644 assets/images/menu/ms_hover.png create mode 100644 assets/images/menu/new_game.png create mode 100644 assets/images/menu/new_game_hover.png create mode 100644 assets/images/menu/palette.png create mode 100644 assets/images/menu/palette_hover.png create mode 100644 assets/images/menu/play.png create mode 100644 assets/images/menu/play_hover.png create mode 100644 assets/images/menu/template.png create mode 100644 assets/images/menu/template_hover.png create mode 100644 assets/images/menu/writing.png create mode 100644 assets/maps/custom.txt create mode 100644 assets/maps/easy.txt create mode 100644 assets/maps/extreme.txt create mode 100644 assets/maps/hard.txt create mode 100644 assets/maps/medium.txt create mode 100644 assets/maps/tutorial.txt create mode 100644 assets/palettes/__pycache__/palette_manager.cpython-39.pyc create mode 100644 assets/palettes/aqua.json create mode 100644 assets/palettes/emerald.json create mode 100644 assets/palettes/lavender.json create mode 100644 assets/palettes/palette_manager.py create mode 100644 assets/palettes/reddish.json create mode 100644 assets/palettes/sakura.json create mode 100644 assets/palettes/vanilla.json create mode 100644 assets/saves/default.json create mode 100644 assets/saves/game_saves/custom.json create mode 100644 assets/saves/game_saves/easy.json create mode 100644 assets/saves/game_saves/extreme.json create mode 100644 assets/saves/game_saves/hard.json create mode 100644 assets/saves/game_saves/medium.json create mode 100644 assets/saves/setup.json create mode 100644 assets/sounds/click.wav create mode 100644 assets/sounds/join.wav create mode 100644 assets/sounds/remove.wav create mode 100644 assets/tutorial/tutorial.json create mode 100644 game_effect.py create mode 100644 garbage.py create mode 100644 hashi_functions.py create mode 100644 hashi_game.py create mode 100644 hashi_generator.py create mode 100644 menu_effect.py create mode 100644 s_engine.py create mode 100644 sounds.py create mode 100644 widget_engine.py diff --git a/Hashi.py b/Hashi.py new file mode 100644 index 0000000..ed8d1be --- /dev/null +++ b/Hashi.py @@ -0,0 +1,864 @@ +from hashi_functions import * +import hashi_generator as hg +import hashi_game +import assets.palettes.palette_manager as pm +from menu_effect import Circle_effect +from game_effect import Rectangle_effect +from widget_engine import * +from s_engine import * +import sounds +import pygame +import sys +import json +from pygame.locals import * + +# basic config +pygame.mixer.pre_init(48000, -16, 2, 512) +pygame.init() +pygame.mixer.set_num_channels(16) +available = pygame.font.get_fonts() +monitor_size = [pygame.display.Info().current_w, pygame.display.Info().current_h] + +font = pygame.font.SysFont('calibri', 60, True) +small_font = pygame.font.SysFont('calibri', 40, True) +tiny_font = pygame.font.SysFont('calibri', 20, True) + +Window_size = [600, 650] +Default_size = Window_size +screen = pygame.display.set_mode(Window_size) +display = pygame.Surface((600, 650)) +pygame.display.set_caption("Hashi") +pygame.display.set_icon(pygame.image.load("assets/images/general/hashi_logo.png").convert()) +clock = pygame.time.Clock() + +soundsX = sounds.get_sounds() + + +def main_menu(screenX, Win_size): + # PREP WORK + # getting setup + with open("assets/saves/setup.json", "r") as f: + setup = json.load(f) + # game variables + game = Game() + game.game_flow["ac"] = True + game.game_flow["custom_string"] = setup["custom_num"] + # next 3 lines for arrow buttons + game.game_flow["dfs"] = ["easy", "medium", "hard", "extreme", "custom"] + game.game_flow["df"] = setup["difficulty"] + game.game_flow["df_change"] = False + game.game_flow["dp"] = [0, 0] + game.game_flow["back_from_game"] = False + game.game_flow["Win_size"] = Win_size + game.game_flow["cut_click"] = False + game.game_flow["change_fs"] = False + + # mouse + mouse = Mouse(pygame.mouse.get_pos()) + mouse.update(Win_size, Default_size) + + # dealing with palettes + palette = pm.Palettes("assets/palettes") + palette.current_palette = setup["palette"] + palette.palette = palette.get_palette() + + menu_objects = [] + + # loading images + play_images = {"idle": pygame.image.load("assets/images/menu/play.png").convert(), + "hover": pygame.image.load("assets/images/menu/play_hover.png").convert()} + # size 200 + + palette_images = {"idle": pygame.image.load("assets/images/menu/palette.png").convert(), + "hover": pygame.image.load("assets/images/menu/palette_hover.png").convert()} + # size 140 + + new_game_images = {"idle": pygame.image.load("assets/images/menu/new_game.png").convert(), + "hover": pygame.image.load("assets/images/menu/new_game_hover.png").convert()} + # size 300 150 + + difficulty_images = {"idle": pygame.image.load("assets/images/menu/template.png").convert(), + "hover": pygame.image.load("assets/images/menu/template_hover.png").convert()} + # size 250 100 + + right_arrow_images = {"idle": pygame.image.load("assets/images/menu/arrow.png").convert(), + "hover": pygame.image.load("assets/images/menu/arrow_hover.png").convert()} + left_arrow_images = {"idle": pygame.transform.flip(pygame.image.load("assets/images/menu/arrow.png").convert(), + True, False), + "hover": pygame.transform.flip( + pygame.image.load("assets/images/menu/arrow_hover.png").convert(), + True, False)} + # size 100 100 + + custom_size_images = {"idle": pygame.image.load("assets/images/menu/custom.png").convert(), + "hover": pygame.image.load("assets/images/menu/custom_pressed.png").convert()} + # size 100 100 + + fs_images = {"idle": pygame.image.load("assets/images/menu/fs.png").convert(), + "hover": pygame.image.load("assets/images/menu/fs_hover.png").convert()} + ms_images = {"idle": pygame.image.load("assets/images/menu/ms.png").convert(), + "hover": pygame.image.load("assets/images/menu/ms_hover.png").convert()} + # size 60 60 + + menu_objects.append(CircleButton(200, [200, 220], play_images, play, [game, palette, mouse])) + menu_objects.append(CircleButton(200, [440, 20], palette_images, next_palette, [palette])) + menu_objects.append(Button([150, 450], [300, 150], new_game_images, new_game, [game, palette, mouse])) + menu_objects.append(Button([20, 20], [250, 100], difficulty_images, play_click_sound, [])) + menu_objects.append(Button([440, 270], [100, 100], right_arrow_images, right_arrow, [game])) + menu_objects.append(Button([60, 270], [100, 100], left_arrow_images, left_arrow, [game])) + menu_objects.append(Button([480, 400], [100, 100], custom_size_images, activate_edit_text, [game], False)) + menu_objects.append(Button([20, 570], [60, 60], fs_images, change_fs, [game])) + menu_objects[-1].name = "fs" + menu_objects.append(Button([20, 570], [60, 60], ms_images, change_fs, [game], False)) + menu_objects[-1].name = "ms" + difficulty_text = font.render(setup["difficulty"].capitalize(), False, palette.palette["outline-dark"]) + + # setting up custom text + + custom_text = font.render(game.game_flow["custom_string"], False, palette.palette["outline-dark"]) + custom_text_hover = font.render(game.game_flow["custom_string"], False, palette.palette["background"]) + ct_images = {"idle": create_text_sur(custom_text, [20, 20], [100, 100]), + "hover": create_text_sur(custom_text_hover, [20, 20], [100, 100])} + menu_objects.append(Button([480, 400], [100, 100], ct_images, activate_edit_text, [game], False)) + menu_objects[-1].name = "custom_text" + + custom_pointer = palette.swap_image(pygame.image.load("assets/images/menu/writing.png").convert(), + "emerald", setup["palette"]) + custom_pointer.set_colorkey((0, 0, 0)) + + # setting up custom + + if setup["difficulty"] == "custom": + for item in menu_objects: + if item.on_click == activate_edit_text: + item.active = True + + # circle effect + + cE = Circle_effect + cE.generate_circles(50, [-50, 50]) + cE.generate_circles(50, [480, 600]) + + # last config + + menu_objects, setup = set_palette(setup, palette, setup["palette"], menu_objects, True) + + palette.create_cycle() + game.game_flow["setup"] = setup + game.game_flow["screen"] = screenX + + # checking tutorial + if setup["tutorial"]: + run_tutorial(screenX, setup, game, palette, mouse) + + # game loop + while game.alive: + # checking if returned + if game.game_flow["back_from_game"]: + game.game_flow["back_from_game"] = False + Win_size = game.game_flow["Win_size"] + + with open("assets/saves/setup.json", "r") as f: + setup = json.load(f) + + game.game_flow["setup"] = setup + + # background + display.fill(palette.palette["background"]) + pygame.draw.rect(display, palette.palette["outline-shade"], pygame.Rect(180, 0, 240, 650)) + pygame.draw.rect(display, palette.palette["outline"], pygame.Rect(200, 0, 200, 650)) + + # displaying effect + + for circle in cE.circles: + circle.move(display, palette) + + if cE.timer == 0: + cE.generate_circles(4, [-50, 50]) + cE.generate_circles(4, [480, 600]) + cE.timer += 10 + else: + cE.timer -= 1 + + # displaying widgets + + for widget in menu_objects: + widget.blit(display) + + # dealing with difficulty + + if game.game_flow["df_change"]: + game.game_flow["df_change"] = False + + # dealing with json + setup["difficulty"] = game.game_flow["df"] + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + difficulty_text = font.render(setup["difficulty"].capitalize(), False, palette.palette["outline-dark"]) + + # changing custom edit text + if setup["difficulty"] == "custom": + for item in menu_objects: + if item.on_click == activate_edit_text: + item.active = True + else: + for item in menu_objects: + if item.on_click == activate_edit_text: + item.active = False + + display.blit(difficulty_text, [40, 40]) + + # checking palette + + if palette.changed: + palette.changed = False + menu_objects, setup = set_palette(setup, palette, palette.current_palette, menu_objects) + difficulty_text = font.render(setup["difficulty"].capitalize(), False, palette.palette["outline-dark"]) + custom_pointer = palette.swap_image(pygame.image.load("assets/images/menu/writing.png").convert(), + "emerald", setup["palette"]) + custom_pointer.set_colorkey((0, 0, 0)) + game.game_flow["setup"] = setup + + # custom pointer + + if game.game_flow["ac"] is False: + display.blit(custom_pointer, [480, 350]) + + # event loop + + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + sys.exit(0) + + # keydown + elif event.type == KEYDOWN: + if event.key == K_ESCAPE: + pygame.quit() + sys.exit(0) + elif event.key == K_f: + game.fs = not game.fs + if game.fs is False: + Win_size = Default_size + screenX = pygame.display.set_mode(Win_size) + game.game_flow["dp"] = [0, 0] + mouse.mouse_scroll = game.game_flow["dp"] + + game.game_flow["Win_size"] = Win_size + game.game_flow["screen"] = screenX + else: + screenX = pygame.display.set_mode(monitor_size, pygame.FULLSCREEN) + d = screenX + ratio = [Default_size[1] / Default_size[0], Default_size[0] / Default_size[1]] + # u chose width or height here + + if Default_size[0] > Default_size[1]: + Win_size = [d.get_width(), int(d.get_width() * ratio[0])] + d = d.get_height() + dd = Win_size[1] + game.game_flow["dp"][1] = (d - dd) / 2 + mouse.mouse_scroll = game.game_flow["dp"] + else: + Win_size = [int(d.get_height() * ratio[1]), d.get_height()] + d = pygame.display.get_surface().get_width() + dd = Win_size[0] + game.game_flow["dp"][0] = (d - dd) / 2 + mouse.mouse_scroll = game.game_flow["dp"] + + game.game_flow["Win_size"] = Win_size + game.game_flow["screen"] = screenX + + if game.game_flow["ac"]: + # mouse stuff + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + for widget in menu_objects: + widget.hover_check(mouse.mouse_pos) + + # click + if event.type == MOUSEBUTTONDOWN: + for widget in menu_objects: + widget.click_check(mouse.mouse_pos) + if game.game_flow["cut_click"]: + game.game_flow["cut_click"] = False + break + else: + if event.type == MOUSEBUTTONDOWN: + mouse.update(Win_size, Default_size) + game.game_flow["ac"] = True + for widget in menu_objects: + widget.hover_check(mouse.mouse_pos) + soundsX["click"].play() + + # checking if num big enough + try: + if int(game.game_flow["custom_string"]) < 2 or len( + game.game_flow["custom_string"]) == 0: + game.game_flow["custom_string"] = "2" + except: + game.game_flow["custom_string"] = "2" + menu_objects, setup = update_text(menu_objects, setup, game, palette) + + if event.type == KEYDOWN: + if event.key == K_BACKSPACE: + try: + game.game_flow["custom_string"] = game.game_flow["custom_string"][:-1] + + menu_objects, setup = update_text(menu_objects, setup, game, palette) + except: + pass + elif event.key == K_RETURN: + mouse.update(Win_size, Default_size) + game.game_flow["ac"] = True + for widget in menu_objects: + widget.hover_check(mouse.mouse_pos) + soundsX["click"].play() + + # checking if num big enough + try: + if int(game.game_flow["custom_string"]) < 2 or len(game.game_flow["custom_string"]) == 0: + game.game_flow["custom_string"] = "2" + except: + game.game_flow["custom_string"] = "2" + menu_objects, setup = update_text(menu_objects, setup, game, palette) + else: + if len(game.game_flow["custom_string"]) < 2: + try: + int(event.unicode) + game.game_flow["custom_string"] += event.unicode + + menu_objects, setup = update_text(menu_objects, setup, game, palette) + except: + pass + + # checking fs change + if game.game_flow["change_fs"]: + game.game_flow["change_fs"] = False + + for obj in menu_objects: + if obj.name in ["fs", "ms"]: + obj.active = not obj.active + + game.fs = not game.fs + if game.fs is False: + Win_size = Default_size + screenX = pygame.display.set_mode(Win_size) + game.game_flow["dp"] = [0, 0] + mouse.mouse_scroll = game.game_flow["dp"] + + game.game_flow["Win_size"] = Win_size + game.game_flow["screen"] = screenX + else: + screenX = pygame.display.set_mode(monitor_size, pygame.FULLSCREEN) + d = screenX + ratio = [Default_size[1] / Default_size[0], Default_size[0] / Default_size[1]] + # u chose width or height here + + if Default_size[0] > Default_size[1]: + Win_size = [d.get_width(), int(d.get_width() * ratio[0])] + d = d.get_height() + dd = Win_size[1] + game.game_flow["dp"][1] = (d - dd) / 2 + mouse.mouse_scroll = game.game_flow["dp"] + else: + Win_size = [int(d.get_height() * ratio[1]), d.get_height()] + d = pygame.display.get_surface().get_width() + dd = Win_size[0] + game.game_flow["dp"][0] = (d - dd) / 2 + mouse.mouse_scroll = game.game_flow["dp"] + + game.game_flow["Win_size"] = Win_size + game.game_flow["screen"] = screenX + + # basic loop config + + screenX.blit(pygame.transform.scale(display, Win_size), game.game_flow["dp"]) + pygame.display.update() + clock.tick(60) + + +# new_game_btn +def new_game(args): + game = args[0] + palette = args[1] + mouse = args[2] + setup = game.game_flow["setup"] + screenX = game.game_flow["screen"] + setup[setup["difficulty"]] = True + + if setup["difficulty"] == "easy": + hashi = hg.Hashi(5) + elif setup["difficulty"] == "medium": + hashi = hg.Hashi(10) + elif setup["difficulty"] == "hard": + hashi = hg.Hashi(15) + elif setup["difficulty"] == "extreme": + hashi = hg.Hashi(20) + elif setup["difficulty"] == "custom": + hashi = hg.Hashi(int(setup["custom_num"])) + else: + sys.exit(55) + + hashi.generate_map() + hashi.save(f"assets/maps/{setup['difficulty']}.txt") + soundsX["click"].play() + + run_game(screenX, setup, game, palette, mouse, "new") + game.game_flow["cut_click"] = True + + +# play_btn +def play(args): + game = args[0] + palette = args[1] + mouse = args[2] + setup = game.game_flow["setup"] + screenX = game.game_flow["screen"] + + if setup[setup["difficulty"]] is False: + new_game(args) + else: + soundsX["click"].play() + run_game(screenX, setup, game, palette, mouse, "continue") + game.game_flow["cut_click"] = True + + +# at this point the whole menu is done and the game is ready to be run so here we go +def run_game(screenX, setup, gameMenu, palette, mouse, state): + game = Game() + game.game_flow["dp"] = gameMenu.game_flow["dp"] + game.fs = gameMenu.fs + hashi = None + Win_size = gameMenu.game_flow["Win_size"] + game.game_flow["scroll_length"] = (Win_size[0] - 60) / 2 + game.game_flow["quit"] = False + + scroll = Scroll([-20, -20]) + + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + + back_btn = Button([200, 350], [200, 100], get_back_images(palette), go_back, [game]) + win_image = get_win_image() + + # initing rectangle effect + rE = Rectangle_effect + rE.generate_rects() + + # initializing game by state + if state == "new": + hashi = hashi_game.HashiG("file.txt", f"assets/maps/{setup['difficulty']}.txt", palette, mouse) + elif state == "continue": + hashi = hashi_game.HashiG("file.json", f"assets/saves/game_saves/{setup['difficulty']}.json", palette, mouse) + + hashi_top_lim = [(hashi.get_length() + 40) - 600, (hashi.get_length() + 40) - 650] + + # pre scrolling + scroll.move_scroll_based_on_pos(mouse.get_scrolled(scroll), [600, 650], "both", 40) + + scroll.scroll_lim(scroll, [-40, -40], hashi_top_lim) + + while game.alive: + # dealing with hashi locked + if hashi.locked: + hashi.on_locked(mouse, scroll) + + # background + display.fill(palette.palette["background"]) + + # dealing with bg effect + for item in rE.rects: + item.move(display, palette) + + if rE.timer == 0: + rE.generate_rects(5, [1, 3]) + rE.timer = 10 + else: + rE.timer -= 1 + + # dealing with scroll + # not using mouse.mouse_pos because screen size affects + if distance_indicator(pygame.mouse.get_pos(), mid_point_scroll_mouse) > game.game_flow["scroll_length"]: + scroll.move_scroll_based_on_pos(mouse.get_scrolled(scroll), [600, 650], "both", 40) + + scroll.scroll_lim(scroll, [-40, -40], hashi_top_lim) + + # game + + hashi.blit(display, palette, scroll) + + # win screen + + if hashi.win: + display.blit(win_image, [50, 50]) + + back_btn.blit(display) + + setup[setup["difficulty"]] = False + + # event loop + + for event in pygame.event.get(): + if event.type == QUIT: + # saving before quiting + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + if hashi.win is False: + hashi.save(setup) + + pygame.quit() + sys.exit(0) + + # keydown + if event.type == KEYDOWN: + if hashi.locked is False: + if event.key == K_ESCAPE: + gameMenu.fs = game.fs + gameMenu.game_flow["dp"] = game.game_flow["dp"] + gameMenu.game_flow["back_from_game"] = True + gameMenu.game_flow["Win_size"] = Win_size + game.alive = False + + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + if hashi.win is False: + hashi.save(setup) + else: + if event.key == K_ESCAPE: + hashi.locked = False + hashi.clear_temp() + hashi.clear_temp_remove() + + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + + if event.key == K_f: + game.fs = not game.fs + if game.fs is False: + Win_size = Default_size + screenX = pygame.display.set_mode(Win_size) + game.game_flow["dp"] = [0, 0] + mouse.mouse_scroll = game.game_flow["dp"] + # specifics + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + game.game_flow["scroll_length"] = (Win_size[0] - 100) / 2 + + else: + screenX = pygame.display.set_mode(monitor_size, pygame.FULLSCREEN) + d = screenX + ratio = [Default_size[1] / Default_size[0], Default_size[0] / Default_size[1]] + # u chose width or height here + + if Default_size[0] > Default_size[1]: + Win_size = [d.get_width(), int(d.get_width() * ratio[0])] + d = d.get_height() + dd = Win_size[1] + game.game_flow["dp"][1] = (d - dd) / 2 + else: + Win_size = [int(d.get_height() * ratio[1]), d.get_height()] + d = pygame.display.get_surface().get_width() + dd = Win_size[0] + game.game_flow["dp"][0] = (d - dd) / 2 + + mouse.mouse_scroll = game.game_flow["dp"] + # specifics + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + game.game_flow["scroll_length"] = (Win_size[0] - 60) / 2 + + if hashi.win is False: + if hashi.locked is False: + # mouse stuff + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + + # click + elif event.type == MOUSEBUTTONDOWN: + hashi.click(mouse, scroll) + if hashi.locked: + soundsX["click"].play() + else: + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + + elif event.type == MOUSEBUTTONDOWN: + hashi.locked = False + hashi.click_on_locked(mouse, scroll) + hashi.check_win() + + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + else: + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + back_btn.hover_check(mouse.mouse_pos) + + elif event.type == MOUSEBUTTONDOWN: + back_btn.click_check(mouse.mouse_pos) + + # quiting on back button (same as esc) + + if game.game_flow["quit"]: + gameMenu.fs = game.fs + gameMenu.game_flow["dp"] = game.game_flow["dp"] + gameMenu.game_flow["back_from_game"] = True + gameMenu.game_flow["Win_size"] = Win_size + game.alive = False + + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + # basic loop config + + screenX.blit(pygame.transform.scale(display, Win_size), game.game_flow["dp"]) + pygame.display.update() + clock.tick(60) + + +# tutorial +def run_tutorial(screenX, setup, gameMenu, palette, mouse): + game = Game() + game.game_flow["dp"] = gameMenu.game_flow["dp"] + game.fs = gameMenu.fs + Win_size = gameMenu.game_flow["Win_size"] + game.game_flow["scroll_length"] = (Win_size[0] - 60) / 2 + game.game_flow["quit"] = False + game.game_flow["tf"] = False # tutorial forward + game.game_flow["t_step"] = 0 + + scroll = Scroll([-20, -20]) + + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + + back_btn = Button([200, 350], [200, 100], get_back_images(palette), go_back, [game]) + win_image = get_win_image() + + # initing rectangle effect + rE = Rectangle_effect + rE.generate_rects() + + # initializing tutorial + hashi = hashi_game.HashiG("file.json", f"assets/tutorial/tutorial.json", palette, mouse) + + hashi_top_lim = [(hashi.get_length() + 40) - 600, (hashi.get_length() + 40) - 650] + + # preparing tutorial circle + tutorial_circle_images, size = get_tutorial_circle_images(math.sqrt(hashi.indent/hashi.indent_default)**1.5) + tutorial_circle = CircleButton(size, [120 - (size/2), 120 - (size/2)], + tutorial_circle_images, move_in_tutorial, [game]) + + # pre scrolling + scroll.move_scroll_based_on_pos(mouse.get_scrolled(scroll), [600, 650], "both", 40) + + scroll.scroll_lim(scroll, [-40, -40], hashi_top_lim) + + while game.alive: + # dealing with tutorial + if game.game_flow['tf']: + game.game_flow["tf"] = False + + if game.game_flow["t_step"] == 0: + game.game_flow["t_step"] += 1 + hashi.click(mouse, scroll) + tutorial_circle.move([0, 240]) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + soundsX["click"].play() + + elif game.game_flow["t_step"] == 1: + game.game_flow["t_step"] += 1 + hashi.locked = False + hashi.click_on_locked(mouse, scroll) + hashi.check_win() + + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + + tutorial_circle.move([240, -240]) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + soundsX["join"].play() + + elif game.game_flow["t_step"] == 2: + game.game_flow["t_step"] += 1 + hashi.click(mouse, scroll) + tutorial_circle.move([0, -60]) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + soundsX["click"].play() + + elif game.game_flow["t_step"] == 3: + game.game_flow["t_step"] += 1 + hashi.locked = False + hashi.click_on_locked(mouse, scroll) + hashi.check_win() + + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + + tutorial_circle.move([0, -60]) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + soundsX["join"].play() + + elif game.game_flow["t_step"] == 4: + game.game_flow["t_step"] += 1 + hashi.click(mouse, scroll) + tutorial_circle.move([-240, 0]) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + soundsX["click"].play() + + elif game.game_flow["t_step"] == 5: + hashi.locked = False + hashi.click_on_locked(mouse, scroll) + hashi.check_win() + + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + soundsX["join"].play() + + tutorial_circle.active = False + + # dealing with hashi locked + if hashi.locked: + hashi.on_locked(mouse, scroll) + + # background + display.fill(palette.palette["background"]) + + # dealing with bg effect + for item in rE.rects: + item.move(display, palette) + + if rE.timer == 0: + rE.generate_rects(5, [1, 3]) + rE.timer = 10 + else: + rE.timer -= 1 + + # dealing with scroll + # not using mouse.mouse_pos because screen size affects + if distance_indicator(pygame.mouse.get_pos(), mid_point_scroll_mouse) > game.game_flow["scroll_length"]: + scroll.move_scroll_based_on_pos(mouse.get_scrolled(scroll), [600, 650], "both", 40) + + scroll.scroll_lim(scroll, [-40, -40], hashi_top_lim) + + # game + + hashi.blit(display, palette, scroll) + + # tutorial + + tutorial_circle.blit(display, scroll) + + # win screen + + if hashi.win: + display.blit(win_image, [50, 50]) + + back_btn.blit(display) + + setup["tutorial"] = False + + # event loop + + for event in pygame.event.get(): + if event.type == QUIT: + pygame.quit() + sys.exit(0) + + # keydown + if event.type == KEYDOWN: + if event.key == K_ESCAPE: + gameMenu.fs = game.fs + gameMenu.game_flow["dp"] = game.game_flow["dp"] + gameMenu.game_flow["back_from_game"] = True + gameMenu.game_flow["Win_size"] = Win_size + game.alive = False + + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + if event.key == K_f: + game.fs = not game.fs + if game.fs is False: + Win_size = Default_size + screenX = pygame.display.set_mode(Win_size) + game.game_flow["dp"] = [0, 0] + mouse.mouse_scroll = game.game_flow["dp"] + # specifics + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + game.game_flow["scroll_length"] = (Win_size[0] - 100) / 2 + + else: + screenX = pygame.display.set_mode(monitor_size, pygame.FULLSCREEN) + d = screenX + ratio = [Default_size[1] / Default_size[0], Default_size[0] / Default_size[1]] + # u chose width or height here + + if Default_size[0] > Default_size[1]: + Win_size = [d.get_width(), int(d.get_width() * ratio[0])] + d = d.get_height() + dd = Win_size[1] + game.game_flow["dp"][1] = (d - dd) / 2 + else: + Win_size = [int(d.get_height() * ratio[1]), d.get_height()] + d = pygame.display.get_surface().get_width() + dd = Win_size[0] + game.game_flow["dp"][0] = (d - dd) / 2 + + mouse.mouse_scroll = game.game_flow["dp"] + # specifics + mid_point_scroll_mouse = [game.game_flow["dp"][0] + (Win_size[0] / 2), + game.game_flow["dp"][1] + (Win_size[1] / 2)] + game.game_flow["scroll_length"] = (Win_size[0] - 60) / 2 + + if hashi.win is False: + if hashi.locked is False: + # mouse stuff + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + hashi.hover(mouse, scroll) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + + # click + elif event.type == MOUSEBUTTONDOWN: + tutorial_circle.click_check(mouse.get_scrolled(scroll)) + else: + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + tutorial_circle.hover_check(mouse.get_scrolled(scroll)) + + elif event.type == MOUSEBUTTONDOWN: + tutorial_circle.click_check(mouse.get_scrolled(scroll)) + else: + if event.type == MOUSEMOTION: + mouse.update(Win_size, Default_size) + back_btn.hover_check(mouse.mouse_pos) + + elif event.type == MOUSEBUTTONDOWN: + back_btn.click_check(mouse.mouse_pos) + + # quiting on back button (same as esc) + + if game.game_flow["quit"]: + gameMenu.fs = game.fs + gameMenu.game_flow["dp"] = game.game_flow["dp"] + gameMenu.game_flow["back_from_game"] = True + gameMenu.game_flow["Win_size"] = Win_size + game.alive = False + + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + # basic loop config + + screenX.blit(pygame.transform.scale(display, Win_size), game.game_flow["dp"]) + pygame.display.update() + clock.tick(60) + + +main_menu(screen, Window_size) diff --git a/assets/images/game/back.png b/assets/images/game/back.png new file mode 100644 index 0000000000000000000000000000000000000000..1952d7c1e9b3d75fa70c1888034e40676fd31ec9 GIT binary patch literal 1062 zcma)5drVtp6u%6(ecTIW6$qIduoXn0l*_X`%6JMi47e$5;N;c8MucWGVQ$b6$v{Cf zg({3L%&{2|2EE~a&M|S+x!!9c@+veNM9oxCk%ya?fsru~zsB&tf1L09&dD$5JI{B? ztTZR#0U?4QPRjHY71X0p%J}=>d+gVx0;ue&RcT4c;MBooXgHK7W+o!Yr>)qw+7a3U zZThR#2;%N*6Fa5KheHti5oJnZZcWkS2Z=4NA$Y>f(SXYHA2mk=%9Q%WTTlajeP(GKl8O+Pe$ZY+kns-4to&0Rt>}Kun8jt1G`^U|V)V|5d ztygskeY|e#b6ql2!8_YK8O0v6J1PsGm)ysx9|=!IJuE%Ii!a}7I*X~x;`*aDowP$| zoof@a2M%o`!?_hM0+TZ~r?gi^>-M|LK19s8WuQWP$$`H(x;q%|_#NK#iT~&sLYkQv z$@;Q)r*pni{BdfyD8Hus{(C1F8B?3TIUd7J*_ECYjPUb>SgV5RvH4Fk3}(mLoO684 zGEUH!!6ofQz}>;uPvWcmhb+T}PE^KeeA=BcdW@ihKszayD*Rc~d2>h-rz6zpHuStUL1VbPUav^L0w?H)HP7!nk zpg}z3{+B;_ghEB51RVqVNnZ-Bg766FC10jc3xq<@O$JivUQ=Wg+6w#gCAdb0Q0Si! zz7IOda0<l1)e_|EDubWHfta z^yw!{@;e(eC~I{s3-jpc^}Y&2!lm2Ajb=Bo_Z10i{r&Kj?zGs=K1qR(Q~Ga9RmUxC zh4$J5Z}F0PsL=~CtSstz8$Am@e~#y^-f>BtZG-E6ospjld}ltlRlrNO%p13KV9lUQ zeO8jSrSFfESsu1gYBrAod@+dnxB5rIMUPmO-Q|#e$qe3Jym$t ZBhh|2l8X^52jOia%2%>d29rt}{sm-6)o=g+ literal 0 HcmV?d00001 diff --git a/assets/images/game/back_hover.png b/assets/images/game/back_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..b3db56545b08ec40a3743d99fd753d17c3366aeb GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0vp^CxAGGg9%9bJb4iVq!^2X+?^QKos)S9a~60+7Beu2se&-0XOPMV1_q`APZ!6KinzCTz5S#E1=<4Vq_&nCB%N7h zbWY>7!fP+b?Fv7x+QjS&onEZ6;OLb8|J$M!-sjzWdwu@>*P{2Y9=`jxYHO;sj%{Ja z<_*P(o?V~MJt;NP3H>Oy{Far_v?V_#EY5w~zEsODU4Om&>+9*O9tGWNVV%EiyVrX6 zg*zX;j^jIGsuNnM=^fqY6l9}2ZRev+Nn3QpG+SJ|<`z%j5$hH?q|~~>&}bDL8G_txSPyX`ykVVj;FV zp{Ai$I-y@f&2>VzhMDMumWCVZg!(RsiC8tudF_S}(_W{9{ zI#O{>{&TDKT-tVdA2Ldqn8mU;OZTg&89dXta_vjo-Q>*dJmvg*TTM3}T+g-DboIeR z)?DArnh3|}&zgc^7p|qOY7yOHI@t*%yf_RfT&y7u6lT$C6Www(_Tq-7ZBeVG!!Cry zFFnjPJ2x=+D^SELO8_WhZF`98)~lty5f3-$Zk_rx_KoMo%#9f?5laL>;mDOZ(TND= zjic@R{hn=-d-qOPOmm)?wuG*p>N737Xq})n-J(5W@!QXYR`6isb#_C`7v!{ z)5S-{|K_jWARl%?Onz&4sD;oqr?@@G6N9=Z1N~5VZ{?~(J2!}ZdURpt60zHfx=&nh fyvZyr{>&fSaV$c67I!)@K{9x{`njxgN@xNAe4sq% literal 0 HcmV?d00001 diff --git a/assets/images/game/num_circle.png b/assets/images/game/num_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f3a427864fc04e5049bc7e9605abada9e8ebaa GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`i@T;ebV~B_M+i8|UhYWaJefwPXoPCdbzF4u- zXNTB>o+%saQ%-hH5BQK~RH$sL+ge+6ZtwnhvFW#``Wc=7-Rx%;ndIH^L}WqNb}qrS z41sGnkAL=9KI5h7#mwH21713w!J9;a1U2Me*athmnwVrzuHyF1LsGj;Fxgc#h^@GV zZ{uUBAT`zbM-x>|m-b8vzFX+cb|;sAkMXM=M`uW$slBt}<^8$)cSui+*nP|E;GM(M zo_p!;`Fta=J$Adq_9?+{b}W-AE}YygQGR#P=L-wp?QnUQy!D4iPi*zK6H6t|{Ix!R wd%~sNQ9?$q`nEc7Ylpp+*r+xkenqjolV`^E2*WqLzyM(IboFyt=akR{045@h{Qv*} literal 0 HcmV?d00001 diff --git a/assets/images/game/num_circle_hover.png b/assets/images/game/num_circle_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..3d653cdf9fdeba5a37144cb09b80678729c7e870 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iaE+&nV~B_M+v&D^4GKJN-Q^`k-$Ks$$pu{u zXj=ME-NE{WcaP4uuZxc@U~IS?=bCf;U6{@5Jv&0@DHZy8Xl5#Ct`iLk;@$8lOtCdP zp{U$H|0QquXH_{x*NnFs8%5%5jC6&pjtDRQBj~+k>58*AZfrR^|IEA>`>$U5lVoV8 zvCeYcmq%r<^0vBVeLNy@sarLuo$s!svU2d{TY--Ri`Ff>)o5q=c-ohp=~L@&G3ZTJ WG0*Ecu>3aA-3*?telF{r5}E+J(Q0r2 literal 0 HcmV?d00001 diff --git a/assets/images/game/tutorial_circle.png b/assets/images/game/tutorial_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..0b3c5d07156afccb01407416d0e672e015971fe6 GIT binary patch literal 281 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 literal 0 HcmV?d00001 diff --git a/assets/images/general/hashi_logo.png b/assets/images/general/hashi_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..469eda7a3652b42c272ede6fc2d11085a0682a22 GIT binary patch literal 101553 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%0D;zj+CkFlx0%cmgRto0` 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 XpbCFfsb*JM00000NkvXXu0mjf%Jnp0 literal 0 HcmV?d00001 diff --git a/assets/images/menu/arrow.png b/assets/images/menu/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..81ae3e757f4b70f9ba4bb8c39a2bca1b0b96528a GIT binary patch literal 968 zcmV;(12_DMP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L16@f(K~#8N?a)Dv z+b|GB(K%|?+2uT0XO&CFfC@t6*_P>vB~cPT{>B!`uIjJBU@#aA27|%i5d8l8XEMJB z&zLtgn-7C~*wkdc4S+ROb7C;Vg6_?^!3|dP&>S7Gmj!d-%CM0izkc#hHFqux>$ojz zd0#hk^MbI5X<1`sk6{IMS(6;7=85Y-e>OGA8O%dhfaa{J%1O*~=Z4NK=w8lO^Wur2 zFspeeS1|9M5~{M71-V$w)8~VpY-CyPVg{TE8nTWSc>y!#9MFwLw97lyOgaG+V+C)? zQ^3 z|2=sV6RtN%xh#eMU*4}KUsn+Ep)~xg%)+GX1j1EmwW^G+CTI_kY?3D1NCr&YeIXMC zwwFAZ(0f4|qVFZCs>!_zL?QH!5)6}mV+cXw-6bBT!)7p^ter^6YHDl)vq{;HSMmH%VJfpH*Qb;X0JSm{u#nFp_mEv8ySz223JT=MsK4-98RuNYlUMpG>!p!x*CU zEXk|s_Hh_Ppgtutrq~)ViC7&<;A$$Z2lGhQl|;q#SrtZ-uM-K0X|e$fCS?zju$m5= z!FYo1E7>pwwuA)4-AhtoqHhm52)&C$swVVakY#Cj;j zJ}%>`N!ba6Tb7dlFYjX__5=A^r11CTO-#7nAZ1IF$+`A7$6 z#IoGQ3^)@sWE~4~v6`pP2R+%yL%D)^_mohTy%FP<0*vz;m@t9k46P@4r!at8Cz z6`=W8(-QP=+*B@K4Yu%dO*eD%g0P5XbLXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0=h{=K~#8N?b$(2 z!$1s$;li=#WmvQ0Bt<%`iN`aakQx@P#9up2%4J!WWm%SGS#f4|$&J^8k>=>$*VrrJt_Ps4e(vS|&4^jm2#SuFil zTE>FJTWKGQWF0Y=SdeeTEKl%{q&e|BP8LhEl|5oXg01WqOJ7D3Kbd^0KG*s)^;4 ziG>}p;#f!2H4*|QGmd4FX)n}P+Qc$%v=?W@nqs*&5+aOPWvrf=*y$ry9P5-!dnYFA z_pO5!dbgA}tmxyY)OfK#@8y(iyfqYhZsn+x#d>b#@UfuJRwju>I*eGJSl~Kh*nP>6u!t=~KmW8YnjWy&))#h}9ip zhRO2VJ7Mft-g_sEx`uuBP8f2sy6v4X(myQ7DFekSW3g`4&dmg^vA{c7&$GC~CKfZV z7Ga>6aV#)N7Ag}I$3h7GFM*b1LH16lj0H!Mk)mn=2Z}Yt0;^<^Gl4-YcBI;)rz_8m zkO?efLFu5yA1G!Y3l1hzgvtb7u~`h7*Cl%h=W zOOYP2D3e}lI||Qt4M*QQ!Ev$@?495eE6v^s#%q{t?*z-q%C~odO{}bYC$z3%?!6P5 zCM*5k36-%X**l?l4Ru*Ffmy8FnZV}LaE4N(b+RVO1og3|$^?~bIAJMLJXv#Qg6FXa j_nNuXvMkGz)#dUJA=_00000NkvXXu0mjfcvo^< literal 0 HcmV?d00001 diff --git a/assets/images/menu/continue.png b/assets/images/menu/continue.png new file mode 100644 index 0000000000000000000000000000000000000000..277f7105cf26c9502fe11e3be1dc7c1009b93d64 GIT binary patch literal 1976 zcmbVNeK-?}8sEm$hI`_kreyjM=O_-c`3#ZH!lBw3t$eh#x|7j|MY86jD@P4WF&{Zf z6lR;Dts)->#YvllZ8pmhBi6X3O~!P0?sNaSf1dlt`|*3<_j%sueV_OFz1I(ip-iEc zPyhg68gwua4FCWg^gd&~kzSvQvwC1i^bhq102=AWt9Y;;L(U&O zMg{<2wtosR2)*-P0KmG?pg@02N{mV#ohWnr*646ef3VwaV#j6M%l%}x$@qTccjzkV z&a4yWNB0u5e-=tW{(rptd!L=ExTdD&@sa^9^=s4`#MvhkoVA^s;oQ>RtzG+c#na%+ zq?mrUxH(ynXI!p{-nto za&4pYKUwey5{|l}RV5njWs1ieikrPWTUo7{;g%6ykSDuL8!44VCaharb4(}W)*r#w zB8of8Y*-nEF`FAVW1qI}#)GH&1UE1mgi7D(@O`8!(;x&3L>_MNJ2veY%}@q zjQZm2PEgkd?7mGPT`#zn-KWj!ExWyHq|>+Pe>D_M#W;mH3;`5=zPcEw}yI z)^q7$U;nenl~-SvOOHRM)j!M^!Dez&S#4oTouW@AlP;)-m1}5S)XH5iV+Y?e_8PXf zFFMvfQa2ZU8%b4NNcT+SG$X^>)K5AvC&ZwBn+bo$^%iSKv}$aPH5EIky?oFNyT$j1 zcgn%;-sCu0C~v5~!K{2XW?+6hh-5F3RYintVT&bu?h9N!yT7pIlR3RYD^#@m2X7Vy zd|WzEcC`UcW0TbH7kPPQE3~p(ER%7thp8d7u}TalUvE3FE@&doS)dW?VSz;)?G%sqH)t-^$RCd}ldDR-xQR3;ckEfYaXqq*PjM`?u^5x;1Xh5jWU8I(z|n7pj3R`cPGDJU z>;kV?yIf@v^6m7*h0x8|B`613%a;x$G%KW^c}R-@rAw#yljEXb%m{2aqGcKH@15JWp9f(1@R9~AyT+hiEA z4Tf#YX*FNejn)~ErmuP|^3x9mY-bD^iuwT9-P$AK=FYig^PB;ji5>^;qEvfQ%DnE= zfuLVZ!Ld!5(S}FcEKUlE^qBV#@JV(<^IQ#-EmB&UaZpjWsU@;UKl_-^t4&81z1qW9 zXdVxd)R?XYu?x)}L?Z3cSk{)>Wl?kg#(q;44DL1odiPtFru~8>m%JK#96_Q@6)ZeH zK)P4`A}O0&_B$f8sH~*I__WgNfmou|nSme1_HOdwgyhAK{H`WO`Vr+A{kc{mQxj4A z4iSG_s+A{?LYex$jy}jkgs{^t`@LN&UsLN8%ZZv%YxqFvYf)M?ry#C%W+r%H;_Z{q z6?d$u?MbqjAaCB?{*iheW$`wt$49se`HzmY)o0~8q{5q34v9SbId%A8G@)KF%oAcx z@fa>G*0yne#q~#5e6;R!)?1%Ha*~JGaonDv#ZM9zV`MjS>mR`4<|;L0qN}>YmQ~t= z;j*q{c2btqlj8G@rw40b+rX|Tt=Pb*I>>8LHtub=4n%AX0hST5T=%3njE>0CN-&(;^j>;P$KVa za+!fL_&ku5>RXUx?2s|ovN~dw;iLZmIW;xuz^H5%91Q!iU;k|ZK?lMDIRUt<{{{nP Bt#$wa literal 0 HcmV?d00001 diff --git a/assets/images/menu/continue_hover.png b/assets/images/menu/continue_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..8e56712e4e7f4e36c82f247d22601b8867094433 GIT binary patch literal 1743 zcmbtVX;+d76n-UCP*aMeQe4n#oHDaab4OoI+)cC162WoFY^(&0biy=noHER8aB?3D z%^a6;BOzC`4pVAwsiU?a9d}VQrU`+;<`>MF4|hBFdG5I%?s@J{$NX`dHS{z90NCv1 z=^g|CD(1?Z34rFXJQup6^0*##e?rwMwl0}jdCsxZ4! zUB3NJyU)#Y{l*0*x`=ic3Rx5ft}nEe-E|?Por9^6v)}b;8{x*(Qd=2@-h)a)JB*JO z+iGO&P6V4=2?Z3Zh;N`>FpM$EnISgU$V542*C8R{Gz7wwc4IUJBis%WoD)HpOavrc zLAO+dIjQVOE&STuf%!`GfT0`C*p-4#jfYqw|( z_i5beaIC*C(>HcyCgiY$^uh?<7(dT8kSFI0&q(vjf5di_t*t&S(@$S+DP!{#C0)`p z64bru;RKiS&Du3fw=m?RwMO#&H(!0r^6SHgo=*|LLGj^+!#aKc!)r*`a^? zxpUT)o4S*u{s$#h-~=l|UCiJ_7grX_=5%F__bxq|qT6#OM6|fPCSFQdFLkM)5;})^ zTbPjaIg8PM=#-g>Hc{%G+hkl(W$ei3rI0P|C92jTI3L-;F0J-C`=6ak6qEP%%|s!8 zHc#L8nr7L?`5U&#*g6v?%enZd`dKH7sQA{mg_=TKU^u zRQ=(O1%%=L3o+}0L~;3cYk9<2x3ZjZ1qF6Lwsaf0Uae zK`@6swU^Y)s{*rok#SCY1uyy& zS#V6C$JCx%j_Ogg+9?~#mOk@`t`Cb&YE>(q^NKBR6TUfjFqQNLeJ+w}4HX2w3ItuX$h?w zU-i&Ie->g^Z9_zA`NTq9^`-bo?7Ce&q7$;3J8fdPSc75vJhjboKh*jL(#YtHYuZw;du9|$WHX$(K9ZBS|*h|aPIyR=X72i(=ZyWfX zT)bU_dDx+?$T%p;+ouWXeb2P{d__qUbB2^Xu)Hgp07A+iZ0i)>KaqQCB9B$^+3Jqw zwQ~E%gRyE816`H%Ej!y%u&ark57Cmmj~0v2JBWJML*2^boxDGoFxz;Uq(P8`&Gq=k z&EClIGpMRg`Se`u<&(?s7^ZE0V{i)&3&^LKLPF- z>6G(zW8?`#w&i@7sxa27bd%`&Kh$mW^a=5q<5C>91=%rm-njVi6y&sEuAm9kFc|-7 zJXib4tPyTg_382X;Q>fRyY;Nw)3MSW!bfH{E3@2JS)2@gqa?eDO!<|y3zF!UrN+Zf zF9Z)P{<2N7w!kWvU|&->!rixkqkf@DD*r=;zUte5)~>It;`NauSgLHT23V7A#G@UE+rji=#t)Ze`tB&7WV1Kbvl literal 0 HcmV?d00001 diff --git a/assets/images/menu/custom.png b/assets/images/menu/custom.png new file mode 100644 index 0000000000000000000000000000000000000000..854ea6ce33ca3683f673e0926eab6588b64edc0b GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^DIm!lvI6;>1s;*b3=CqbAk63)r1F7*fmz$r#WAEJ?(GG~EY)xc=R|$e$7iZ+ZO>`U z_Gxta_#;Q=aoOZO+TF&NLq-2r{ybOyPyXlQ3MS*&DrjS1Unu7)RvxpptsTd>XZu`Yg(qC=evIQ!6j0lf)fe?9b4SRYhF}X{9lw6*IwRuUY4i5eO0Bg4R6gC4-3nX zQ`U(BKfWXukt~EAq++Td0&mnI$Z{FXRA9e=6 x+!`-rS1V!r>Ga|JdDHKGp8NjK^~%bh>`m@b2WLDwqXW!K44$rjF6*2Ung9f3VIlwk literal 0 HcmV?d00001 diff --git a/assets/images/menu/custom_pressed.png b/assets/images/menu/custom_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c333994ea51379ecd2441f7515010ac9dab57434 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^DIm!lvI6;>1s;*b3=CqbAk63)r1Al%VZNt}V@O5Z+dCU`4;u(L1ga+=J-x(ly62^( z=Zwz9SURxydW#&*S7`A4cfF%ky7taVS^rD>D?HEVy`L}t^2?LDefuu2jLu(^D3$v) z+`7-SU|Ep=rsjyrQ%>DF8MQG@duzs*RmW!;2XDLn+SE4m#_Xx5Qhe>gZkFx4woxZE z>g%q~)Rk*DO~0@6z$&uu>O7kmKd}TIg|!Ql z8s0Cm+&}knCdc&q-d3h}i^b0-EM=-vzAj)Ob|9%V?}xBs{*%a*N2rghm8caE&x(|qtGQ=Xc(Ma5Gy>e$XF#Z@k MUHx3vIVCg!0MVzPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0pCePK~!i%?V2%8 z1u+an|52&wI1e=ym;9D&S))ldn`{z0NJOsyXX1JKf(l+&=i}=$9aHH!^fDdOY8-lS z4(3OPLI+}^cqnlu=BkJ8l<(i4L`cRt*VrK|;ZmAj=0a}5>Bb5fvNWYPFv;sokNNfVT(zOydM&ieCw7 z($(H_;^0+|bfdI7#JP|l-EO>{3(?X&b=6xR3Zc@SUDbdOg*fS@(tg{>tOe_Cemu${ z&a1bZz{X)|AC^~J!O|{ipX0=bF<@^?8l(8NPa?tUUTK120bu)$v_JuY0x_V#ur%F< zfeueTX@z3D!RqJI3WfK9rT5YfB^`=w0viXUkPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0g_2XK~!i%?b=Ol z!axj$;lQ!VIl5xqQ+3@{&jIJ^hdeT2lKExu=TUiuRA^Z|xDF^Hhb7VX?@zeL>+ACz z?mf1H_P|}YrN?M*Vr@;oqup{fbsy!&6zN#Qr2UUs!@O^ko=7a+COsc|Ix*rLh?na{ zZsBobgh{8Yr;k&(SBkS9`571Wob>>!ey-b?A1*@g(DOeLI}S%OdRJV08BBD9tKSnE zIxo%-n}be?D~C-$cW;GejV_AyH<=AFML$1d$qrpFmOo{lV1#a+asCMw=uumty&OGU zj7$&2A!1~Q9wkQab408DJsNKmatn`N)-bezRU3o06r%y?NIdYZE!DGVdojwPi~n?r z7$wmH%D7o#)VUr+F-oGPx#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0pm$TK~!i%<(o@R z13?T#Cpi|mOxD@uB#;t`AnD(P zXOIQhYiYmPN=K6Ar1p(qRy$`YyliwQ@U&G8abniF0albO~Ysi~obOD{tbVTF5S zK}g}+`bvZo9+3s+!Y$Ptl?A54Bv2!*AqzrOT1ys~3iC~;Qr46Ot`pXl1+Ij-;1ROG zTv(DgN*1`Q^pUc_g>X(tQx>=$TH3O}wJ_>UOAFV+94&D-!l*B;9HY{w>;3lcUoAa% zhi^pt?v4EJ{Q;>6mrh;#09x4ZO{LN$A^cHV)~MZKNLwaZi~7(aaj)`+O=%DHl{iE= zCu@BW>cWzcr+TXj*UDO^tR`HN^^&rRu=g5shJ{;X`S-1AJtQ0{S)yCGSC)Rp>R`Hr zN0YT|L9=kg8grV2qsxM!p%qOQbPGq61x><`q!pE+N_$6|Ia3Quh{Dpz%)+_!8G)#z zLQ7V9)|88H5RW#Ib3viaRqu!=yvoZk@a7KBI>5NsCShWhq@@5wVIs1) c+}36J0nC@;f-?(Y5dZ)H07*qoM6N<$f>!?wCIA2c literal 0 HcmV?d00001 diff --git a/assets/images/menu/ms_hover.png b/assets/images/menu/ms_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..af760623193020d48612051dcb5c59bbbb746800 GIT binary patch literal 521 zcmV+k0`~ohP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0iH=jK~!i%?b}gq z!Y~ZR@z7(9bL?r)I~C77aSnE^ZQoQ^1|?~lIJ2GbmnteWA%56&(x#q52;aX)vditd zp84qW{bN0gmjru*K9_<=!QQdFXZQnnBq)!gm-TVz_#ij%sMDp$_Xi#w%bQ}QDGYX* zX}V~t38NR-TlcT~c9i5AT#Dqm1=nDaOK=Q(emk#c`P_k9ut*(zWHno{NEJ+g60`&s zxmal_EK&vYH=UZYBo>*TurwB#0&`#wEK&!@5WTR-+)DSvA`{>oND_-oU$msL$TS%1 zO@~yb!8|GW>2kYf|F@*k9;{{6#lZYcN`LnxUt0v+b0X4pnQ$&`yx2tx5KEIxC4QAA zxK(_&UrVJc{@-;0=djuzgg7_`vb5f!;8LvSl*Pb%SSwQ&0b5^VUNiUzmOrnx)=gkf zlclP`wOINYtq-OO+&Wp!EjSGJxW>FgVDDJebkXvLMb%)BSY+~VT0Lu8X^*|Yqqpqc zBQRQXuJkNZhI5(;(@;0?EK`1%@Th3+8v4Ga*Z{M);(3P0w>5+xG#S4Chg7R900000 LNkvXXu0mjf^Wo-7 literal 0 HcmV?d00001 diff --git a/assets/images/menu/new_game.png b/assets/images/menu/new_game.png new file mode 100644 index 0000000000000000000000000000000000000000..ec720271ed77d95949e9c29db6573bc37aeab79c GIT binary patch literal 2000 zcmbuAYdjN*8^?!H%q>pFqH-;{o?J?rA4GJ(s5mYQanj)==0wLOCYNEx zFl-ib%VoI?o8eRlH5E3O%+cr5oBzx6`M-GXFP`Ul^Zotq{*`)&qQl*s#g(5A z$rxv^G*dvQ^3iB?Y%4f^ZdbZ>T9* zd`zzTBU9|pckN}P=!cPrHkt7vb2G~K1y-(<086s#4n)HCccN@B2Q%R-rWXEP8fc6dq3-#wc(7C)pAYb9s-!p^btvu=sRbO;%o2f0NWH1wyNTwy=VNzFnbLT z%i<*yHOcX&KVJV2!$)VAXN6t=9KyD`k5+GJH8uE!rWY~hSL*)8Ap^IN8uPIUV?=z! zXvYMkTS=TAf(yvEzUH=4+PPL=^$S+s59&9@`5BDJhAP=yyuFUAv{S9NxI;$@5tQ45 z#LePyoG33}cN)1fx4OMz-zKQf^Ro|I&+|8 zc7Q)6!e{fr(Rqn_v(uVuA5%oM%^Wvav;)0Fi@^vyPEI>ms_pm;SgG2%-CYwJhSs?B z0%Kg2m0}#dz_9S537dImpw;1z_(@+>UhuCD&6Ee(+5unYe1K2SSTIcFF zT7J4I1IyklD9h#>R#3@W?sFqauv6t8(MyjPOP8j6YVlcSEZlq@Bd{pWp5UzUt}wlG z2xLd-l209$OO3$3bdoJ2HrX`zAZD9={QEsJi@*;2HKF^W0Vg7}a0)&GCBh_KwsPc2 z=p$Y?o1Z^mjUc(vfz#dxIwMV}t;zNIFSRvaEI>(4sKPaO1W_3wcl0S4tI5iszJi3k zlzECZ-;cmOIUHfyNMhSsaZbUv$;r$mPAqr=ZT10~VhwT}960Zxwi>Kzs6njxbuS_;1m=^vD>J~D3PqvC6u6Y?Y|8R)?g8+Vvm>Bi#CC>x|mwox! z5|@a3p4Pq(Z!UPXFUI0d|H4{5qZPhL4PM2#~v~yMZeL#s`)8ceo&(jx9|t^?Qvr2B1zJUja!IC zO`l!+O~lzQ37)i;Stj5A%VtSvBc;C_NZ6e5+#X4wFOz{Px718{_?y!I59$63BgZum zp{-K~;ed^BN{9UaVD|BT1iD3Hm)76=yA+R&-T877c`aM=y>m|*QT7-IBW>iLKGcVh zC1v`uZ3BM@KzU2M5|WvNRQs|(|0X*5OgPIO>-r^UY;aegX7~cBQT7wwHGet519m1L zA^IrKk=XL!)M+xnyBK(3$eJ_){tU44Hq+Z6HnYUj$VX5a2c`4xIRIT}Z``MdkO@2$ zFRc@2D3OSBkto~pp?=RW|383W(-(8fm#9qflgO;N9En>}cuC-wuU}zDLFGItc0F=e Pg#j*(o(@&^{`da{ghjZ1 literal 0 HcmV?d00001 diff --git a/assets/images/menu/new_game_hover.png b/assets/images/menu/new_game_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a17b4830c2e75035094015e7f7f51272bc2da65e GIT binary patch literal 1866 zcmbW2X;c!37RM2VqcWx^M;o&;o75Sl(_&~YXl@~b+F&Lw55XlwLKKd<<<>*2k<^;R z#@%o&MV_%)jarS`*tm=$PKx1ZxQ;mGHj2^E%zSuX-Z}5R4|l)+bMB|#y>UJOVW7WX z9{>OtAbq_t0Du-$le2Zf8Xprb7|{eRItJkh;0_*G)D${I4}T8;;9o_MT>?l`>m~Yz z(g6TdtB@N@<; zjA{a1154tsPqj){C$IVW<05gm*Y5gf*VJjd`)bmF5M3|47U4oBbL0JdQJ+b7qo_@O zC`7fg2Wkm=GhvSF$+c?A!PGwuUjGDz)ylYY=|zJvy9O9Pkv`JD2TA}PuyPc)C+Ovw z3s&SZ5)hO!OgLM6EhHn*Rz{OlfRv18|g+neC*mmV~dPUjhNlQXTD(eq{p-$ z-Runm#IWS$oX{~f>W$1*Y?}<*+CUF~k_%$I4Z)A?TJ&m5{%z%>)Cha_v%e45{cH1Y z{eLxVvrxQWd*}G!t}R@(A#dv&d-<|7yUUfkW4}W5Th0u855bj!rNIy)<;d1Tn)do( z*j7E=K~xwo5nV*I!esB#{Xx=L5o1W(ZMQ>ul$Bh+^kBn`KIcZ~!kvUqvR{(F6rJw0 zivF-$)#1#nE|tg&=BfxQl`Po}cT_+Iv-+kYbWnu|$C>vG=aV`fKHkcnu2uC^?W^_K zCi=o%qONkebfo~nC)>`<7FcU9FWhj(eD5>-HQ{wph01h%>=tFebOv){p*>$oHV$^K zX-;oUZhhY=gs*&S&bg2wdLo3;Db+y}jrBvX!iWjwrAq_N(K~9%^5;KNn;Q;2vTu|2 ze$Bf}cT_Jlxlt$xE@$bx2bZ)T#M}#7C1s9o?izGhrxfO&+>bi06KZAy4RE|H6&RSG zteczIk%bU~l^1hM!oEOIuaE4Api6c;$#-g}5PUe%6@*lk?P=I)Z$qb# zM+4j+dsz%gBk)tnw^2I>VJ|2#(dU;o4X5(`yXyJe`kO|{PvV6x!CgGteb&6N(A^L| zrxBEOB{B@_=vCdANAm}>kqY1MTH7q|jQbsbB(_5P`>xiGr&n{Rx2qhsYf9A&{TBE? zapY$e>VARqmATV}m$a8zKBuqtN-_7=GrOxb8dg)@Xw*xln_Fos`}H?LTO%sYq5}1B zvD?pp7Ff{KP!*7b(!xZmGs3-|%i2nCX9%z;lJSP{>E?Zti0_S0@t{&+{oMR@YTEL2 zR+(XoATLWg7uR#pVUfM z>@8vTm*;8Ars%hMx=;w~mLQRupr?(jJbHOLP!Lel{FasVXa%{@-CnG0E-BuOP3k<6 zDG@QtCj-!}awQWt}JG7a*Bre4xVvW9jgz(1j+8 zAFB*Q!3Va)S$%tbUKmSxcQFcmM8GDdn!B`mk-j3cPY9Qr$F>xn0FThq*gK&G2}!8b zdC+8gS@|0!-PM3YS{$HM5ey*dT>ia!p@c7KYc*e9^8Yzn*P9lKhaaD@b6o!I6*+cr zWVMjiLsSZ+b0@`N`i$$d5w?Djk?#Gfc?DITtxk>jYINcf`dC@VmiH7Ip)+#E6u}C< zKS;_Xcgc^4xcj5UMD*ah&5g;~CDEj8uMkhV<&8ZHlPKrIGE>aPoxDB-S=rjO0OGR> zM0K0UUz(E2q~-UiD_b43Nq5Ht*v`ali5?0MN|c@=ths{WtWmxpiZYb>j~JjG z&jmXCRY1QY duBE1JTl|iucAu*I(4hH$0HjZVH`fz??GO3-Y~TO@ literal 0 HcmV?d00001 diff --git a/assets/images/menu/palette.png b/assets/images/menu/palette.png new file mode 100644 index 0000000000000000000000000000000000000000..479f33814f8cb579b12c6c1d2e30c9aae01cfb1b GIT binary patch literal 1237 zcmeAS@N?(olHy`uVBq!ia0vp^Js`}%1|-)VaI^zbjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85qP=L734qNaX`iO_ryNV@O5Z+q(;kt~!Xcf8^G0IGA)XBkLE7 zg^1Mg#}6)O$oK~Yn@DvZ{lId-Pk7cc^PRu_&%K+s`DdLmk7SqP@2_vv?##5aoauL+BJW>zL&UYpo%Uzdd#(rUi?f$rCs$Scxq3&|@~2xetr8aHV1Y>9w%nI9u3ekU$$au?!VIJ1MVWhN8cYBt< zX3qGw=Jq>IXOoR@V)ZBMc4j1Ph)_RgFkuGk;VB=_X4U$r^IZIqvQzI_w9v&LNqgm7 z&l$KpcJ3_ID0`tg3zY1V4yw3Zc02hy&SXYQ#w)Gb{qlb&T$uEOaY^dcAJ5iE`8b(; z%kum9DEg92^pv%?zHk23GBfGco6C=8ug^5#y!ax@@8z?DJsj%(uXXSG0tIwF7kw)h zJ=0O}u97qLiP4OU6AynBJ9VPeV6k%RW78>t9SLr>?T>Az1g=O}R@I^Ir4pRjJhMy0 z|A@!3T^wnrl5H+3&wQmfW2YG7SCJDj-w*0+`kw!c4f$J%aw%LWc<8};&I&pay&t>*sw z^P4rL(((^qilT%E2b)k+R_xk6rYuCOz{e1c1s~bz?&&<=<_R4bEyQWOR6RNhX zS6mI`lp}>~=WRIX(v{+Qq{4~yva^c!q9ejeGv+zZ{4Ce^I-yVG)ST-DF>J+80-o(@ zeXJ$n6!}b5#{9pjgU;(ccjiA6K9;SqKmQ(Yxc}Z=f9+znUM{+2GS}c@lIOL3Vcw^I zUrRYuaj&kZ`GY~`q+6Gl{c3rsIPJ*cC7xOL&#yZ8MdPdX^z9li8j{lw$1R%~3+ej}*=TKxL^JmLIycmB$(E4kKx z_u0XSqn~~~`&;n!%KF>+heIX3Os*X~<2>`WR9~vevgn|f5tFvAk37-4piIZ}+NZ8wmT8lZg&Ms2q9N<6JF&^|=A@`2lcwC8mvv*)*)4Zwm9Z!9 zv|qGm@9VAF5=otz=XZ%#7q;8w^0mDbx_#~IZ4sZ&h;23>zkHaob`!F z<^AfZ;m-6TgQeRS-N~rx@}4OXb~$y)y5*;x-$(Jh%(nGgG)G`f@=d3z%h6T45`Hd? zc^Of3pGlbK-|0@ZYHuYm6}|HY8OrGzDXfP}4t8)dpFHaPe%i~TuivtERF(XHT(_gC zJi9&qGiR~hw3L_U1y5%gyeio#!g}$@hHdZCgw@R17IpSI>#L|8ToK%?`S|{&ZCfOG z-p3X2MGL90FrU1caHDU+oYx0Z4z0*9tb8pk4irv1_{5KQnRm`I;b%cSM}+48oVG=T zb>k5e`yY0{E13N~X3Va;(+D(@g_-l9gOkAo0UjL8^GzFnFtWWkzK2~6MM-+|Lr>0= zJNafn^`1;Jn3LR>oB4MpSYY+R4Z5_m7C<&`*OKe-3d?GR( zXxz<%2C2WM?cR5(MNw*ls-qN3k%7<5eJfs{Y-vmh1~Tn(B9EUHZp%ozy{j(AbHW?0 zHcjEn^Ga{qCU&Sz+xt3old7OEkJ#%Yl59eo6J{9gi(K3P5@^(Xo$E(yyp^Ql*IZwG zLb5HRMq?x2QNFz{m%~>6j@Oydl5tC;@_sklWC7pUrSHFQmKTZ=vTxY3M(X~Y&}Pq$ zV{vCS<7&KTC3kNM{aqI}-yqm$c5PJ6XH#A^MXA`+ns;qx2tIt0xp(PqPBq0@sd4A( z)-_2Ao>SIe*b~EMY*l1&&q;D8Us}nMf<0|UT!Lp-JTKVOZp0;eCWQZ^OJ|B!jzRFm zN1YNUL&OjIRQ9M>sRZ9;HNLL2U>?)V*LE{h#T38F9Gi5QtvPp9{T{}Rf+&HGh%J`o am*XW$n-yLc1@{9>A_h-aKbLh*2~7Z!k|zZK literal 0 HcmV?d00001 diff --git a/assets/images/menu/play.png b/assets/images/menu/play.png new file mode 100644 index 0000000000000000000000000000000000000000..23dd4369e671bf8a6a80a75dc2710b3ebdfdaf17 GIT binary patch literal 2080 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 G1b+h#Nr|)o literal 0 HcmV?d00001 diff --git a/assets/images/menu/play_hover.png b/assets/images/menu/play_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2e65dfe30bf61bc129e9948188119f96f01c95f7 GIT binary patch literal 1666 zcmV-|27UR7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1{X<0K~#8N?cGgo z+(r$!;(bp}?vc8Cjh=_=Y zsBphMey`m>KfXWSy4~M@{`GjPcI99x8tSj0wi2+GV0u>(WSL>P^7LA6VcB3g$Mmjz z$nwAnN@`ywUg2RS@bp>&VS!<#B(*OzuaL0PlX@zmut>0~d3q`quNbh3liC-BR{&V3 zdd)vC*RUXUl5<;5VL_@hx4b;ULe-^w+VTYpQp0)U

t4?&pV>3s{g+%!#e_uu!F* z2V09_p~|kcyq3X&)Pxq=S_2DJ(^_R~0W4HaZi%hguu!$6`L?FQLe;`1+nNUpRUVqg zYZ5F}`DuImJTdbrAf<{0xVP|OT|{*JJ!#C zf9`)h{*;uuyI4Wz>QK_RKfXQQD&PIly0uuz4ncNn>;5atPl=e zU6;BBtKeMiD{E`ub!V}z#cp+W0ao$3+Nx>m>Z{LUjl^z!tQQt@^;AJymkh92~GtnMk#OwYX$MwRHgN@RCm!r6kp2vDTDksNT&GuojefsJ4JLwKPNZv13>%uUX3< zyB8tVVzDNbQq{=-0n5BP$KO6+*;bHL>n$vvX5FmjP;IeTCRHGHK0UxvuJ}-Gox$QX zyc(poSS+Lg$d2C4H7zWwX99N!S8^+o97 zq&ja$EY`Ics?NG#afNT8s$T+&)s>J!)uno2RUR!!wJsT8vCd+shPwc(+Gs)QPAt|z z4ApB_XXP5K3Zn%nl~}A_Le*gdgVOcn{i&c2;?JMFL+V{)#}te8f2dM#WU-`(qjk7g zkUDSpR$XYZUJaqjuEE8U68|5#)VlK!U>uf&t;F4Yw8Z6|OuDsL5~G!}n{y@IU99`> z0i}$ike*W+i@Qf*ivuxDT1Su$ED2i)QoPux9fe%BXdibhdZarIYDZy<12Jgo2aYl< z30vW^xW?$ilCTvhqsy@gED2j7vip?F3YLT|=h>-}3_mM0eZR?hJZ>nO^@qLTQP|=@ zbl8N$#2l7{EmzICqRfCLVarL=F20jswcxe3nV(Kgg(YEYNi#{cX2X)OHM#k!qy?}f zY)xy4DrpTY30o6drAk@`OTw0E3sp%gVYT3;-da+v^{^ytDds_yl7Zuq14C=8#m&DXbQ}PI61CV0*kZMJO)hfs<7O7S|Sgj(wB9dxFg|(GZSX@tA;bCp%5SD;cD-WzzP+n;~ZDoVC z6+&1(Pg`kW?Q?}JF{XVbVC`FitO%xka~60+7Beu2se&-0XOPMVpc*Mp7srr_xVM*V^J2pVSQ2%wZZuwhe4}!H z5Oc}n2a7yDx=%W5>|na@P0YFEfcth^?f?A>-sQgg&)&oN9@{fl?zfPcns+U$K5vKW z-SuzlvMdyJFLl^k{MooAFuSh$hjivjw!hy#n7{w^`+ohB|LnJ_!)O1y_~Gm75Aq)I ztf~7}rS6y6SIud!c9&u5zAO6-Ygm5pzLd)lz4g8L2U9`pF5a%zu)4PA>UXBTYss4* z^;2>lf6SD;wyOTHc@N)mK3_6>;l1VC><%ApjK1{u!iS63(kmiZ!_Us= z`Q7=jd-VK=4-Y85tjqY3@!Hr%#zJLnL(k&1=RXKoDCRa!8fA@!0d>U8xzl$4wSRcdH|)NY8=$l0 z)AJ9k4|bLCZ{d0?eb`<9q4^T&1(&AZ`hNQ1?(m1lm#l9xiod$4-lXQQ*`GaM<~!BB z&$^t?Q?Ky$>azQC|J-h^Fs)Dd;hj0X?9a-FEhYQ6{VqPN`!a3qH}UqxmvWa~60+7Beu2se&-0XOPMVpoXKKE{-7;ac{3#2R(5RaXpy!t)unqstp@& zJP}dko$t0-EN->mvf!-^!sho5KQ)iL7k6F$PUG|A%fFVNS$HS(++6D$e|zt=p6k5R zQ>S0Pw%F?T(fsFnCFio2|LDE5^&E@Y;{TiX{m+=&8T*{C_=e28{Np{D=|Xv~G81dXhYI{$0+A){5_s_jtFx)cxL5s_ycx<-}Zpox)1xPEY(g?to;A zhKL~l>Cd0O?W#$zJKyhr`uHy4P3wLqJeYau_!jNAdb=JBbRl55>3Idx4_GS+m#j-`=V3a{lEX{Vzx3-Zek6ocQ-zyEI5>?rzCn nj{@FtUo6h&3){CV<{uODJ%?`RL+4)uW0}Fz)z4*}Q$iB}zv%l{ literal 0 HcmV?d00001 diff --git a/assets/images/menu/writing.png b/assets/images/menu/writing.png new file mode 100644 index 0000000000000000000000000000000000000000..b199bac864eddd1c5adbd94bf39330e0fc8d7a41 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^DL`z*!2~2#!(YAxQjEnx?oJHr&dGo{Ea{HEjtmSN z`?>!lvI6;>1s;*b3=CqbAk63)r1Al%f!))^F(kwJ?F36cCPyBY?<MU8AHo8)xA@lZHwrFeSUG_SoA*J^uBHazie>ypDBDhGvx zYPp0|ceKpwPU+H&R8}~-$n%ti$36uiJq4kXT}QflROYE>K2qL!+`BJy!k5D-f4e*; z-`i9gyTsrA=60(~tJ-r;HI`&+aDP&?U4Qz{8jsuBMuz5>e$F|ws=>rwMR}EC_zh+K zY^Ci#^z*fp#eb^S&lWG5<^S_=jgooQY4gv$`lUSarzDblI!|x2Wn^SX%1pd=lm{42 N44$rjF6*2UngHx8k01a5 literal 0 HcmV?d00001 diff --git a/assets/maps/custom.txt b/assets/maps/custom.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets/maps/easy.txt b/assets/maps/easy.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets/maps/extreme.txt b/assets/maps/extreme.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets/maps/hard.txt b/assets/maps/hard.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets/maps/medium.txt b/assets/maps/medium.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets/maps/tutorial.txt b/assets/maps/tutorial.txt new file mode 100644 index 0000000..d4adda7 --- /dev/null +++ b/assets/maps/tutorial.txt @@ -0,0 +1,5 @@ +0 1 0 0 0 +0 0 0 1 0 +0 0 0 0 0 +0 3 0 5 1 +2 0 0 3 0 diff --git a/assets/palettes/__pycache__/palette_manager.cpython-39.pyc b/assets/palettes/__pycache__/palette_manager.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42a7bd68f784aec23b673a6288fa4200094a85b2 GIT binary patch literal 2429 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/remove.wav b/assets/sounds/remove.wav new file mode 100644 index 0000000000000000000000000000000000000000..76765576142a9ccf7e7c4eb1b085fb4f6da48781 GIT binary patch literal 23596 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 Lw|gP}qM7~=6Z}$? literal 0 HcmV?d00001 diff --git a/assets/tutorial/tutorial.json b/assets/tutorial/tutorial.json new file mode 100644 index 0000000..4eeff4f --- /dev/null +++ b/assets/tutorial/tutorial.json @@ -0,0 +1,239 @@ +{ + "difficulty": "tutorial", + "connections": [ + { + "pos": [ + 0, + 0 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 1, + "connection": [ + 3, + 0 + ] + }, + { + "bridge_num": 0, + "connection": null + } + ], + "bridge_occupied": 1, + "locked": true + }, + { + "pos": [ + 1, + 0 + ], + "locked": true + }, + { + "pos": [ + 1, + 1 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 2, + "connection": [ + 3, + 1 + ] + }, + { + "bridge_num": 0, + "connection": null + } + ], + "bridge_occupied": 2, + "locked": true + }, + { + "pos": [ + 1, + 4 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + } + ], + "bridge_occupied": 0, + "locked": true + }, + { + "pos": [ + 2, + 0 + ], + "locked": true + }, + { + "pos": [ + 2, + 1 + ], + "locked": true + }, + { + "pos": [ + 3, + 0 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 1, + "connection": [ + 0, + 0 + ] + } + ], + "bridge_occupied": 1, + "locked": true + }, + { + "pos": [ + 3, + 1 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 1, + "connection": [ + 3, + 3 + ] + }, + { + "bridge_num": 1, + "connection": [ + 4, + 1 + ] + }, + { + "bridge_num": 2, + "connection": [ + 1, + 1 + ] + } + ], + "bridge_occupied": 4, + "locked": true + }, + { + "pos": [ + 3, + 2 + ], + "locked": true + }, + { + "pos": [ + 3, + 3 + ], + "bridges": [ + { + "bridge_num": 1, + "connection": [ + 3, + 1 + ] + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + } + ], + "bridge_occupied": 1, + "locked": true + }, + { + "pos": [ + 4, + 1 + ], + "bridges": [ + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 0, + "connection": null + }, + { + "bridge_num": 1, + "connection": [ + 3, + 1 + ] + } + ], + "bridge_occupied": 1, + "locked": true + } + ] +} \ No newline at end of file diff --git a/game_effect.py b/game_effect.py new file mode 100644 index 0000000..fe511b6 --- /dev/null +++ b/game_effect.py @@ -0,0 +1,51 @@ +import pygame +import random + +import pygame +import random + + +class Rectangle_effect: + rects = [] + timer = 0 + + def __init__(self, pos, size, speed, dirs): + self.pos = pos + self.size = size + self.speed = speed + self.dirs = dirs # True for going up False for down + + def move(self, display, palette): + sur = pygame.Surface(self.size) + sur.fill(palette.palette["backgroundShade"]) + sur.set_alpha(random.randint(100, 200)) + display.blit(sur, self.pos) + + if self.dirs[0]: + self.pos[1] -= self.speed + elif self.dirs[1]: + self.pos[1] += self.speed + elif self.dirs[2]: + self.pos[0] += self.speed + elif self.dirs[3]: + self.pos[0] -= self.speed + + if self.pos[1] < -120 or self.pos[0] > 600 or self.pos[1] > 650 or self.pos[0] < -120: + self.delete(self) + + @classmethod + def generate_rects(cls, amount=100, speed_range=None): + if speed_range is None: + speed_range = [1, 4] + + for _ in range(amount): + dirs = [0, 0, 0, 0] + dirs[random.randint(0, 3)] = 1 + cls.rects.append(Rectangle_effect([random.randint(0, 600), random.randint(0, 650)], + [random.randint(40, 120), random.randint(40, 120)], + random.randint(speed_range[0], speed_range[1]), + dirs)) + + @classmethod + def delete(cls, circle): + cls.rects.remove(circle) diff --git a/garbage.py b/garbage.py new file mode 100644 index 0000000..a4cfca7 --- /dev/null +++ b/garbage.py @@ -0,0 +1,9 @@ +def get_result(size): + size += 1 # increasing to get away from 0 + x = [1 for _ in range(size)] + for i in range(size - 1): # getting original size + x = [sum(x[:i+1]) for i in range(size)] + print(x[-1]) + + +get_result(20) diff --git a/hashi_functions.py b/hashi_functions.py new file mode 100644 index 0000000..c71a986 --- /dev/null +++ b/hashi_functions.py @@ -0,0 +1,229 @@ +import json +import pygame +import sounds + +# basic config +pygame.mixer.pre_init(48000, -16, 2, 512) +pygame.init() +pygame.mixer.set_num_channels(16) + +font = pygame.font.SysFont('calibri', 60, True) +small_font = pygame.font.SysFont('calibri', 40, True) +tiny_font = pygame.font.SysFont('calibri', 20, True) + +soundsX = sounds.get_sounds() + + +def set_palette(setup, palette, name_of_new_palette, menu_objects, first=False): + if first: + old_palette = "emerald" + else: + old_palette = setup["palette"] + palette.current_palette = name_of_new_palette + palette.palette = palette.get_palette() + + # saving new json + setup["palette"] = name_of_new_palette + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + # iterates over images and sets new palette + for obj in range(len(menu_objects)): + for img in menu_objects[obj].images.keys(): + menu_objects[obj].images[img] = palette.swap_image(menu_objects[obj].images[img], + old_palette, name_of_new_palette) + menu_objects[obj].images[img].set_colorkey((0, 0, 0)) + menu_objects[obj].display_image = palette.swap_image(menu_objects[obj].display_image, + old_palette, name_of_new_palette) + menu_objects[obj].display_image.set_colorkey((0, 0, 0)) + + return menu_objects, setup + + +# function for palette btn +def next_palette(palette): + palette = palette[0] + palette.current_palette = next(palette.cycle) + palette.changed = True + soundsX["click"].play() + + +# function for right arrow +def right_arrow(game): + game = game[0] + index = game.game_flow["dfs"].index(game.game_flow["df"]) + if index != len(game.game_flow["dfs"]) - 1: + game.game_flow["df"] = game.game_flow["dfs"][index + 1] + game.game_flow["df_change"] = True + soundsX["click"].play() + + +# function for left arrow +def left_arrow(game): + game = game[0] + index = game.game_flow["dfs"].index(game.game_flow["df"]) + if index != 0: + game.game_flow["df"] = game.game_flow["dfs"][index - 1] + game.game_flow["df_change"] = True + soundsX["click"].play() + + +# input +def activate_edit_text(game): + game[0].game_flow["ac"] = False + soundsX["click"].play() + + +def update_text(menu_objects, setup, game, palette): + custom_text = font.render(game.game_flow["custom_string"], False, + palette.palette["outline-dark"]) + custom_text_hover = font.render(game.game_flow["custom_string"], False, + palette.palette["background"]) + ct_images = {"idle": create_text_sur(custom_text, [20, 20], [100, 100]), + "hover": create_text_sur(custom_text_hover, [20, 20], [100, 100])} + for image in ct_images.keys(): + ct_images[image].set_colorkey((0, 0, 0)) + + for item in range(len(menu_objects)): + if menu_objects[item].on_click == activate_edit_text: + if menu_objects[item].name == "custom_text": + menu_objects[item].images = ct_images + menu_objects[item].display_image = ct_images["hover"] + + # saving json + setup["custom_num"] = game.game_flow["custom_string"] + with open("assets/saves/setup.json", "w") as f: + json.dump(setup, f, indent=4) + + return menu_objects, setup + + +def create_text_sur(text, pos, size): + sur = pygame.Surface(size) + sur.fill((0, 0, 0)) + sur.blit(text, pos) + return sur + + +def get_num_circles(palette, size_multiplier=1): + circle_num = pygame.image.load("assets/images/game/num_circle.png").convert() + circle_num_hover = pygame.image.load("assets/images/game/num_circle_hover.png").convert() + + circle_num = palette.swap_image(circle_num, "emerald", palette.current_palette) + circle_num_hover = palette.swap_image(circle_num_hover, "emerald", palette.current_palette) + + nums = [tiny_font.render(str(num), False, palette.palette["outline-dark"]) for num in range(1, 9)] + for i in range(len(nums)): + nums[i] = create_text_sur(nums[i], [10, 6], [30, 30]) + nums[i].set_colorkey((0, 0, 0)) + + num_dict = {} + + size = 0 + for i in range(len(nums)): + cn = circle_num.copy() + cnh = circle_num_hover.copy() + + cn.blit(nums[i], [0, 0]) + cnh.blit(nums[i], [0, 0]) + + cn.set_colorkey((0, 0, 0)) + cnh.set_colorkey((0, 0, 0)) + + size = int(30 * size_multiplier) + cn = pygame.transform.scale(cn, [size for _ in range(2)]) + cnh = pygame.transform.scale(cnh, [size for _ in range(2)]) + + num_dict[str(i + 1)] = {"idle": cn, + "hover": cnh} + + return num_dict, size + + +def get_images(palette, size): + circle_num = pygame.image.load("assets/images/game/num_circle.png").convert() + circle_num_hover = pygame.image.load("assets/images/game/num_circle_hover.png").convert() + + circle_num = palette.swap_image(circle_num, "emerald", palette.current_palette) + circle_num_hover = palette.swap_image(circle_num_hover, "emerald", palette.current_palette) + + nums = [tiny_font.render(str(num), False, palette.palette["backgroundShade"]) for num in range(1, 9)] + for i in range(len(nums)): + nums[i] = create_text_sur(nums[i], [10, 6], [30, 30]) + nums[i].set_colorkey((0, 0, 0)) + + num_dict = {} + + for i in range(len(nums)): + cn = circle_num.copy() + cnh = circle_num_hover.copy() + + cn.blit(nums[i], [0, 0]) + cnh.blit(nums[i], [0, 0]) + + cn.set_colorkey((0, 0, 0)) + cnh.set_colorkey((0, 0, 0)) + + cn = pygame.transform.scale(cn, [size for _ in range(2)]) + cnh = pygame.transform.scale(cnh, [size for _ in range(2)]) + + num_dict[str(i + 1)] = {"idle": cn, + "hover": cnh} + + return num_dict + + +def get_back_images(palette): + back_images = {"idle": pygame.image.load("assets/images/game/back.png").convert(), + "hover": pygame.image.load("assets/images/game/back_hover.png").convert()} + + for image in back_images.keys(): + back_images[image] = palette.swap_image(back_images[image], "emerald", palette.current_palette) + back_images[image].set_colorkey((0, 0, 0)) + + return back_images + + +def get_win_image(): + surf = pygame.Surface([500, 550]) + surf.fill((80, 80, 80)) + surf.set_alpha(180) + + text = font.render("Congratulations!", False, (10, 10, 10)) + surf.blit(text, [60, 120]) + + return surf + + +def go_back(args): + game = args[0] + + game.game_flow["quit"] = True + soundsX["click"].play() + + +def change_fs(args): + args[0].game_flow["change_fs"] = True + soundsX["click"].play() + + +def get_tutorial_circle_images(size_multiplier): + tutorial_circle_images = {"idle": pygame.image.load("assets/images/game/tutorial_circle.png").convert(), + "hover": pygame.image.load("assets/images/game/tutorial_circle_hover.png").convert()} + + size = int(30 * size_multiplier) + + for image in tutorial_circle_images.keys(): + tutorial_circle_images[image].set_alpha(120) + tutorial_circle_images[image].set_colorkey((0, 0, 0)) + tutorial_circle_images[image] = pygame.transform.scale(tutorial_circle_images[image], [size for _ in range(2)]) + + return tutorial_circle_images, size + + +def move_in_tutorial(args): + args[0].game_flow["tf"] = True + + +def play_click_sound(args): + soundsX["click"].play() diff --git a/hashi_game.py b/hashi_game.py new file mode 100644 index 0000000..f430df8 --- /dev/null +++ b/hashi_game.py @@ -0,0 +1,933 @@ +import json +import sounds +import widget_engine as wg +from hashi_functions import get_num_circles +from hashi_functions import get_images +import pygame +import math +import copy + + +pygame.init() + +soundsX = sounds.get_sounds() + + +class HashiG: + + def __init__(self, load_from_where, load_path, palette, mouse): + # creating variables + self.map = [] + self.size = None + self.indent = 40 + self.indent_default = 40 + self.node_count = 0 + self.win = False + + # for nodes + self.locked = False + self.c_node = None + self.temp_done = [0, 0, 0, 0] + self.temp_removed = [0, 0, 0, 0] + self.s_node = None + + # loading game + if load_from_where == "file.txt": + self.load_from_file(load_path, palette) + elif load_from_where == "file.json": + self.load_game(load_path, palette, mouse) + + self.set_size() + self.line_width = int(self.indent / 12) + 1 + + def load_from_file(self, path, palette): + with open(path, "r") as f: + file = f.read() + f.close() + + file = file.split("\n") + del file[-1] + + # init blank map + self.size = len(file) + self.map = [[NodeG([x, y]) for y in range(len(file))] for x in range(len(file))] + self.set_size() + + # getting images + images, widget_size = get_num_circles(palette, math.sqrt(self.indent/self.indent_default)**1.5) + switch_images = get_images(palette, widget_size) + + # reversing to get back into our format + file = file[::-1] + file = [x.split() for x in file] + for y in range(len(file)): + for x in range(len(file[y])): + node = self.map[x][y] + node.bridge_num = int(file[y][x]) + if int(file[y][x]) != 0: + # if its node and not blank + + node.locked = True + node.widget = wg.CircleButton(widget_size, [0, 0], + images[file[y][x]], self.lock, [node]) + node.widget.switch_images = switch_images[file[y][x]] + self.node_count += 1 + + def load_game(self, path, palette, mouse): + + with open(path, "r") as f: + save = json.load(f) + + self.load_from_file(f"assets/maps/{save['difficulty']}.txt", palette) + + for connection in save["connections"]: + # also bridge_occupied + if self.map[connection["pos"][0]][connection["pos"][1]].bridge_num != 0: + self.map[connection["pos"][0]][connection["pos"][1]].bridges = connection["bridges"] + self.map[connection["pos"][0]][connection["pos"][1]].bridge_occupied = connection["bridge_occupied"] + self.map[connection["pos"][0]][connection["pos"][1]].locked = connection["locked"] + if self.map[connection["pos"][0]][connection["pos"][1]].bridge_occupied == self.map[connection["pos"][0]][connection["pos"][1]].bridge_num: + if self.map[connection["pos"][0]][connection["pos"][1]].widget is not None: + self.map[connection["pos"][0]][connection["pos"][1]].widget.switch(mouse.mouse_pos) + else: + self.map[connection["pos"][0]][connection["pos"][1]].locked = connection["locked"] + + def blit(self, display, palette, scroll): + # grid + for lines in range(self.size): + pygame.draw.line(display, palette.palette["outline-shade"], + [(lines * self.indent) - scroll.scroll[0], + 0 - scroll.scroll[1]], + [(lines * self.indent) - scroll.scroll[0], + ((self.size - 1) * self.indent) - scroll.scroll[1]], self.line_width) + pygame.draw.line(display, palette.palette["outline-shade"], + [0 - scroll.scroll[0], + (lines * self.indent) - scroll.scroll[1]], + [((self.size - 1) * self.indent) - scroll.scroll[0], + (lines * self.indent) - scroll.scroll[1]], self.line_width) + + # connections + for x in range(self.size): + for y in range(self.size): + for connection in self.map[x][y].bridges: + if connection["connection"] is not None: + if connection["bridge_num"] == 1: + node = self.map[x][y] + target = self.map[connection["connection"][0]][connection["connection"][1]] + pygame.draw.line(display, palette.palette["addition"], + [(node.pos[0] * self.indent) - scroll.scroll[0], + (node.pos[1] * self.indent) - scroll.scroll[1]], + [(target.pos[0] * self.indent) - scroll.scroll[0], + (target.pos[1] * self.indent) - scroll.scroll[1]], + self.line_width + 1) + elif connection["bridge_num"] == 2: + node = self.map[x][y] + target = self.map[connection["connection"][0]][connection["connection"][1]] + pygame.draw.line(display, palette.palette["outline-dark"], + [(node.pos[0] * self.indent) - scroll.scroll[0], + (node.pos[1] * self.indent) - scroll.scroll[1]], + [(target.pos[0] * self.indent) - scroll.scroll[0], + (target.pos[1] * self.indent) - scroll.scroll[1]], + int((self.line_width * 1.4) + 1)) + + # dealing with nodes + for x in range(self.size): + for y in range(self.size): + if self.map[x][y].widget is not None: + node = self.map[x][y] + node.widget.pos = [(node.pos[0] * self.indent) - node.widget.radius, + (node.pos[1] * self.indent) - node.widget.radius] + node.widget.center = [node.widget.pos[0] + node.widget.radius, + node.widget.pos[1] + node.widget.radius] + node.widget.blit(display, scroll) + + def hover(self, mouse, scroll): + ms = mouse.get_scrolled(scroll) + + for y in range(self.size): + for x in range(self.size): + if self.map[x][y].widget is not None: + self.map[x][y].widget.hover_check(ms) + + def click(self, mouse, scroll): + ms = mouse.get_scrolled(scroll) + + for y in range(self.size): + for x in range(self.size): + if self.map[x][y].widget is not None: + self.map[x][y].widget.click_check(ms) + + def on_locked(self, mouse, scroll): + ms = mouse.get_scrolled(scroll) + cords = self.c_node.pos + + dists = [ms[0] - self.c_node.widget.center[0], + ms[1] - self.c_node.widget.center[1]] + da = list(map(abs, dists)) + self.clear_temp() + self.clear_temp_remove() + + # if we still can add bridges + if self.c_node.bridge_occupied < self.c_node.bridge_num: + + # if we move out mouse more on x + if da[0] > da[1]: + if dists[0] > 0: + # here we do in case we move right + + self.__right(cords) + + else: + # here we do in case we move left + + self.__left(cords) + else: + + if dists[1] > 0: + # here we do in case we move down + + self.__down(cords) + else: + # here we do in case we go up + + self.__up(cords) + # removing bridges here + else: + if da[0] > da[1]: + if dists[0] > 0: + # here we do in case we move right + + if self.c_node.bridges[2]["bridge_num"] != 2: + for i in range(1, self.size): + if cords[0] + i < self.size: + if self.map[cords[0] + i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] + i][cords[1]].pos == self.c_node.bridges[2]["connection"]: + # connect + self.s_node = self.map[cords[0] + i][cords[1]] + + self.c_node.bridges[2]["bridge_num"] -= 1 + self.s_node.bridges[3]["bridge_num"] -= 1 + + if self.c_node.bridges[2]["bridge_num"] == -1: + self.c_node.bridges[2]["bridge_num"] = 0 + self.s_node.bridges[3]["bridge_num"] = 0 + break + + self.temp_removed[2] = 1 + + if self.c_node.bridges[2]["bridge_num"] == 0: + self.c_node.bridges[2] = {"bridge_num": 0, "connection": True} + self.s_node.bridges[3] = {"bridge_num": 0, "connection": True} + + break + else: + if self.c_node.bridges[2]["connection"] is not None and self.map[cords[0] + i][cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + else: + self.__right(cords) + + else: + # here we do in case we move left + + if self.c_node.bridges[3]["bridge_num"] != 2: + for i in range(1, self.size): + if cords[0] - i > -1: + if self.map[cords[0] - i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] - i][cords[1]].pos == self.c_node.bridges[3]["connection"]: + # connect + self.s_node = self.map[cords[0] - i][cords[1]] + + self.c_node.bridges[3]["bridge_num"] -= 1 + self.s_node.bridges[2]["bridge_num"] -= 1 + + if self.c_node.bridges[3]["bridge_num"] == -1: + self.c_node.bridges[3]["bridge_num"] = 0 + self.s_node.bridges[2]["bridge_num"] = 0 + break + + self.temp_removed[3] = 1 + + if self.c_node.bridges[3]["bridge_num"] == 0: + self.c_node.bridges[3] = {"bridge_num": 0, "connection": True} + self.s_node.bridges[2] = {"bridge_num": 0, "connection": True} + + break + else: + if self.c_node.bridges[3]["connection"] is not None and self.map[cords[0] - i][cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + else: + self.__left(cords) + else: + + if dists[1] > 0: + # here we do in case we move down + + if self.c_node.bridges[1]["bridge_num"] != 2: + for i in range(1, self.size): + if cords[1] + i < self.size: + if self.map[cords[0]][cords[1] + i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] + i].pos == self.c_node.bridges[1]["connection"]: + # connect + self.s_node = self.map[cords[0]][cords[1] + i] + + self.c_node.bridges[1]["bridge_num"] -= 1 + self.s_node.bridges[0]["bridge_num"] -= 1 + + if self.c_node.bridges[1]["bridge_num"] == -1: + self.c_node.bridges[1]["bridge_num"] = 0 + self.s_node.bridges[0]["bridge_num"] = 0 + break + + self.temp_removed[1] = 1 + + if self.c_node.bridges[1]["bridge_num"] == 0: + self.c_node.bridges[1] = {"bridge_num": 0, "connection": True} + self.s_node.bridges[0] = {"bridge_num": 0, "connection": True} + + break + else: + if self.c_node.bridges[1]["connection"] is not None and self.map[cords[0]][cords[1] + i].bridge_occupied == 0: + pass + else: + break + else: + break + else: + self.__down(cords) + else: + # here we do in case we go up + + if self.c_node.bridges[0]["bridge_num"] != 2: + for i in range(1, self.size): + if cords[1] - i > -1: + if self.map[cords[0]][cords[1] - i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] - i].pos == self.c_node.bridges[0]["connection"]: + # connect + self.s_node = self.map[cords[0]][cords[1] - i] + + self.c_node.bridges[0]["bridge_num"] -= 1 + self.s_node.bridges[1]["bridge_num"] -= 1 + + if self.c_node.bridges[0]["bridge_num"] == -1: + self.c_node.bridges[0]["bridge_num"] -= 1 + self.s_node.bridges[1]["bridge_num"] -= 1 + break + + self.temp_removed[0] = 1 + + if self.c_node.bridges[0]["bridge_num"] == 0: + self.c_node.bridges[0] = {"bridge_num": 0, "connection": True} + self.s_node.bridges[1] = {"bridge_num": 0, "connection": True} + + break + else: + if self.c_node.bridges[0]["connection"] is not None and self.map[cords[0]][cords[1] - i].bridge_occupied == 0: + pass + else: + break + else: + break + else: + self.__up(cords) + + def clear_temp(self): + if self.temp_done.count(1) != 0: + i = self.temp_done.index(1) + self.temp_done[i] = 0 + + if i == 0: + self.c_node.bridges[0]["bridge_num"] -= 1 + self.s_node.bridges[1]["bridge_num"] -= 1 + + if self.c_node.bridges[0]["bridge_num"] == 0: + self.c_node.bridges[0] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[1] = {"bridge_num": 0, "connection": None} + elif self.c_node.bridges[0]["bridge_num"] == -1: + self.c_node.bridges[0]["bridge_num"] = 2 + self.s_node.bridges[1]["bridge_num"] = 2 + + self.c_node.bridges[0]["connection"] = self.s_node.pos + self.s_node.bridges[1]["connection"] = self.c_node.pos + elif i == 1: + self.c_node.bridges[1]["bridge_num"] -= 1 + self.s_node.bridges[0]["bridge_num"] -= 1 + + if self.c_node.bridges[1]["bridge_num"] == 0: + self.c_node.bridges[1] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[0] = {"bridge_num": 0, "connection": None} + elif self.c_node.bridges[1]["bridge_num"] == -1: + self.c_node.bridges[1]["bridge_num"] = 2 + self.s_node.bridges[0]["bridge_num"] = 2 + + self.c_node.bridges[1]["connection"] = self.s_node.pos + self.s_node.bridges[0]["connection"] = self.c_node.pos + elif i == 2: + self.c_node.bridges[2]["bridge_num"] -= 1 + self.s_node.bridges[3]["bridge_num"] -= 1 + + if self.c_node.bridges[2]["bridge_num"] == 0: + self.c_node.bridges[2] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[3] = {"bridge_num": 0, "connection": None} + elif self.c_node.bridges[2]["bridge_num"] == -1: + self.c_node.bridges[2]["bridge_num"] = 2 + self.s_node.bridges[3]["bridge_num"] = 2 + + self.c_node.bridges[2]["connection"] = self.s_node.pos + self.s_node.bridges[3]["connection"] = self.c_node.pos + elif i == 3: + self.c_node.bridges[3]["bridge_num"] -= 1 + self.s_node.bridges[2]["bridge_num"] -= 1 + + if self.c_node.bridges[3]["bridge_num"] == 0: + self.c_node.bridges[3] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[2] = {"bridge_num": 0, "connection": None} + elif self.c_node.bridges[3]["bridge_num"] == -1: + self.c_node.bridges[3]["bridge_num"] = 2 + self.s_node.bridges[2]["bridge_num"] = 2 + + self.c_node.bridges[3]["connection"] = self.s_node.pos + self.s_node.bridges[2]["connection"] = self.c_node.pos + + def clear_temp_remove(self): + if self.temp_removed.count(1) != 0: + i = self.temp_removed.index(1) + self.temp_removed[i] = 0 + cords = self.c_node.pos + + if i == 0: + for i in range(1, self.size): + if cords[1] - i > -1: + if self.map[cords[0]][cords[1] - i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] - i].pos == self.s_node.pos: + # connect + self.s_node = self.map[cords[0]][cords[1] - i] + + self.c_node.bridges[0]["bridge_num"] += 1 + self.s_node.bridges[1]["bridge_num"] += 1 + + if self.c_node.bridges[0]["bridge_num"] == 3: + self.c_node.bridges[0] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[1] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[0]["connection"] = self.s_node.pos + self.s_node.bridges[1]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[0]["connection"] is not None and self.map[cords[0]][cords[1] - i].bridge_occupied == 0: + pass + else: + break + else: + break + elif i == 1: + for i in range(1, self.size): + if cords[1] + i < self.size: + if self.map[cords[0]][cords[1] + i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] + i].pos == self.s_node.pos: + # connect + self.s_node = self.map[cords[0]][cords[1] + i] + + self.c_node.bridges[1]["bridge_num"] += 1 + self.s_node.bridges[0]["bridge_num"] += 1 + + if self.c_node.bridges[1]["bridge_num"] == 3: + self.c_node.bridges[1] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[0] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[1]["connection"] = self.s_node.pos + self.s_node.bridges[0]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[1]["connection"] is not None and self.map[cords[0]][cords[1] + i].bridge_occupied == 0: + pass + else: + break + else: + break + elif i == 2: + for i in range(1, self.size): + if cords[0] + i < self.size: + if self.map[cords[0] + i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] + i][cords[1]].pos == self.s_node.pos: + # connect + self.s_node = self.map[cords[0] + i][cords[1]] + + self.c_node.bridges[2]["bridge_num"] += 1 + self.s_node.bridges[3]["bridge_num"] += 1 + + if self.c_node.bridges[2]["bridge_num"] == 3: + self.c_node.bridges[2] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[3] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[2]["connection"] = self.s_node.pos + self.s_node.bridges[3]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[2]["connection"] is not None and self.map[cords[0] + i][cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + elif i == 3: + for i in range(1, self.size): + if cords[0] - i > -1: + if self.map[cords[0] - i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] - i][cords[1]].pos == self.s_node.pos: + # connect + self.s_node = self.map[cords[0] - i][cords[1]] + + self.c_node.bridges[3]["bridge_num"] += 1 + self.s_node.bridges[2]["bridge_num"] += 1 + + if self.c_node.bridges[3]["bridge_num"] == 3: + self.c_node.bridges[3] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[2] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[3]["connection"] = self.s_node.pos + self.s_node.bridges[2]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[3]["connection"] is not None and self.map[cords[0] - i][cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + + def click_on_locked(self, mouse, scroll): + c = self.c_node + s = self.s_node + temp_done = copy.copy(self.temp_done) + temp_removed = copy.copy(self.temp_removed) + other_removed = self.get_other(temp_removed) + other_done = self.get_other(temp_done) + self.clear_temp() + self.clear_temp_remove() + + if temp_done.count(1) != 0: + + # connecting + i1 = temp_done.index(1) + i2 = other_done.index(1) + + switch = {"c": False, + "s": False} + + if c.bridge_occupied == c.bridge_num: + switch["c"] = True + if s.bridge_occupied == s.bridge_num: + switch["s"] = True + + c.bridges[i1]["bridge_num"] += 1 + s.bridges[i2]["bridge_num"] += 1 + c.bridge_occupied += 1 + s.bridge_occupied += 1 + + c.bridges[i1]["connection"] = s.pos + s.bridges[i2]["connection"] = c.pos + + if c.bridges[i1]["bridge_num"] > 2: + c.bridges[i1] = {"bridge_num": 0, "connection": None} + s.bridges[i2] = {"bridge_num": 0, "connection": None} + c.bridge_occupied -= 3 + s.bridge_occupied -= 3 + + # playing sound + soundsX["remove"].play() + else: + soundsX["join"].play() + + if c.bridge_occupied == c.bridge_num or switch["c"]: + c.widget.switch(mouse.get_scrolled(scroll)) + if s.bridge_occupied == s.bridge_num or switch["s"]: + s.widget.switch(mouse.get_scrolled(scroll)) + + # locking + if temp_done[1]: + for i in range(c.pos[1] + 1, s.pos[1]): + if c.bridges[1]["connection"] is not None: + self.map[c.pos[0]][i].locked = True + else: + self.map[c.pos[0]][i].locked = False + + elif temp_done[0]: + for i in range(s.pos[1] + 1, c.pos[1]): + if c.bridges[0]["connection"] is not None: + self.map[s.pos[0]][i].locked = True + else: + self.map[s.pos[0]][i].locked = False + + elif temp_done[2]: + for i in range(c.pos[0] + 1, s.pos[0]): + if c.bridges[2]["connection"] is not None: + self.map[i][c.pos[1]].locked = True + else: + self.map[i][c.pos[1]].locked = False + + elif temp_done[3]: + for i in range(s.pos[0] + 1, c.pos[0]): + if c.bridges[3]["connection"] is not None: + self.map[i][s.pos[1]].locked = True + else: + self.map[i][s.pos[1]].locked = False + elif temp_removed.count(1) != 0: + # connecting + i1 = temp_removed.index(1) + i2 = other_removed.index(1) + + switch = {"c": False, + "s": False} + + if c.bridge_occupied == c.bridge_num: + switch["c"] = True + if s.bridge_occupied == s.bridge_num: + switch["s"] = True + + c.bridges[i1]["bridge_num"] -= 1 + s.bridges[i2]["bridge_num"] -= 1 + c.bridge_occupied -= 1 + s.bridge_occupied -= 1 + + c.bridges[i1]["connection"] = s.pos + s.bridges[i2]["connection"] = c.pos + + if c.bridges[i1]["bridge_num"] == 0: + c.bridges[i1]["connection"] = None + s.bridges[i2]["connection"] = None + + if switch["c"]: + c.widget.switch(mouse.get_scrolled(scroll)) + if switch["s"]: + s.widget.switch(mouse.get_scrolled(scroll)) + + # locking + if temp_removed[1]: + for i in range(c.pos[1] + 1, s.pos[1]): + if c.bridges[1]["connection"] is not None: + self.map[c.pos[0]][i].locked = True + else: + self.map[c.pos[0]][i].locked = False + + elif temp_removed[0]: + for i in range(s.pos[1] + 1, c.pos[1]): + if c.bridges[0]["connection"] is not None: + self.map[s.pos[0]][i].locked = True + else: + self.map[s.pos[0]][i].locked = False + + elif temp_removed[2]: + for i in range(c.pos[0] + 1, s.pos[0]): + if c.bridges[2]["connection"] is not None: + self.map[i][c.pos[1]].locked = True + else: + self.map[i][c.pos[1]].locked = False + + elif temp_removed[3]: + for i in range(s.pos[0] + 1, c.pos[0]): + if c.bridges[3]["connection"] is not None: + self.map[i][s.pos[1]].locked = True + else: + self.map[i][s.pos[1]].locked = False + + # playing sound + soundsX["remove"].play() + + def check_win(self): + node_done_count = 0 + test_node = None + for line in self.map: + for item in line: + if item.bridge_num > 0: + if item.bridge_num == item.bridge_occupied: + node_done_count += 1 + test_node = item + + if node_done_count == self.node_count: + + # checking if all connected + nodes_to_do = [test_node] + nodes_to_remove = [] + appending = [] + while len(nodes_to_do) != 0: + # making them done + for node in nodes_to_do: + node.check_for_win = True + + for node in nodes_to_do: + for connection in node.bridges: + if connection["connection"] is not None: + if self.map[connection["connection"][0]][connection["connection"][1]].check_for_win is False: + appending.append(self.map[connection["connection"][0]][connection["connection"][1]]) + nodes_to_remove.append(node) + + for node in appending: + nodes_to_do.append(node) + appending = [] + + for node in nodes_to_remove: + nodes_to_do.remove(node) + nodes_to_remove = [] + + win = True + for line in self.map: + for item in line: + if item.bridge_num > 0: + if item.check_for_win is False: + win = False + + if win: + self.win = True + else: + for line in self.map: + for item in line: + item.check_for_win = False + + def save(self, setup): + save = {"difficulty": setup["difficulty"]} + + connections = [] + + for line in self.map: + for node in line: + if node.locked is True: + if node.bridge_num != 0: + connections.append({"pos": node.pos, + "bridges": node.bridges, + "bridge_occupied": node.bridge_occupied, + "locked": node.locked}) + else: + connections.append({"pos": node.pos, + "locked": node.locked}) + save["connections"] = connections + + with open(f"assets/saves/game_saves/{setup['difficulty']}.json", "w") as f: + json.dump(save, f, indent=4) + + def print_nodes(self): + print("_" * 20) + + for line in self.map: + for item in line: + if item.bridge_num > 0: + print(f"| Node at pos {item.widget.pos}, map pos {item.pos}, bridge_num {item.bridge_num}" + f" with {item.bridge_occupied} occupied bridges. |") + + print("_" * 20) + + # technical stuff not used inside class + def set_size(self): + if self.size <= 15: + self.indent = (15 / self.size) * 40 + + def get_length(self): + return self.indent * (self.size - 1) + + def lock(self, args): + self.locked = True + self.c_node = args[0] + + # technical stuff used inside class + def __down(self, cords): + for i in range(1, self.size): + if cords[1] + i < self.size: + if self.map[cords[0]][cords[1] + i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] + i].bridge_occupied < self.map[cords[0]][ + cords[1] + i].bridge_num or ( + self.c_node.bridges[1]["bridge_num"] == 2 and self.map[cords[0]][cords[1] + i].pos == + self.c_node.bridges[1]["connection"]): + # connect + self.s_node = self.map[cords[0]][cords[1] + i] + + self.c_node.bridges[1]["bridge_num"] += 1 + self.s_node.bridges[0]["bridge_num"] += 1 + self.temp_done[1] = 1 + + if self.c_node.bridges[1]["bridge_num"] == 3: + self.c_node.bridges[1] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[0] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[1]["connection"] = self.s_node.pos + self.s_node.bridges[0]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[1]["connection"] is not None and self.map[cords[0]][ + cords[1] + i].bridge_occupied == 0: + pass + else: + break + else: + break + + def __up(self, cords): + for i in range(1, self.size): + if cords[1] - i > -1: + if self.map[cords[0]][cords[1] - i].locked is False: + pass + + else: + if self.map[cords[0]][cords[1] - i].bridge_occupied < self.map[cords[0]][ + cords[1] - i].bridge_num or ( + self.c_node.bridges[0]["bridge_num"] == 2 and self.map[cords[0]][cords[1] - i].pos == + self.c_node.bridges[0]["connection"]): + # connect + self.s_node = self.map[cords[0]][cords[1] - i] + + self.c_node.bridges[0]["bridge_num"] += 1 + self.s_node.bridges[1]["bridge_num"] += 1 + self.temp_done[0] = 1 + + if self.c_node.bridges[0]["bridge_num"] == 3: + self.c_node.bridges[0] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[1] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[0]["connection"] = self.s_node.pos + self.s_node.bridges[1]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[0]["connection"] is not None and self.map[cords[0]][ + cords[1] - i].bridge_occupied == 0: + pass + else: + break + else: + break + + def __right(self, cords): + for i in range(1, self.size): + if cords[0] + i < self.size: + if self.map[cords[0] + i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] + i][cords[1]].bridge_occupied < self.map[cords[0] + i][ + cords[1]].bridge_num or ( + self.c_node.bridges[2]["bridge_num"] == 2 and self.map[cords[0] + i][cords[1]].pos == + self.c_node.bridges[2]["connection"]): + # connect + self.s_node = self.map[cords[0] + i][cords[1]] + + self.c_node.bridges[2]["bridge_num"] += 1 + self.s_node.bridges[3]["bridge_num"] += 1 + self.temp_done[2] = 1 + + if self.c_node.bridges[2]["bridge_num"] == 3: + self.c_node.bridges[2] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[3] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[2]["connection"] = self.s_node.pos + self.s_node.bridges[3]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[2]["connection"] is not None and self.map[cords[0] + i][ + cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + + def __left(self, cords): + for i in range(1, self.size): + if cords[0] - i > -1: + if self.map[cords[0] - i][cords[1]].locked is False: + pass + + else: + if self.map[cords[0] - i][cords[1]].bridge_occupied < self.map[cords[0] - i][ + cords[1]].bridge_num or ( + self.c_node.bridges[3]["bridge_num"] == 2 and self.map[cords[0] - i][cords[1]].pos == + self.c_node.bridges[3]["connection"]): + # connect + self.s_node = self.map[cords[0] - i][cords[1]] + + self.c_node.bridges[3]["bridge_num"] += 1 + self.s_node.bridges[2]["bridge_num"] += 1 + self.temp_done[3] = 1 + + if self.c_node.bridges[3]["bridge_num"] == 3: + self.c_node.bridges[3] = {"bridge_num": 0, "connection": None} + self.s_node.bridges[2] = {"bridge_num": 0, "connection": None} + else: + self.c_node.bridges[3]["connection"] = self.s_node.pos + self.s_node.bridges[2]["connection"] = self.c_node.pos + + break + else: + if self.c_node.bridges[3]["connection"] is not None and self.map[cords[0] - i][ + cords[1]].bridge_occupied == 0: + pass + else: + break + else: + break + + @staticmethod + def get_other(temp): + second = [0, 0, 0, 0] + + if temp[0]: + second[1] = 1 + elif temp[1]: + second[0] = 1 + elif temp[2]: + second[3] = 1 + elif temp[3]: + second[2] = 1 + + return second + + +class NodeG: + + def __init__(self, pos, bridge_num=0): + self.pos = pos + self.bridge_occupied = 0 + self.bridge_num = bridge_num + self.locked = False + self.widget = None + self.check_for_win = False + + self.bridges = [{"bridge_num": 0, "connection": None} for _ in range(4)] # down, up, right, left diff --git a/hashi_generator.py b/hashi_generator.py new file mode 100644 index 0000000..b06d194 --- /dev/null +++ b/hashi_generator.py @@ -0,0 +1,232 @@ +import random + + +class Hashi: + + def __init__(self, size): + if size < 2: + size = 2 + print("Size cant be 1 or lower.") + self.size = size + self.node_limit_lower = size # lower limit + self.node_upper_limit = int(size ** 1.4) + 1 # upper limit + self.node_count = 0 + self.low_lim = 0 + self.high_lim = size + + self.map = [[Node([x, y]) for y in range(size)] for x in range(size)] + + def generate_map(self): + # down, up, right, left + first = [random.randint(0, self.size-1), random.randint(0, self.size-1)] + self.node_count += 1 + + node = self.get_node(first) + self.write_node(node) + nodes_to_do = self.get_new_nodes(node) + while len(nodes_to_do) != 0: + for n in nodes_to_do: + node = self.get_node(n) + self.write_node(node) + nodes_to_do = nodes_to_do + self.get_new_nodes(node) + nodes_to_do.remove(n) + + def get_node(self, cords): + ways = [0, 0, 0, 0] # down, up, right, left + possibilities = 0 + + if self.node_count >= self.node_upper_limit: + node = {"ways": [0, 0, 0, 0], + "num_of_bridges": [random.randint(1, 2) for _ in range(4)], + "pos": cords} + + return node + + if cords[1] - 1 > -1 and self.map[cords[0]][cords[1] - 1].locked is False: + ways[0] += 1 + possibilities += 1 + + if cords[1] + 1 < self.size and self.map[cords[0]][cords[1] + 1].locked is False: + ways[1] += 1 + possibilities += 1 + + if cords[0] + 1 < self.size and self.map[cords[0] + 1][cords[1]].locked is False: + ways[2] += 1 + possibilities += 1 + + if cords[0] - 1 > -1 and self.map[cords[0] - 1][cords[1]].locked is False: + ways[3] += 1 + possibilities += 1 + + if possibilities: + attempts = [x+1 if random.randint(0, 1) == 0 else x for x in ways] + + # making the puzzle forcefully bigger + if self.node_count < self.node_limit_lower: + while 2 not in attempts: + attempts = [x + 1 if random.randint(0, 1) == 0 else x for x in ways] + + # getting the starting distances + distances = [1 if x > 1 else 0 for x in attempts] + + # getting possible distance up to 6 + if attempts[0] > 1: + for i in range(2, self.size): + if cords[1] - i > -1 and self.map[cords[0]][cords[1] - i].locked is False: + distances[0] += 1 + else: + break + + if attempts[1] > 1: + for i in range(2, self.size): + if cords[1]+i < self.size and self.map[cords[0]][cords[1]+i].locked is False: + distances[1] += 1 + else: + break + + if attempts[2] > 1: + for i in range(2, self.size): + if cords[0] + i < self.size and self.map[cords[0]+i][cords[1]].locked is False: + distances[2] += 1 + else: + break + + if attempts[3] > 1: + for i in range(2, self.size): + if cords[0] - i > -1 and self.map[cords[0] - i][cords[1]].locked is False: + distances[3] += 1 + else: + break + + final_decision = [random.randint(1, x)if x != 0 else 0 for x in distances] + + node = {"ways": final_decision, + "num_of_bridges": [random.randint(1, 2) for _ in range(4)], + "pos": cords} + + return node + + else: + node = {"ways": [0, 0, 0, 0], + "num_of_bridges": [random.randint(1, 2) for _ in range(4)], + "pos": cords} + + return node + + def write_node(self, node): + pos = node["pos"] + + i = 0 + sum_of_bridges = 0 + for item in node["ways"]: + if item != 0: + sum_of_bridges += node["num_of_bridges"][i] + + # adding the bridges to new nodes + if i == 0: + self.map[pos[0]][pos[1] - item].bridge_num += node["num_of_bridges"][i] + elif i == 1: + self.map[pos[0]][pos[1] + item].bridge_num += node["num_of_bridges"][i] + elif i == 2: + self.map[pos[0] + item][pos[1]].bridge_num += node["num_of_bridges"][i] + elif i == 3: + self.map[pos[0] - item][pos[1]].bridge_num += node["num_of_bridges"][i] + + i += 1 + + self.map[pos[0]][pos[1]].locked = True + self.map[pos[0]][pos[1]].bridge_num += sum_of_bridges + + def get_new_nodes(self, node): + pos = node["pos"] + # down, up, right, left + nodes_to_send = [] + + for nodeX in range(1, node["ways"][0]+1): + self.map[pos[0]][pos[1] - nodeX].locked = True + + if nodeX == node["ways"][0]: + nodes_to_send.append(self.map[pos[0]][pos[1] - nodeX].pos) + + for nodeX in range(1, node["ways"][1]+1): + self.map[pos[0]][pos[1] + nodeX].locked = True + + if nodeX == node["ways"][1]: + nodes_to_send.append(self.map[pos[0]][pos[1] + nodeX].pos) + + for nodeX in range(1, node["ways"][2]+1): + self.map[pos[0] + nodeX][pos[1]].locked = True + + if nodeX == node["ways"][2]: + nodes_to_send.append(self.map[pos[0] + nodeX][pos[1]].pos) + + for nodeX in range(1, node["ways"][3]+1): + self.map[pos[0] - nodeX][pos[1]].locked = True + + if nodeX == node["ways"][3]: + nodes_to_send.append(self.map[pos[0] - nodeX][pos[1]].pos) + + self.node_count += len(nodes_to_send) + + return nodes_to_send + + def save(self, path): + final_string = "" + + for y in range(self.size): + + for x in range(self.size): + final_string += str(self.map[x][y].bridge_num) + " " + + final_string += "\n" + + with open(path, "w") as f: + f.write(final_string) + f.close() + + def print(self, bridges=False): + final_string = "_" * ((self.size * 2) + 3) + "\n" + + for y in range(self.size): + final_string += "| " + + for x in range(self.size): + if bridges is False: + final_string += str(self.map[x][y].bridge_num) + " " + else: + final_string += f" |* {self.map[x][y].bridge_num} *,{str(self.map[x][y].locked)[0]}| " + + final_string += "|\n" + + final_string += "¯" * ((self.size * 2) + 3) + + print(final_string) + + def __len__(self): + return self.node_count + + def __str__(self): + final_string = "_" * ((self.size*2)+3) + "\n" + + for y in range(self.size): + final_string += "| " + + for x in range(self.size): + final_string += str(self.map[x][y].bridge_num) + " " + + final_string += "|\n" + + final_string += "¯" * ((self.size*2)+3) + + return final_string + + def __add__(self, other): + return self.node_count + other.node_count + + +class Node: + + def __init__(self, pos, bridge_num=0): + self.pos = pos + self.bridge_num = bridge_num + self.locked = False diff --git a/menu_effect.py b/menu_effect.py new file mode 100644 index 0000000..13257e9 --- /dev/null +++ b/menu_effect.py @@ -0,0 +1,50 @@ +import pygame +import random + + +class Circle_effect: + + circles = [] + timer = 0 + + def __init__(self, pos, radius, speed, vertical): + self.pos = pos + self.radius = radius + self.speed = speed + self.vertical = vertical # True for going up False for down + + def move(self, display, palette, horizontal=False): + sur = pygame.Surface((self.radius * 2, self.radius * 2)) + pygame.draw.circle(sur, palette.palette["addition"], [self.radius, self.radius], self.radius) + sur.set_alpha(random.randint(100, 200)) + sur.set_colorkey((0, 0, 0)) + display.blit(sur, self.pos) + + if self.vertical: + if horizontal: + self.pos[0] -= self.speed + else: + self.pos[1] -= self.speed + else: + if horizontal: + self.pos[0] += self.speed + else: + self.pos[1] += self.speed + + if self.pos[1] < -100 or self.pos[0] > 700 or self.pos[1] > 700 or self.pos[0] < -100: + self.delete(self) + + @classmethod + def generate_circles(cls, amount=100, y_lim=None): + if y_lim is None: + y_lim = [0, 100] + + for _ in range(amount): + cls.circles.append(Circle_effect([random.randint(y_lim[0], y_lim[1]), random.randint(0, 650)], + random.randint(20, 50), random.randint(1, 4), + [True if x == 1 else False for x in [random.randint(0, 1)]][0])) + + @classmethod + def delete(cls, circle): + cls.circles.remove(circle) + diff --git a/s_engine.py b/s_engine.py new file mode 100644 index 0000000..cb2ea6b --- /dev/null +++ b/s_engine.py @@ -0,0 +1,527 @@ +import pygame +import sys +import time +import random +import math +import copy +from pygame.locals import * + +pygame.init() + + +# has attributes for basic thing in game +class Game: + def __init__(self, game_maps=None): + self.alive = True + # fs = fullscreen + self.fs = False + self.custom_id_giver = 0 + + self.game_flow = {} + + self.game_maps = None + # checks if there are any maps if there are puts them in self.game_maps + if game_maps is not None: + self.game_maps = game_maps + + +# stores objects in a sorted way +class Objects: + def __init__(self): + self.game_objects = [] + self.collision_objects = [] + self.moving_objects = [] + + # dunno if next att will be useful + # u add ids of objects u want to delete there is no func to delete for now + + self.objects_to_delete = [] + + self.values = { + "pos_to_del": [] + } + + def do_collisions(self, objects): + for obj in self.collision_objects: + collision(obj, objects) + + def take_out_trash(self, ids): + for trash in self.objects_to_delete: + ids.ids_to_remove.append(trash) + self.objects_to_delete = [] + + +# Id class just stores all ids of all objects +class Id: + all_ids = [] + ids_to_remove = [] + + def remove_by_id(self, objects): + for item in self.ids_to_remove: + for obj in objects.game_objects: + if obj.object_id == item: + g_index = objects.game_objects.index(obj) + if obj.moving: + m_index = objects.moving_objects.index(obj) + if obj.move.collisions: + c_index = objects.collision_objects.index(obj) + + del objects.collision_objects[c_index] + + del objects.moving_objects[m_index] + + del objects.game_objects[g_index] + + self.ids_to_remove = [] + + +class Scroll: + def __init__(self, scroll): + self.scroll = scroll + self.fade = 20 + self.safe_fade = 20 + self.in_progress = False + self.save_scroll = self.scroll + + def move_scroll(self, player, screen, which, space=20): + if which == "y" or which == "both": + self.scroll[1] += (player.rect.y - self.scroll[1] - (screen[1] / 2) + (player.size[1] / 2)) / space + self.scroll[1] = int(self.scroll[1]) + if which == "x" or which == "both": + self.scroll[0] += (player.rect.x - self.scroll[0] - (screen[0] / 2) + (player.size[0] / 2)) / space + self.scroll[0] = int(self.scroll[0]) + + def add_scroll(self, which, how_much, fade=None): + if fade is not None: + self.safe_fade = fade + if self.in_progress is False: + self.load_safe_fade() + self.save_scroll = self.scroll + self.in_progress = True + how_much[0] /= self.fade + how_much[1] /= self.fade + self.fade += 0.01 * self.fade + + if which == "x" or which == "both": + self.scroll[0] += how_much[0] + self.scroll[0] = round(self.scroll[0]) + + if which == "y" or which == "both": + self.scroll[1] += how_much[1] + self.scroll[1] = round(self.scroll[1]) + + def load_safe_fade(self): + self.fade = self.safe_fade + self.in_progress = False + + # next function is used for mouse scrolling mainly + def move_scroll_based_on_pos(self, pos, screen, which, space=20): + # id used for mouse u can first check mouse pos from mid to create non moving bubble in middle + if which == "y" or which == "both": + self.scroll[1] += (pos[1] - self.scroll[1] - (screen[1] / 2)) / space + self.scroll[1] = int(self.scroll[1]) + if which == "x" or which == "both": + self.scroll[0] += (pos[0] - self.scroll[0] - (screen[0] / 2)) / space + self.scroll[0] = int(self.scroll[0]) + + # for limiting scroll + @staticmethod + def scroll_lim(scroll, lim_min, lim_max): + # min lim has priority + + if lim_min[0] < lim_max[0]: + + if scroll.scroll[0] < lim_min[0]: + scroll.scroll[0] = lim_min[0] + + if scroll.scroll[0] > lim_max[0]: + scroll.scroll[0] = lim_max[0] + else: + scroll.scroll[0] = lim_min[0] + + if lim_min[1] < lim_max[1]: + if scroll.scroll[1] < lim_min[1]: + scroll.scroll[1] = lim_min[1] + + if scroll.scroll[1] > lim_max[1]: + scroll.scroll[1] = lim_max[1] + else: + scroll.scroll[1] = lim_min[1] + + +class Special: + def __init__(self, object_id): + self.object_id = object_id + self.stage = "" + self.attribute = "" + self.images = [] + self.attribute_0 = 0 + self.attribute_1 = 0 + self.attribute_2 = 0 + self.color_r = [0, 0, 0] + self.boolean_attribute = False + self.height = 0 + self.power = 0 + self.flip = False + self.scroll = False + self.fixed = False + + +# collisions class take care of collision funcs +# !!!!!!!!!! holds init for Object !!!!!!!!!!!!!!!!!!! +# class purely for inheritance +class Collisions(Id): + + def __init__(self, typeX, object_id, x_y, movement, direction, moving, size, special=None): + self.type = typeX + self.object_id = object_id + self.object_pos = x_y + self.movement = movement + self.direction = direction + self.moving = moving + self.size = size + self.dir_movement = [0.0, 0.0] + self.memory = [] + self.special = special + if self.object_id != self.all_ids: + self.all_ids.append(self.object_id) + else: + print("duplicate/ linked object") + + # giving it bonus classes + + if self.moving: + self.move = Moving_Object() + if self.special: + self.specific = Special(self.object_id) + + self.rect = pygame.Rect(self.object_pos[0], self.object_pos[1], self.size[0], self.size[1]) + + # theres a function for every type of collisions + # edit collisions here (I added some basic ones just so u can see) + # self if objects that it hit and obj is the object that hit smt + + # always add both side of collisions (ask who collided with whom) + + def hit_bottom(self, obj, objects): + if self.type == "solid": + if obj.type == "player": + obj.rect.bottom = self.rect.top + obj.object_pos = [obj.rect.x, obj.rect.y] + self.memory[0] -= 1 + if self.memory[0] == 0: + objects.objects_to_delete.append(self.object_id) + + opposite = obj.move.get_final_vector() + opp = [-opposite[0] * 0.4, -opposite[1] * 0.8] + obj.move.vectors.append(opp) + + def hit_top(self, obj, objects): + if self.type == "solid": + if obj.type == "player": + obj.rect.top = self.rect.bottom + obj.object_pos = [obj.rect.x, obj.rect.y] + self.memory[0] -= 1 + if self.memory[0] == 0: + objects.objects_to_delete.append(self.object_id) + + opposite = obj.move.get_final_vector() + opp = [-opposite[0] * 0.4, -opposite[1] * 0.8] + obj.move.vectors.append(opp) + + def hit_left(self, obj, objects): + if self.type == "solid": + if obj.type == "player": + obj.rect.left = self.rect.right + obj.object_pos = [obj.rect.x, obj.rect.y] + self.memory[0] -= 1 + if self.memory[0] == 0: + objects.objects_to_delete.append(self.object_id) + + opposite = obj.move.get_final_vector() + opp = [-opposite[0] * 0.4, -opposite[1] * 0.8] + obj.move.vectors.append(opp) + + def hit_right(self, obj, objects): + if self.type == "solid": + if obj.type == "player": + obj.rect.right = self.rect.left + obj.object_pos = [obj.rect.x, obj.rect.y] + self.memory[0] -= 1 + if self.memory[0] == 0: + objects.objects_to_delete.append(self.object_id) + + opposite = obj.move.get_final_vector() + opp = [-opposite[0] * 0.4, -opposite[1] * 0.8] + obj.move.vectors.append(opp) + + +# next 2 classes are for object class +class Moving_Object: + def __init__(self): + # consts + self.degree = 0.0174533 + self.pi = math.pi + self.half_pi = round(math.pi / 2, 6) + self.two_pi = round(math.pi * 2, 6) + self.three_halves_pi = round(3 * (math.pi / 2), 6) + self.speed = 1 + self.force = 3 + self.offset = 0 + self.vectors = [] + + self.forward = False + self.backwards = False + self.left = False + self.right = False + + self.collisions = False + + def move(self, dir_movement): + + movement = dir_movement + + return movement + + # dir is the angle the player is facing + def change_dir(self, direction, angle): + + new_vector = [0, 0] + + if self.left: + direction -= angle + if direction < 0: + direction += self.two_pi + new_vector[0] = round(math.cos(direction) * self.speed, 2) + new_vector[1] = round(math.sin(direction) * self.speed, 2) + self.vectors.append(new_vector) + elif self.right: + direction += angle + if direction > self.two_pi: + direction -= self.two_pi + new_vector[0] = round(math.cos(direction) * self.speed, 2) + new_vector[1] = round(math.sin(direction) * self.speed, 2) + self.vectors.append(new_vector) + elif self.forward: + new_vector[0] = round(math.cos(direction) * self.speed, 2) + new_vector[1] = round(math.sin(direction) * self.speed, 2) + self.vectors.append(new_vector) + + return direction, self.get_final_vector() + + # used for setting things before game loop + def set_start_dir_movement(self, direction, dir_movement): + dir_movement[0] = round(math.cos(direction + (self.offset * self.degree)) * self.speed, 2) + dir_movement[1] = round(math.sin(direction + (self.offset * self.degree)) * self.speed, 2) + return dir_movement + + def get_final_vector(self): + to_remove = [] + for i in range(len(self.vectors)-1): + self.vectors[i][0] *= 0.96 + self.vectors[i][1] *= 0.96 + if abs(self.vectors[i][0]) < 0.2 and abs(self.vectors[i][1]) < 0.2: + to_remove.append(self.vectors[i]) + + for item in to_remove: + self.vectors.remove(item) + + final_vector = [0, 0] + + for vector in self.vectors: + final_vector[0] += vector[0] + final_vector[1] += vector[1] + + return final_vector + + +class Object(Collisions): + def __init__(self, typeX, object_id, x_y, movement, direction, moving, size, special=None): + super().__init__(typeX, object_id, x_y, movement, direction, moving, size, special) + + def __str__(self): + return self.type + + # changes position along with the rect + def change_pos(self, x_y): + self.object_pos = x_y + self.rect = pygame.Rect(self.object_pos[0], self.object_pos[1], self.size[0], self.size[1]) + + +class Mouse: + + points = 0 + + def __init__(self, mouse_pos): + self.mouse_pos = mouse_pos + self.mouse_scroll = [0, 0] + + def update(self, Win_size, Default_size): + self.mouse_pos = pygame.mouse.get_pos() + self.mouse_pos = [((self.mouse_pos[0] - self.mouse_scroll[0]) * (Default_size[0] / Win_size[0])), + ((self.mouse_pos[1] - self.mouse_scroll[1]) * (Default_size[1] / Win_size[1]))] + + def get_scrolled(self, scroll): + scrolled_pos = [self.mouse_pos[0] + scroll.scroll[0], + self.mouse_pos[1] + scroll.scroll[1]] + return scrolled_pos + + +def distance_indicator(coords1, coords2): + x_distance = abs(coords1[0] - coords2[0]) + y_distance = abs(coords1[1] - coords2[1]) + distance = math.sqrt((x_distance ** 2) + (y_distance ** 2)) + return round(distance, 4) + + +def load_images(path, name, number_of_images, file_type=".png"): + images = [] + for i in range(number_of_images): + images.append(pygame.image.load("{}/{}{}{}".format(path, name, i, file_type)).convert()) + return images + + +def load_map(path): + f = open(path, "r") + data = f.read() + f.close() + data = data.split('\n') + product = [] + for line in data: + product.append(list(line)) + return product + + +# next func sorts object into objects class so the objects is stored where it should be +def sort(obj, objects): + objects.game_objects.append(obj) + + if obj.moving: + objects.moving_objects.append(obj) + + if obj.move.collisions: + objects.collision_objects.append(obj) + + +def find_collisions(obj, objects): + hit_list = [] + for element in objects.game_objects: + if element.object_id != obj.object_id: + if element.rect.colliderect(obj.rect): + hit_list.append(element) + return hit_list + + +def collision(obj, objects): + # collisions for left/right + obj.change_pos([obj.object_pos[0] + obj.movement[0], obj.object_pos[1]]) + hit_list = find_collisions(obj, objects) + for item in hit_list: + if obj.movement[0] > 0: + item.hit_right(obj, objects) + elif obj.movement[0] < 0: + item.hit_left(obj, objects) + + # collisions for top/bottom + obj.change_pos([obj.object_pos[0], obj.object_pos[1] + obj.movement[1]]) + hit_list = find_collisions(obj, objects) + for item in hit_list: + if obj.movement[1] > 0: + item.hit_bottom(obj, objects) + elif obj.movement[1] < 0: + item.hit_top(obj, objects) + + +# !!!!!!!!!!! config this function for every program !!!!!!!!!! +def load_objects(game_map, width, height, objects, game): + x, y = 0, 0 + for line in game_map: + for obj in line: + # this is just to be efficient normaly u can use elif and put another obj to another num + if obj == "1": + obj = Object("solid", game.custom_id_giver, [x, y], [0, 0], 0, False, [width, height]) + obj.memory.append(3) + sort(obj, objects) + game.custom_id_giver += 1 + x += width + y += height + x = 0 + + +def load_textures(objects, dictionary, display, scroll): + for object in objects.game_objects: + if object.special: + display.blit(object.specific.images[object.specific.attribute_0], + [object.object_pos[0] - scroll.scroll[0], object.object_pos[1] - scroll.scroll[1]]) + else: + display.blit(dictionary["{}".format(object.type)], + [object.object_pos[0] - scroll.scroll[0], object.object_pos[1] - scroll.scroll[1]]) + + +def load_sp_texture(objects, type_x, image): + for object in objects.special_objects: + if object.type == type_x: + object.attributes.images.append(image) + + +def load_bg(image, y_x, width, height, display): + pos = [0, 0] + for i in range(y_x[0]): + for j in range(y_x[1]): + display.blit(image, pos) + pos[0] += width + pos[0] = 0 + pos[1] += height + + +def find_angle_between_points(center, point): + dists = distances(center, point) + try: + angle = math.atan(dists[1] / dists[0]) + + if point[0] < center[0]: + if point[1] < center[1]: + return angle + math.pi + else: + return (math.pi / 2 - angle) + (math.pi / 2) + else: + if point[1] < center[1]: + return (math.pi / 2 - angle) + 3 * (math.pi / 2) + else: + return angle + except ZeroDivisionError: + return False + + +def distances(cords1, cords2): + return [abs(cords1[0] - cords2[0]), abs(cords1[1] - cords2[1])] + + +def average(*args): + sumX = 0 + for item in args: + sumX += item + return sumX/len(args) + + +def area_intersection_of_circles(points, radius_list): + try: + dist = distance_indicator(points[0], points[1]) + + alpha_cos = (pow(radius_list[1], 2) + pow(dist, 2) - pow(radius_list[0], 2)) / (2 * radius_list[1] * dist) + + alpha = math.acos(alpha_cos) + + beta_cos = (dist - alpha_cos * radius_list[1]) / radius_list[0] + + beta = math.acos(beta_cos) + + triangles = (alpha_cos * pow(radius_list[1], 2) * math.sin(alpha)) + ( + beta_cos * pow(radius_list[0], 2) * math.sin(beta)) + + arcs = ((math.pi * pow(radius_list[0], 2) * beta * 2) / math.tau) + ( + (math.pi * pow(radius_list[1], 2) * alpha * 2) / math.tau) + + return arcs - triangles + except: + return False diff --git a/sounds.py b/sounds.py new file mode 100644 index 0000000..005263b --- /dev/null +++ b/sounds.py @@ -0,0 +1,12 @@ +import pygame +from pygame.locals import * + +pygame.init() + + +def get_sounds(): + sounds = {"click": pygame.mixer.Sound("assets/sounds/click.wav"), + "remove": pygame.mixer.Sound("assets/sounds/remove.wav"), + "join": pygame.mixer.Sound("assets/sounds/join.wav")} + + return sounds diff --git a/widget_engine.py b/widget_engine.py new file mode 100644 index 0000000..dd99293 --- /dev/null +++ b/widget_engine.py @@ -0,0 +1,99 @@ +import pygame +import math + + +class Button: + + def __init__(self, pos, size, images, onclick=None, onclick_args=None, active=True): + self.pos = pos + self.size = size + self.rect = pygame.Rect(pos[0], pos[1], size[0], size[1]) + self.images = images + self.display_image = images["idle"] + self.on_click = onclick + self.oc_args = onclick_args + self.active = active + self.switch_images = None + self.name = "" + + def hover_check(self, mouse_pos): + if self.active: + if self.rect.collidepoint(mouse_pos): + self.display_image = self.images["hover"] + else: + self.display_image = self.images["idle"] + + def click_check(self, mouse_pos): + if self.active: + if self.rect.collidepoint(mouse_pos): + if self.on_click is not None: + self.on_click(self.oc_args) + + def blit(self, display, scroll=None): + if self.active: + if scroll is None: + display.blit(self.display_image, self.pos) + else: + display.blit(self.display_image, [self.pos[0] - scroll.scroll[0], + self.pos[1] - scroll.scroll[1]]) + + def switch(self, mouse_pos): + self.switch_images, self.images = self.images, self.switch_images + self.hover_check(mouse_pos) + + def move(self, movement): + self.pos = [self.pos[0] + movement[0], + self.pos[1] + movement[1]] + self.rect = pygame.Rect(self.pos[0], self.pos[1], self.size[0], self.size[1]) + + +class CircleButton: + def __init__(self, size, pos, images, onclick=None, onclick_args=None, active=True): + self.pos = pos + self.size = size + self.center = [pos[0] + (size/2), pos[1] + (size/2)] + self.radius = size/2 + self.images = images + self.display_image = images["idle"] + self.on_click = onclick + self.oc_args = onclick_args + self.active = active + self.switch_images = None + self.name = "" + + def hover_check(self, mouse_pos): + if self.active: + if distance_indicator(self.center, mouse_pos) <= self.radius: + self.display_image = self.images["hover"] + else: + self.display_image = self.images["idle"] + + def click_check(self, mouse_pos): + if self.active: + if distance_indicator(self.center, mouse_pos) <= self.radius: + if self.on_click is not None: + self.on_click(self.oc_args) + + def blit(self, display, scroll=None): + if self.active: + if scroll is None: + display.blit(self.display_image, self.pos) + else: + display.blit(self.display_image, [self.pos[0] - scroll.scroll[0], + self.pos[1] - scroll.scroll[1]]) + + def switch(self, mouse_pos): + self.switch_images, self.images = self.images, self.switch_images + self.hover_check(mouse_pos) + + def move(self, movement): + self.pos = [self.pos[0] + movement[0], + self.pos[1] + movement[1]] + self.center = [self.pos[0] + (self.size / 2), self.pos[1] + (self.size / 2)] + + +def distance_indicator(cords1, cords2): + x_distance = abs(cords1[0] - cords2[0]) + y_distance = abs(cords1[1] - cords2[1]) + distance = round(math.sqrt((x_distance**2) + (y_distance**2))) + return distance