# init python: # def inventory_sortfilter(item, sortby="A-z", filtering=None): # if filtering == "Owned": # item = (x for x in item if x.owned > 0) # # Always sort alphabetically first. # item = sorted(item, key=lambda x: natsort_key(x.name)) # if sortby == "z-A": # item.sort(key=lambda x: natsort_key(x.name), reverse=True) # elif current_sorting == "Available": # item.sort(key=lambda x: x.owned is True, reverse=True) # elif current_sorting == "Unavailable": # item.sort(key=lambda x: x.owned is False) # return item default inventory_mode = 0 # 0 - Inventory, 1 - gifts #################################### ############# Menu ################# #################################### label inventory: call screen inventory # $ enable_game_menu() jump main_room_menu # label inventory_menu: # call screen inventory # return screen inventory(): modal True layer "interface" zorder 0 style_prefix "frame" 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 default category = "gift" # default subcategory = None default menu_items = inventory.get_instances_of_type(category) default selected_item = None add last_frame at navigation_last_frame_atl if navigation_exit: timer 0.4 action Return("close") frame: style "empty" align (0.5, 0.5) at navigation_atl vbox: style_prefix "navigation_subtabs" pos (286, 170) at navigation_subtabs_show textbutton _("Gifts") action [SetScreenVariable("category", "gift"), SetScreenVariable("menu_items", inventory.get_instances_of_type("gift")), SetScreenVariable("selected_item", None)] selected (category=="gift") at navigation_tabs textbutton _("Books") action [SetScreenVariable("category", "book"), SetScreenVariable("menu_items", inventory.get_instances_of_type("book")), SetScreenVariable("selected_item", None)] selected (category=="book") at navigation_tabs textbutton _("Scrolls") action [SetScreenVariable("category", "scroll"), SetScreenVariable("menu_items", inventory.get_instances_of_type("scroll")), SetScreenVariable("selected_item", None)] selected (category=="scroll") at navigation_tabs textbutton _("Ingredients") action [SetScreenVariable("category", "ingredient"), SetScreenVariable("menu_items", inventory.get_instances_of_type("ingredient")), SetScreenVariable("selected_item", None)] selected (category=="ingredient") at navigation_tabs textbutton _("Potions") action [SetScreenVariable("category", "potion"), SetScreenVariable("menu_items", inventory.get_instances_of_type("potion")), SetScreenVariable("selected_item", None)] selected (category=="potion") at navigation_tabs textbutton _("Decorations") action [SetScreenVariable("category", "decoration"), SetScreenVariable("menu_items", inventory.get_instances_of_type("decoration")), SetScreenVariable("selected_item", None)] selected (category=="decoration") at navigation_tabs textbutton _("Consumables") action [SetScreenVariable("category", "quest"), SetScreenVariable("menu_items", inventory.get_instances_of_type("quest")), SetScreenVariable("selected_item", None)] selected (category=="quest") 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 ["inventory", "game_menu"] at navigation_tabs if selected_item and ((inventory_mode==0 and selected_item.usable) or inventory_mode==1 and selected_item.givable): vbox: style_prefix "navigation_tabs" pos (798, 170) at navigation_tabs_show textbutton selected_item.caption: if inventory_mode==0: action [selected_item.use, renpy.restart_interaction] elif inventory_mode==1: action Return(selected_item) style "navigation_tabs_button_special" at navigation_tabs frame: # maximum (None, 450) label _("Inventory") # Add items grid 10 8: ypos 32 xalign 0.5 for item in menu_items: button: xysize (48, 48) if selected_item == item: add "interface/achievements/glow.webp" align (0.5, 0.5) xysize (48, 48) alpha 0.7 at rotate_circular add crop_image_zoom(item.get_image(), 48, 48, (item.owned <= 0 or (inventory_mode==1 and (not item.givable or not states.active_girl in item.usable_on)))) align (0.5, 0.5) if item.used or (item.type=="decoration" and item.in_use): add "interface/topbar/icon_check.webp" xysize (16, 16) offset (8, -8) if item.owned > 1: text "x[item.owned]" offset (-8, 34) size 12 if (inventory_mode==0 or (inventory_mode==1 and (item.givable and states.active_girl in item.usable_on))): action [SetScreenVariable("selected_item", item)] if selected_item: vbox: align (0.0, 1.0) hbox: spacing 5 add selected_item.get_image() xysize(96, 96) align (0.05, 0.95) vbox: yalign 1.0 xsize 400 hbox: label selected_item.name if selected_item.used or (selected_item.type=="decoration" and selected_item.in_use): add "interface/topbar/icon_check.webp" xysize (24, 24) yoffset -12 text selected_item.desc xalign 0 if selected_item.givable: text _("Usable on: [item.usable_on]") xalign 0 if selected_item.owned > 1: text "x[selected_item.owned]" align (0.0, 1.0) # screen inventory_menu(xx, yy): # style_prefix "frame" # 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: # pos (6, 41) # for category in iter(inventory_dict.keys()): # vbox: # textbutton category: # style "empty" # xsize 195 ysize 16 # text_xalign 0.5 # if current_category == category: # background gui.format("interface/achievements/{}/highlight_left.webp") # else: # hover_background gui.format("interface/achievements/{}/highlight_left.webp") # action Return(["category", category]) # add gui.format("interface/achievements/{}/spacer_left.webp") # # Gold & Tokens # null height 16 # text "{color=#daa520}Gold{/color} {outlinecolor=#ffffff00}[states.env.gold]{/outlinecolor}" size 12 outlines [ (2, "#000", 0, 0) ] xpos 0.1 xanchor 0 # add gui.format("interface/achievements/{}/spacer_left.webp") # text "{color=#2055da}Tokens{/color} {outlinecolor=#ffffff00}[states.env.tokens]{/outlinecolor}" size 12 outlines [ (2, "#000", 0, 0) ] xpos 0.1 xanchor 0 # 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 inventory_menuitem(xx, yy): # window: # style "empty" # style_prefix gui.theme() # pos (xx+217, yy-53) # xysize (560, 507) # use invisible_button() # add "interface/achievements/inventory.webp" # add gui.format("interface/achievements/{}/panel.webp") # #Western Egg # button xsize 90 ysize 60 action Play("sound", "sounds/plushie.ogg") xalign 0.5 style "empty" # text "Inventory" size 22 xalign 0.5 ypos 65 # #text "Unlocked: "+str(len([x for x in menu_items if x[1][3] is True]))+"/[menu_items_length]" size 12 pos (24, 70) # # Page counter # if menu_items_length > items_shown: # hbox: # xanchor 1.0 # pos (540, 24) # spacing 5 # add "interface/page.webp" yanchor 0.5 ypos 53 # text str(current_page+1)+"/"+str(int(math.ceil(menu_items_length/items_shown))) ypos 44 size 16 # vbox: # pos (570, 186) # spacing 10 # imagebutton: # idle gui.format("interface/frames/{}/arrow_up.webp") # if not current_page <= 0: # hover image_hover(gui.format("interface/frames/{}/arrow_up.webp")) # action Return("dec") # imagebutton: # idle Transform(gui.format("interface/frames/{}/arrow_up.webp"), yzoom=-1) # if current_page < math.ceil((menu_items_length-1)/items_shown)-1: # hover Transform(image_hover(gui.format("interface/frames/{}/arrow_up.webp")), yzoom=-1) # action Return("inc") # # Add items # grid 9 4: # style "empty" # pos (24, 113) # spacing 10 # for it_item in menu_items[current_page*items_shown:(current_page+1)*items_shown]: # frame: # style "empty" # xsize 48 # ysize 48 # add gui.format("interface/achievements/{}/iconbox.webp") # if current_item is not None and current_item.id == it_item.id: # add "interface/achievements/glow.webp" align (0.5, 0.5) zoom 0.105 alpha 0.7 at rotate_circular # add crop_image_zoom(it_item.get_image(), 42, 42, it_item.owned <= 0) align (0.5, 0.5) # button: # style gui.theme("overlay_button") # background "interface/achievements/glass_iconbox.webp" # xsize 46 ysize 46 # action Return(["select", it_item]) # tooltip it_item.name # if it_item.limit > 1 and it_item.owned > 0: # if it_item.infinite: # text "{unicode}∞{/unicode}" size 20 align (0.1, 0.1) offset(-1, -9) color "#FFFFFF" outlines [ (1, "#000", 0, 0) ] # else: # text str(it_item.owned) size 10 align (0.1, 0.1) color "#FFFFFF" outlines [ (1, "#000", 0, 0) ] # elif current_category == "Decorations": # if it_item.in_use: # add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-3, -3) zoom 0.5 # elif current_category in ("Books", "Quest Items"): # if it_item.used: # add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-3, -3) zoom 0.5 # if inventory_mode == 1 and (not it_item.givable or not states.active_girl in it_item.usable_on): # add "#b2000040" # if menu_items_length <= 0: # text "Nothing here yet" align (0.5, 0.5) size 24 # if current_item: # frame: # style "empty" # xsize 96 # ysize 96 # pos (24, 375) # add gui.format("interface/achievements/{}/icon_selected.webp") # add crop_image_zoom(current_item.get_image(), 84, 84, current_item.owned <= 0) align (0.5, 0.5) # add "interface/achievements/glass_selected.webp" pos (6, 6) # if current_category in {"Gifts", "Ingredients", "Potions"}: # if current_item.owned > 0: # if current_item.infinite: # text "{unicode}∞{/unicode}" size 30 align (0.1, 0.1) offset(-2, -10) color "#FFFFFF" outlines [ (1, "#000", 0, 0) ] # else: # text "[current_item.owned]" size 14 align (0.1, 0.1) color "#FFFFFF" outlines [ (1, "#000", 0, 0) ] # elif current_category == "Decorations": # if current_item.in_use: # add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-6, -6) # elif current_category in ("Books", "Quest Items"): # if current_item.used: # add "interface/topbar/icon_check.webp" align (1.0, 1.0) offset (-6, -6) # if inventory_mode == 1 and (not current_item.givable or not states.active_girl in current_item.usable_on): # add "#b2000040" # add gui.format("interface/achievements/{}/highlight.webp") pos (112, 375) # add gui.format("interface/achievements/{}/spacer.webp") pos (120, 398) # hbox: # spacing 5 # xalign 0.5 # text current_item.name ypos 380 size 16 xoffset 45 # $ frame = Frame(gui.format("interface/frames/{}/iconframe.webp"), 6, 6) # if (inventory_mode == 0 and current_item.usable) or (inventory_mode == 1 and current_item.givable): # textbutton "[current_item.caption]": # style "inventory_button" # background frame # xalign 0.89 # xoffset 45 # ypos 374 # sensitive (current_item.owned > 0) # if inventory_mode == 0: # action Return("use") # elif inventory_mode == 1: # action Return("give") # hbox: # pos (132, 407) # xsize 410 # text current_item.desc size 12 # style inventory_button: # xysize (90, 26) # hover_foreground "#ffffff1F" # style inventory_button_text: # outlines [] # align (0.5, 0.5) # size 16