From a31c8e921c4349afe72f70f5af68415ce278cff9 Mon Sep 17 00:00:00 2001 From: LoafyLemon Date: Sun, 17 Nov 2024 14:32:23 +0000 Subject: [PATCH] Mirror of Erised 2.0 - Prototype --- game/scripts/minigames/mirror/menu.rpy | 521 ++++++++++++++++--------- 1 file changed, 333 insertions(+), 188 deletions(-) diff --git a/game/scripts/minigames/mirror/menu.rpy b/game/scripts/minigames/mirror/menu.rpy index dd26da56..8c38c1dc 100644 --- a/game/scripts/minigames/mirror/menu.rpy +++ b/game/scripts/minigames/mirror/menu.rpy @@ -1,213 +1,358 @@ -init python: - def mirror_sortfilter(item, sortby="A-z", filtering=None): - if filtering == "Locked": - item = [x for x in item if x.is_unlocked()] - elif filtering == "Unlocked": - item = [x for x in item if x.is_unlocked() is True] +# init python: +# def mirror_sortfilter(item, sortby="A-z", filtering=None): +# if filtering == "Locked": +# item = [x for x in item if x.is_unlocked()] +# elif filtering == "Unlocked": +# item = [x for x in item if x.is_unlocked() is True] - # Always sort alphabetically first. - item = sorted(item, key=lambda x: natsort_key(x.name)) +# # Always sort alphabetically first. +# item = sorted(item, key=lambda x: natsort_key(x.name)) - if sortby == "z-A": - item = sorted(item, key=lambda x: natsort_key(x.name), reverse=True) +# if sortby == "z-A": +# item = sorted(item, key=lambda x: natsort_key(x.name), reverse=True) - return item +# return item -label mirror: - $ gui.in_context("mirror_menu") +# label mirror: +# $ gui.in_context("mirror_menu") +# call screen room_menu + +# label mirror_menu(xx=150, yy=90): + +# python: +# mirror_categories = mirror.get_tags() + +# items_shown = 36 +# current_page = 0 +# current_category = mirror_categories[0] +# current_filter = "Unlocked" +# current_sorting = "A-z" + +# menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) +# menu_items_length = len(menu_items) +# current_item = next(iter(menu_items), None) + +# show screen mirror(xx, yy) + +# label .after_init: +# $ renpy.dynamic(__choice = ui.interact()) + +# if __choice[0] == "select": +# $ current_item = __choice[1] +# $ current_item.seen = True +# elif __choice[0] == "category": +# $ current_category = __choice[1] + +# $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) +# $ menu_items_length = len(menu_items) +# $ current_page = 0 +# $ current_item = next(iter(menu_items), None) +# elif __choice == "inc": +# $ current_page += 1 +# elif __choice == "dec": +# $ current_page += -1 +# elif __choice == "filter": +# if current_filter == "Unlocked": +# $ current_filter = None +# elif current_filter is None: +# $ current_filter = "Unlocked" + +# $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) +# $ menu_items_length = len(menu_items) +# $ current_page = 0 +# $ current_item = next(iter(menu_items), None) +# elif __choice == "sort": +# if current_sorting == "A-z": +# $ current_sorting = "z-A" +# else: +# $ current_sorting = "A-z" + +# $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) +# $ menu_items_length = len(menu_items) +# $ current_page = 0 +# $ current_item = next(iter(menu_items), None) +# elif __choice[0] == "play": +# $ __choice[1].play() +# $ renpy.jump_out_of_context("mirror") +# else: +# $ enable_game_menu() +# hide screen mirror +# return + +# jump .after_init + +# screen mirror(xx, yy): +# tag mirror +# zorder 30 +# modal True + +# add "gui_fade_both" + +# if renpy.mobile: +# use close_button_background + +# use close_button + +# fixed: +# if settings.get("animations"): +# at gui_animation +# use mirror_menu(xx, yy) +# use mirror_menuitem(xx, yy) + +# screen mirror_menu(xx, yy): +# window: +# style "empty" +# style_prefix gui.theme('achievements') +# pos (xx, yy) +# xysize (207, 454) + +# use invisible_button() + +# add gui.format("interface/achievements/{}/panel_left.webp") + +# vbox: +# style_prefix gui.theme('achievements_categories') +# pos (6, 41) +# for category in mirror_categories: +# vbox: +# textbutton category: +# selected (current_category == category) +# action Return(["category", category]) + +# add gui.format("interface/achievements/{}/spacer_left.webp") +# vbox: +# style_prefix gui.theme('achievements_filters') +# pos (6, 384) + +# if current_filter is None: +# textbutton "Show: All" action Return("filter") +# else: +# textbutton "Show: [current_filter]" action Return("filter") +# textbutton "Sort by: [current_sorting]" action Return("sort") + +# screen mirror_menuitem(xx, yy): +# window: +# style "empty" +# pos (xx+217, yy-53) +# xysize (560, 507) +# use invisible_button() + +# #add "interface/achievements/star.webp" +# add gui.format("interface/achievements/{}/panel.webp") + +# text "Mirror of Erised" size 22 xalign 0.5 ypos 65 + +# # Add items +# viewport: +# style_prefix gui.theme() +# draggable True +# mousewheel "vertical" +# scrollbars "vertical" +# maximum (512, 290) +# pos (24, 113) +# vbox: +# style_prefix "mirror" +# for ev in menu_items: +# $ authors = ", ".join(ev.authors) +# $ is_unlocked = ev.is_unlocked() +# button: +# ysize 30 +# selected_background Transform(gui.format("interface/achievements/{}/highlight.webp"), ysize=26) +# selected (current_item == ev) +# sensitive is_unlocked +# xfill True +# action Return(["select", ev]) +# if is_unlocked and not ev.seen: +# text "NEW" style "wardrobe_item_caption" align (1.0, 1.0) offset (-5, -5) +# if ev.played: +# add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-5, -5) zoom 0.7 +# vbox: +# text ev.name +# text f"By {authors}" size 10 +# add gui.format("interface/achievements/{}/spacer_left.webp") + + +# if menu_items_length <= 0: +# text "Nothing here yet" align (0.5, 0.5) size 24 + +# if current_item: +# frame style "empty": +# xalign 0.5 +# ypos 412 + +# vbox: +# xalign 0.5 +# add gui.format("interface/achievements/{}/highlight.webp") +# add gui.format("interface/achievements/{}/spacer.webp") +# vbox: +# yoffset 6 +# xmaximum 400 +# text "[current_item.desc]" size 12 +# text "Tags:{}".format(", ".join(current_item.tags)) size 10 + +# text "[current_item.name]" xalign 0.5 ypos 3 size 16 + +# textbutton "Play": +# xalign 0.95 +# text_size 16 +# sensitive current_item.is_unlocked() +# action Return(["play", current_item]) + +# style mirror_button is empty + +# style mirror_button_text: +# color "#402313" +# insensitive_color "#40231380" +# hover_color "#FFF" +# outlines [] + +# style mirror_text is mirror_button_text: +# color "#402313" +# insensitive_color "#40231380" +# hover_color "#FFF" +# outlines [] + +init python in mirror_of_erised: + def select(item): + scope = renpy.get_screen("mirror_interface").scope + scope["selected_item"] = item + + item.seen = True + + renpy.restart_interaction() + + def play(item): + item.play() + + renpy.jump("mirror") + +label mirror(inter_pause=True): + $ disable_game_menu() + if inter_pause: + # Ensures all irrelevant screens are hidden before capturing the surface tree + with Pause(0.2) + call screen mirror_interface + $ enable_game_menu() call screen room_menu -label mirror_menu(xx=150, yy=90): - - python: - mirror_categories = mirror.get_tags() - - items_shown = 36 - current_page = 0 - current_category = mirror_categories[0] - current_filter = "Unlocked" - current_sorting = "A-z" - - menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) - menu_items_length = len(menu_items) - current_item = next(iter(menu_items), None) - - show screen mirror(xx, yy) - - label .after_init: - $ renpy.dynamic(__choice = ui.interact()) - - if __choice[0] == "select": - $ current_item = __choice[1] - $ current_item.seen = True - elif __choice[0] == "category": - $ current_category = __choice[1] - - $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) - $ menu_items_length = len(menu_items) - $ current_page = 0 - $ current_item = next(iter(menu_items), None) - elif __choice == "inc": - $ current_page += 1 - elif __choice == "dec": - $ current_page += -1 - elif __choice == "filter": - if current_filter == "Unlocked": - $ current_filter = None - elif current_filter is None: - $ current_filter = "Unlocked" - - $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) - $ menu_items_length = len(menu_items) - $ current_page = 0 - $ current_item = next(iter(menu_items), None) - elif __choice == "sort": - if current_sorting == "A-z": - $ current_sorting = "z-A" - else: - $ current_sorting = "A-z" - - $ menu_items = mirror_sortfilter(mirror.get_instances_of_tag(current_category), current_sorting, current_filter) - $ menu_items_length = len(menu_items) - $ current_page = 0 - $ current_item = next(iter(menu_items), None) - elif __choice[0] == "play": - $ __choice[1].play() - $ renpy.jump_out_of_context("mirror") - else: - $ enable_game_menu() - hide screen mirror - return - - jump .after_init - -screen mirror(xx, yy): - tag mirror - zorder 30 +screen mirror_interface(): modal True + layer "interface" + zorder 0 + style_prefix "mirror" - add "gui_fade_both" + default navigation_atl = navigation_show + default last_frame = (screenshot.capture() or screenshot.image) + default navigation_last_frame_atl = navigation_last_frame_show + default navigation_exit = False - if renpy.mobile: - use close_button_background + default menu_categories = mirror.get_tags() + default category = menu_categories[0] + default menu_items = mirror.get_instances_of_tag(category) + default selected_item = None - use close_button + add last_frame at navigation_last_frame_atl - fixed: - if settings.get("animations"): - at gui_animation - use mirror_menu(xx, yy) - use mirror_menuitem(xx, yy) + if navigation_exit: + timer 0.4 action Return() -screen mirror_menu(xx, yy): - window: + frame: style "empty" - style_prefix gui.theme('achievements') - pos (xx, yy) - xysize (207, 454) - - use invisible_button() - - add gui.format("interface/achievements/{}/panel_left.webp") + align (0.5, 0.5) + at navigation_atl vbox: - style_prefix gui.theme('achievements_categories') - pos (6, 41) - for category in mirror_categories: - vbox: - textbutton category: - selected (current_category == category) - action Return(["category", category]) + style_prefix "navigation_subtabs" + pos (286, 170) - add gui.format("interface/achievements/{}/spacer_left.webp") - vbox: - style_prefix gui.theme('achievements_filters') - pos (6, 384) + at navigation_subtabs_show - if current_filter is None: - textbutton "Show: All" action Return("filter") - else: - textbutton "Show: [current_filter]" action Return("filter") - textbutton "Sort by: [current_sorting]" action Return("sort") + for i in menu_categories: + textbutton "[i.capitalize()]" action [SetScreenVariable("category", i), SetScreenVariable("menu_items", mirror.get_instances_of_tag(i))] selected (category==i) at navigation_tabs + null height 35 + textbutton _("Return") action [SetScreenVariable("navigation_last_frame_atl", navigation_last_frame_hide), SetScreenVariable("navigation_atl", navigation_hide), SetScreenVariable("navigation_exit", True)] keysym ["game_menu", "achievements"] at navigation_tabs -screen mirror_menuitem(xx, yy): - window: - style "empty" - pos (xx+217, yy-53) - xysize (560, 507) - use invisible_button() - - #add "interface/achievements/star.webp" - add gui.format("interface/achievements/{}/panel.webp") - - text "Mirror of Erised" size 22 xalign 0.5 ypos 65 - - # Add items - viewport: - style_prefix gui.theme() - draggable True - mousewheel "vertical" - scrollbars "vertical" - maximum (512, 290) - pos (24, 113) + if selected_item: vbox: - style_prefix "mirror" - for ev in menu_items: - $ authors = ", ".join(ev.authors) - $ is_unlocked = ev.is_unlocked() - button: - ysize 30 - selected_background Transform(gui.format("interface/achievements/{}/highlight.webp"), ysize=26) - selected (current_item == ev) - sensitive is_unlocked - xfill True - action Return(["select", ev]) - if is_unlocked and not ev.seen: - text "NEW" style "wardrobe_item_caption" align (1.0, 1.0) offset (-5, -5) - if ev.played: - add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-5, -5) zoom 0.7 - vbox: - text ev.name - text f"By {authors}" size 10 - add gui.format("interface/achievements/{}/spacer_left.webp") + style_prefix "navigation_tabs" + pos (798, 170) + at navigation_tabs_show - if menu_items_length <= 0: - text "Nothing here yet" align (0.5, 0.5) size 24 + textbutton _("Play"): + action Function(mirror_of_erised.play, selected_item) + style "navigation_tabs_button_special" + at navigation_tabs - if current_item: - frame style "empty": - xalign 0.5 - ypos 412 + frame: + label _("Mirror of Erised") + # text "([achievements.get_percentage()]%)" pos (108, -3) + + # Add items + viewport: + ypos 32 + scrollbars "vertical" + mousewheel True + draggable "touch" vbox: - xalign 0.5 - add gui.format("interface/achievements/{}/highlight.webp") - add gui.format("interface/achievements/{}/spacer.webp") - vbox: - yoffset 6 - xmaximum 400 - text "[current_item.desc]" size 12 - text "Tags:{}".format(", ".join(current_item.tags)) size 10 + for item in menu_items: + $ authors = ", ".join(item.authors) + $ item_unlocked = item.is_unlocked() + $ item_color = "#ffffff" if item_unlocked else "#8d8d8d" + fixed: + fit_first True + button: + hbox: + fixed: + xysize (48, 48) + add Text("Placeholder") xysize (48, 48) fit "contain" align (0.5, 0.5) + # add crop_image_zoom(Text("No icon"), 48, 48, not item_unlocked) xysize (48, 48) fit "contain" align (0.5, 0.5) + null width 5 + vbox: + text "[item.name]" color item_color + text _("By [authors]") size 10 color item_color style "mirror_text_small" + text "[item.desc]" color item_color style "mirror_text_small" + action Function(mirror_of_erised.select, item) + selected (selected_item == item) + sensitive (item_unlocked) + if item.played: + add "interface/topbar/icon_check.webp" xysize (24, 24) yalign 0.5 + if item_unlocked and not item.seen: + text "NEW" align (1.0, 1.0) offset (-5, -5) + # if item_data.progression: + # if item_unlocked: + # bar value StaticValue(1.0) + # else: + # bar value StaticValue(eval(item_data.progression), item_data.progression_max) style "achievements_bar_disabled" + add "frame_spacer" xalign 0.5 xsize 500 - text "[current_item.name]" xalign 0.5 ypos 3 size 16 - - textbutton "Play": - xalign 0.95 - text_size 16 - sensitive current_item.is_unlocked() - action Return(["play", current_item]) - -style mirror_button is empty - -style mirror_button_text: - color "#402313" - insensitive_color "#40231380" - hover_color "#FFF" - outlines [] - -style mirror_text is mirror_button_text: - color "#402313" - insensitive_color "#40231380" - hover_color "#FFF" - outlines [] +style mirror_viewport is viewport: + xalign 0.5 + ymaximum 397 +style mirror_vbox is frame_vbox: + ypos 0 + yspacing 0 + xalign 0 +style mirror_frame is frame +style mirror_label is frame_label +style mirror_label_text is frame_label_text +style mirror_text is frame_text: + xalign 0 +style mirror_text_small is mirror_text: + xalign 0 + size 12 +style mirror_button is frame_button: + xfill True + yminimum 48 + selected_foreground "#ffffff2d" +style mirror_button_text is frame_button_text +style mirror_bar is player_bar: + xmaximum 400 + yalign 1.0 + xpos 78 + ysize 10 + yoffset -2 +style mirror_bar_disabled is mirror_bar: + left_bar Frame(Transform(Image("gui/creamy_pumpkin_pie/player/player_bar_full.png", oversample=4), matrixcolor=BrightnessMatrix(-0.5)), 24, 0, tile=False) + right_bar Frame(Transform(Image("gui/creamy_pumpkin_pie/player/player_bar_empty.png", oversample=4), matrixcolor=BrightnessMatrix(-0.5)), 24, 0, tile=False)