Gouvernathor
6216b62ef9
technically not as correct, but works all the same and is relatively faster (but it will be replaced with better actions in the future anyway) the pickle lock, if any, for removing them in the future, becomes easier to solve
417 lines
17 KiB
Plaintext
417 lines
17 KiB
Plaintext
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 sortby == "Available":
|
|
item.sort(key=lambda x: x.owned is True, reverse=True)
|
|
elif sortby == "Unavailable":
|
|
item.sort(key=lambda x: x.owned is False)
|
|
|
|
return item
|
|
|
|
def __Sort():
|
|
# TODO: in 8.2, replace with CycleVariable("current_sorting", ("A-z", "z-A", "Available", "Unavailable"))
|
|
global current_sorting
|
|
|
|
if current_sorting == "A-z":
|
|
current_sorting = "z-A"
|
|
elif current_sorting == "z-A":
|
|
current_sorting = "Available"
|
|
elif current_sorting == "Available":
|
|
current_sorting = "Unavailable"
|
|
else:
|
|
current_sorting = "A-z"
|
|
|
|
def __Filter():
|
|
# TODO: in 8.2, replace with CycleVariable("current_filter", ("Owned", None))
|
|
# (ToggleVariable would cause selectedness problems)
|
|
global current_filter
|
|
|
|
if current_filter is None:
|
|
current_filter = "Owned"
|
|
else:
|
|
current_filter = None
|
|
|
|
class __Actuate(Action):
|
|
def __call__(self):
|
|
global menu_items
|
|
global menu_items_length
|
|
global current_page
|
|
global current_item
|
|
|
|
menu_items = inventory_sortfilter(inventory_dict[current_category], current_sorting, current_filter)
|
|
menu_items_length = len(menu_items)
|
|
|
|
if current_category == "Decorations":
|
|
menu_items.sort(key=lambda x: x.placement.id)
|
|
|
|
current_page = 0
|
|
|
|
if current_item not in menu_items:
|
|
current_item = next(iter(menu_items), None)
|
|
|
|
renpy.restart_interaction()
|
|
|
|
def __init_scope():
|
|
if inventory_mode == 0:
|
|
inventory_dict = {
|
|
"Gifts": inventory.get_instances_of_type("gift"),
|
|
"Books": inventory.get_instances_of_type("book"),
|
|
"Scrolls": inventory.get_instances_of_type("scroll"),
|
|
"Ingredients": inventory.get_instances_of_type("ingredient"),
|
|
"Potions": inventory.get_instances_of_type("potion"),
|
|
"Decorations": inventory.get_instances_of_type("decoration"),
|
|
"Quest Items": inventory.get_instances_of_type("quest"),
|
|
}
|
|
elif inventory_mode == 1:
|
|
inventory_dict = {
|
|
"Gifts": inventory.get_instances_of_type("gift"),
|
|
"Potions": inventory.get_instances_of_type("potion"),
|
|
"Quest Items": inventory.get_instances_of_type("quest"),
|
|
}
|
|
|
|
renpy.dynamic(
|
|
inventory_dict=inventory_dict,
|
|
current_page=0,
|
|
current_category="Gifts",
|
|
current_filter="Owned",
|
|
current_sorting="Available",
|
|
)
|
|
|
|
menu_items = inventory_sortfilter(inventory_dict[current_category], current_sorting, current_filter)
|
|
renpy.dynamic(
|
|
menu_items=menu_items,
|
|
menu_items_length=len(menu_items),
|
|
current_item=next(iter(menu_items), None),
|
|
)
|
|
|
|
define items_shown = 36
|
|
|
|
####################################
|
|
############# Menu #################
|
|
####################################
|
|
|
|
label inventory:
|
|
$ gui.in_context("inventory_menu")
|
|
jump main_room_menu
|
|
|
|
label .use_item(item):
|
|
python:
|
|
enable_game_menu()
|
|
item.use()
|
|
return
|
|
|
|
label .give_item(item):
|
|
if item.type == "gift":
|
|
if get_character_gifted(states.active_girl):
|
|
show screen blktone
|
|
with d3
|
|
gen "I already gave her a gift today. Don't want to spoil her too much..." ("base", xpos="far_left", ypos="head")
|
|
hide screen blktone
|
|
with d3
|
|
else:
|
|
call expression get_character_gift_label(states.active_girl) pass (item)
|
|
|
|
elif item.type == "potion":
|
|
if not states.active_girl in item.usable_on:
|
|
show screen blktone
|
|
with d3
|
|
gen "(Something tells me this potion won't work on [states.active_girl].)" ("base", xpos="far_left", ypos="head")
|
|
nar "Perhaps in the future..."
|
|
hide screen blktone
|
|
with d3
|
|
elif not game.daytime:
|
|
show screen blktone
|
|
with d3
|
|
gen "(Some grander force tells me I should give it to her during daytime only.)" ("base", xpos="far_left", ypos="head")
|
|
hide screen blktone
|
|
with d3
|
|
elif get_character_mood(states.active_girl) > 0:
|
|
show screen blktone
|
|
with d3
|
|
gen "(I don't think it's a good idea to give it to her when she's still upset with me...)" ("base", xpos="far_left", ypos="head")
|
|
gen "(I should wait for her to calm down first.)" ("base", xpos="far_left", ypos="head")
|
|
hide screen blktone
|
|
with d3
|
|
elif states.active_girl == "hermione" and not states.her.favors_convinced_stage == 2 and is_in_lead(gryffindor):
|
|
show screen blktone
|
|
with d3
|
|
|
|
gen "[name_hermione_genie], what would you say--" ("base", xpos="far_left", ypos="head")
|
|
her "I'm sorry professor but I don't need your help at the moment."
|
|
her "My house is already in the lead points wise."
|
|
gen "Figures..." ("base", xpos="far_left", ypos="head")
|
|
|
|
call tutorial("points")
|
|
|
|
hide screen blktone
|
|
with d3
|
|
else:
|
|
python:
|
|
enable_game_menu()
|
|
inventory_mode = 0
|
|
item.give(states.active_girl)
|
|
|
|
elif item.type == "quest":
|
|
if not states.active_girl in item.usable_on:
|
|
show screen blktone
|
|
with d3
|
|
gen "(Something tells me I cannot give this item to [states.active_girl].)" ("base", xpos="far_left", ypos="head")
|
|
nar "Perhaps in the future..."
|
|
hide screen blktone
|
|
with d3
|
|
#TODO Add daytime check for buttplug give item event
|
|
#show screen blktone
|
|
#with d3
|
|
#gen "(Some grander force tells me I should give it to her during daytime only.)" ("base", xpos="far_left", ypos="head")
|
|
#hide screen blktone
|
|
#with d3
|
|
elif get_character_mood(states.active_girl) > 0:
|
|
show screen blktone
|
|
with d3
|
|
gen "(I don't think it's a good idea to give it to her when she's still upset with me...)" ("base", xpos="far_left", ypos="head")
|
|
gen "(I should wait for her to calm down first.)" ("base", xpos="far_left", ypos="head")
|
|
hide screen blktone
|
|
with d3
|
|
elif states.active_girl == "hermione" and not states.her.favors_convinced_stage == 2 and is_in_lead(gryffindor):
|
|
show screen blktone
|
|
with d3
|
|
|
|
gen "[name_hermione_genie], I have something for you--" ("base", xpos="far_left", ypos="head")
|
|
her "I'm sorry professor but I don't need your help at the moment."
|
|
her "My house is already in the lead points wise."
|
|
gen "Figures..." ("base", xpos="far_left", ypos="head")
|
|
|
|
call tutorial("points")
|
|
|
|
hide screen blktone
|
|
with d3
|
|
else:
|
|
python:
|
|
enable_game_menu()
|
|
inventory_mode = 0
|
|
item.give(states.active_girl)
|
|
|
|
return
|
|
|
|
label inventory_menu(xx=150, yy=90, inventory_mode=0): # 0 - Inventory, 1 - gifts
|
|
# Inventory dictionary
|
|
|
|
$ __init_scope()
|
|
|
|
call screen inventory(xx, yy)
|
|
|
|
return
|
|
|
|
screen inventory(xx, yy):
|
|
tag inventory
|
|
zorder 15
|
|
modal True
|
|
|
|
add "gui_fade"
|
|
|
|
if renpy.mobile:
|
|
use close_button_background
|
|
use close_button(key=["inventory", "game_menu"])
|
|
|
|
fixed:
|
|
if settings.get("animations"):
|
|
at gui_animation
|
|
use inventory_menu(xx, yy)
|
|
use inventory_menuitem(xx, yy)
|
|
|
|
screen inventory_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:
|
|
pos (6, 41)
|
|
for category in inventory_dict:
|
|
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 [SetVariable("current_category", category), __Actuate()]
|
|
add gui.format("interface/achievements/{}/spacer_left.webp")
|
|
|
|
# Gold & Tokens
|
|
null height 16
|
|
text "{color=#daa520}Gold{/color} {outlinecolor=#ffffff00}[game.gold]{/outlinecolor}" size 12 outlines [ (2, "#000", 0, 0) ] xalign 0.1 xanchor 0
|
|
add gui.format("interface/achievements/{}/spacer_left.webp")
|
|
text "{color=#2055da}Tokens{/color} {outlinecolor=#ffffff00}[tokens]{/outlinecolor}" size 12 outlines [ (2, "#000", 0, 0) ] xalign 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 [__Filter, __Actuate()]
|
|
else:
|
|
textbutton "Show: [current_filter]" action [__Filter, __Actuate()]
|
|
textbutton "Sort by: [current_sorting]" action [__Sort, __Actuate()]
|
|
|
|
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 current_page > 0:
|
|
hover image_hover(gui.format("interface/frames/{}/arrow_up.webp"))
|
|
action SetVariable("current_page", current_page-1)
|
|
# TODO: in 8.2, replace with IncrementVariable("current_page", -1)
|
|
|
|
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 SetVariable("current_page", current_page+1)
|
|
# TODO: in 8.2, replace with IncrementVariable("current_page")
|
|
|
|
# Add items
|
|
grid 9 4:
|
|
style "empty"
|
|
pos (24, 113)
|
|
|
|
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 SetVariable("current_item", 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 "[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" anchor (1.0, 1.0) 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" anchor (1.0, 1.0) 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) anchor (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" anchor (1.0, 1.0) 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" anchor (1.0, 1.0) 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
|
|
|
|
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(gui.format("interface/frames/{}/iconframe.webp"), 6, 6)
|
|
xalign 0.89
|
|
xoffset 45
|
|
ypos 374
|
|
sensitive (current_item.owned > 0)
|
|
if inventory_mode == 0:
|
|
action Call("inventory.use_item", current_item, from_current=True)
|
|
elif inventory_mode == 1:
|
|
action Call("inventory.use_item", current_item, from_current=True)
|
|
|
|
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
|