WTS/game/scripts/interface/inventory.rpy
Gouvernathor 6216b62ef9 Turn two actions into functions
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
2023-11-17 02:15:31 +01:00

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