193 lines
6.5 KiB
Plaintext
Raw Normal View History

2025-02-06 03:02:50 +00:00
# Functions (Initialised after item_store)
init 5 python in item_store:
import functools
get_icon = renpy.store.wardrobe.get_icon # Simple Proxy since both interfaces share the same code
def buy():
scope = renpy.get_screen("item_store_interface").scope
selected_item = scope["selected_item"]
renpy.call_in_new_context("purchase_item", selected_item)
section = scope["selected_section"]
_items = items(section)
# Avoid switching selection when not necessary
if selected_item.owned >= selected_item.limit or selected_item not in _items:
scope["selected_item"] = next(_items, None)
renpy.restart_interaction()
def select_item(item):
scope = renpy.get_screen("item_store_interface").scope
scope["selected_item"] = item
renpy.restart_interaction()
def change_section(section):
scope = renpy.get_screen("item_store_interface").scope
scope["selected_section"] = section
scope["selected_item"] = next(items(section), None)
def exit():
scope = renpy.get_screen("item_store_interface").scope
renpy.play("sounds/curtain_close.ogg")
# Handle exit animation
scope["navigation_last_frame_atl"] = renpy.store.navigation_last_frame_hide
scope["navigation_atl"] = renpy.store.wardrobe_hide
scope["information_atl"] = renpy.store.wardrobe_fade_hide
scope["character_atl"] = renpy.store.wardrobe_character_hide
scope["navigation_exit"] = True
# Reset states
renpy.restart_interaction()
def items(section):
# Sort the items by price in ascending order, then alphabetically by name if prices are the same
sorted_items = sorted(
(x for x in reversed(renpy.store.inventory.get_instances_of_type(section))
if x.unlocked and x.price > 0 and x.owned < x.limit),
key=lambda item: (item.price, renpy.store.natsort_key(item.name))
)
return iter(sorted_items)
# Context
label item_store_interface(inter_pause=True):
$ disable_game_menu()
play sound "sounds/curtain_open.ogg"
if inter_pause:
# Ensures all irrelevant screens are hidden before capturing the surface tree
with Pause(0.2)
call screen item_store_interface
$ enable_game_menu()
jump item_store.exit
# Interface
screen item_store_interface():
layer "interface"
zorder 0
style_prefix "store"
default navigation_atl = wardrobe_show
default information_atl = wardrobe_fade_show
default last_frame = (screenshot.capture() or screenshot.image)
default navigation_last_frame_atl = navigation_last_frame_show
default navigation_exit = False
default selected_section = "gift"
default selected_item = next(item_store.items(selected_section), None)
default cart = set()
add last_frame at navigation_last_frame_atl
add "gui_fade_both" at gui_fade
if navigation_exit:
timer 0.4 action Return()
if selected_item:
$ total_price = selected_item.price if selected_item else 0
if selected_item.currency == "tokens":
$ currency_prefix = _("T")
$ currency = states.env.tokens
$ total_gold = states.env.tokens-total_price
$ can_afford = states.env.tokens >= total_price
else:
$ currency_prefix = _("G")
$ currency = states.env.gold
$ total_gold = states.env.gold-total_price
$ can_afford = states.env.gold >= total_price
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
add crop_image_zoom(selected_item.get_image(), 256, 256, False) align (0.5, 0.5) xoffset 270
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
frame:
style "empty"
at information_atl
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
add "gui_fade_bottom"
vbox:
xpos 550
yoffset -10
yalign 1.0
xsize 350
hbox:
align (0.0, 1.0)
label selected_item.name
if selected_item.owned > 0:
text "{size=-4}x{/size}[selected_item.owned]"
add "frame_spacer" xsize 350
text selected_item.desc align (0.0, 1.0)
vbox:
pos (972, 468)
2022-05-17 00:48:22 +01:00
vbox:
2025-02-06 03:02:50 +00:00
xoffset -36
text _("[currency][currency_prefix]") xalign 1.0
text _("-[total_price][currency_prefix]") xalign 1.0
add "frame_spacer" xsize 100
if total_gold >= 0:
text "[total_gold][currency_prefix]" color "#0ead00" xalign 1.0
else:
text "[total_gold][currency_prefix]" color "#ad0000" xalign 1.0
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
label "[currency_prefix]" + str(selected_item.price) xoffset -50 style "store_pricetag_label"
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
frame:
style "empty"
at navigation_atl
vbox:
style_prefix "navigation_tabs"
pos (540, 300)
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
at navigation_tabs_show
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
textbutton _("Buy") action item_store.buy sensitive (can_afford and (selected_item != None)) at navigation_tabs
null height 35
textbutton _("Exit") action item_store.exit keysym "K_ESCAPE" at navigation_tabs
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
frame:
at navigation_atl
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
vbox:
# Sections
2022-05-17 00:48:22 +01:00
hbox:
2025-02-06 03:02:50 +00:00
spacing 0
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
for i in inventory.get_types():
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
button:
xysize (64, 64)
add item_store.get_icon(i) xysize (64, 64)
tooltip i
action Function(item_store.change_section, i) selected (selected_section == i)
null height 3
add "frame_spacer" xsize 500 xalign 0.5
null height 3
if not selected_item:
text _("SOLD OUT!") size 96 at transform:
align (0.5, 0.5)
rotate -45
# Item List
vpgrid:
cols 5
spacing 4
mousewheel True
scrollbars "vertical"
for item in item_store.items(selected_section):
button:
xysize (96, 96)
style "inventory_item_big_button"
add crop_image_zoom(item.get_image(), 96, 96, False) align (0.5, 0.5)
label "[currency_prefix][item.price]" style "store_pricetag_label_small"
2022-05-17 00:48:22 +01:00
2025-02-06 03:02:50 +00:00
action Function(item_store.select_item, item)
selected (selected_item == item)