WTS/game/scripts/interface/menus.rpy
2022-05-17 00:48:22 +01:00

243 lines
8.4 KiB
Plaintext

# Maps title + toggle names to menu state (current page and toggles)
default menu_states = {}
init python:
def store_menu_states(menu_id, scope):
menu_states[menu_id] = scope
#List Menu #Customizable
screen list_menu(menu_id, title, toggle_names=tuple(), menu_groups=[]):
zorder 5
use close_button_background
use close_button
# Store screen variables while hidden
default old_scope = menu_states.get(menu_id, None)
on ("hide","replaced") action Function(store_menu_states, menu_id, _scope)
default current_page = 0 if old_scope is None else old_scope["current_page"]
default toggles = set([i for i in xrange(0,max(len(toggle_names), len(menu_groups)))]) if old_scope is None else old_scope["toggles"]
# Menu items from enabled groups
default menu_items = []
$ menu_items = list(itertools.chain.from_iterable([menu_groups[i] for i in sorted(toggles) if i < len(menu_groups)]))
default items_shown = 4
default max_page = 0
$ max_page = max(0, (len(menu_items)-1)/items_shown)
$ current_page = min(current_page, max_page)
# Page up
imagebutton:
xpos 825
ypos 240
idle gui.format("interface/general/{}/button_arrow_up.webp")
hover gui.format("interface/general/{}/button_arrow_up_hover.webp")
action SetScreenVariable("current_page", max(0, current_page-1))
# Page down
imagebutton:
xpos 825
ypos 292
idle gui.format("interface/general/{}/button_arrow_down.webp")
hover gui.format("interface/general/{}/button_arrow_down_hover.webp")
action SetScreenVariable("current_page", min(max_page, current_page+1))
# Main window
imagemap:
xsize 638
ysize 544
xalign 0.5
yalign 0.5
use invisible_button()
ground gui.format("interface/panels/{}/items_panel.webp")
hover gui.format("interface/panels/{}/items_panel_hover.webp")
# Header
hbox:
pos (11,30)
xysize (265,45)
text title align (0.5,0.5) size 16 bold 0.2
# Toggles
grid 2 2:
pos (319,31)
for i in xrange(0,4):
if i < len(toggle_names):
$ toggle_names[i]
if i in toggles:
$ toggle_image = gui.theme("check_true")
else:
$ toggle_image = gui.theme("check_false")
button:
style "empty"
xysize (110,22)
left_margin 5
clicked [ToggleSetMembership(toggles, i),SetScreenVariable("current_page", 0),Return(("toggle"+str(i), i in toggles))]
add toggle_image zoom 0.8
text "{size=10}" + toggle_names[i] + "{/size}" xpos 22 yalign 0.5
else:
null
# Items
$ page_offset = current_page*items_shown
for i in xrange(page_offset, page_offset+items_shown):
if i < len(menu_items):
$ item_ypos = 85+90*(i-page_offset)
if not menu_items[i].unlockable: # Unlockables are shown but aren't clickable
hotspot (16, item_ypos, 528, 87) clicked Return(menu_items[i])
use list_menu_item(menu_items[i], item_ypos)
screen list_menu_item(menu_item, ypos=0):
frame:
style "empty"
xpos 16
ypos ypos
xsize 528
ysize 87
$ item_image = menu_item.get_image()
if isinstance(item_image, im.ImageBase):
$ item_image = crop_image_zoom(item_image, 83, 83)
$ image_zoom = 1.0
else:
$ image_zoom = get_zoom(item_image, (83, 83))
fixed:
pos (6,2)
xysize (83, 83)
add item_image align (0.5, 0.5) zoom image_zoom
fixed:
pos (100, 0)
xysize (420, 24)
text menu_item.get_name() size 16 yalign 1.0
if store_menu: # Displays item's gold value
text menu_item.get_cost() size 16 text_align 1.0 align (1.0,1.0)
fixed:
pos (100, 32)
xysize (420, 50)
text menu_item.get_description() size 12
text menu_item.get_annotation() align (1.0,1.0) offset (-2,-2)
screen bottom_menu(menu_id, group_names, menu_groups, func_btn=None):
zorder 30
use close_button_background
use close_button
# Store screen variables while hidden
default old_scope = menu_states.get(menu_id, None)
on ("hide","replaced") action Function(store_menu_states, menu_id, _scope)
default current_page = 0 if old_scope is None else old_scope["current_page"]
default current_group = 0 if old_scope is None else old_scope["current_group"]
$ current_group = min(len(menu_groups)-1, current_group)
# Menu items from enabled groups
default menu_items = []
$ menu_items = menu_groups[current_group]
default items_shown = 9
default max_page = 0
$ max_page = max(0, (len(menu_items)-1)/items_shown)
$ current_page = min(current_page, max_page)
# Main window
imagemap:
xpos 0
ypos 475
xysize (1080, 548)
use invisible_button()
ground gui.format("interface/panels/{}/bottom_panel.webp")
hover gui.format("interface/panels/{}/bottom_panel_hover.webp")
# Menu name
$ title = group_names[current_group][0]
add gui.format("interface/general/{}/button_wide.webp") xpos 130 ypos 0
text title xalign 0.5 yalign 0.5 xpos 130+70 ypos 0+18 size 12
# Categories
for i in xrange(0,len(menu_groups)):
$ group_icon = group_names[i][1]
imagebutton:
xpos 300+(33*i)
ypos 0
idle gui.format("interface/topbar/buttons/{}/")+group_icon+".webp"
hover image_hover(gui.format("interface/topbar/buttons/{}/")+group_icon+".webp")
sensitive current_group != i
action [SetScreenVariable("current_group", i), SetScreenVariable("current_page", 0)]
if func_btn:
imagebutton:
xpos 300+(33*(len(menu_groups)+1))
ypos 0
idle gui.format("interface/topbar/buttons/{}/")+func_btn+".webp"
hover image_hover(gui.format("interface/topbar/buttons/{}/")+func_btn+".webp")
action Return("func")
# Items
$ page_offset = current_page*items_shown
for i in xrange(page_offset, page_offset+items_shown):
if i < len(menu_items):
$ col = i % 5
$ row = i % 1
hotspot ( 140+(90*(i-page_offset)), 34, 90, 90) clicked Return((current_group, menu_items[i]))
use icon_menu_item(menu_items[i], 140+(90*(i-page_offset)), 34 )
# Page left
imagebutton:
xpos 80
ypos 475+50
idle gui.format("interface/general/{}/button_arrow_left.webp")
hover gui.format("interface/general/{}/button_arrow_left_hover.webp")
sensitive current_page > 0
action SetScreenVariable("current_page", max(0, current_page-1))
# Page right
imagebutton:
xpos 880+80
ypos 475+50
idle gui.format("interface/general/{}/button_arrow_right.webp")
hover gui.format("interface/general/{}/button_arrow_right_hover.webp")
sensitive current_page <= max_page
action SetScreenVariable("current_page", min(max_page, current_page+1))
screen icon_menu_item(menu_item, xpos=0, ypos=0):
frame:
background None
xpos xpos
ypos ypos
xsize 90
ysize 90
$ item_image = menu_item.get_image()
if isinstance(item_image, im.ImageBase):
$ item_image = crop_image_zoom(item_image, 80, 80)
$ image_zoom = 1.0
else:
$ image_zoom = get_zoom(item_image, (80, 80))
fixed:
xsize 80
ysize 80
if menu_item.owned > 0 or menu_item.unlocked == True:
add item_image xalign 0.5 yalign 0.5 zoom image_zoom
else:
add gray_tint(item_image) xalign 0.5 yalign 0.5 zoom image_zoom
if menu_item.owned > 0:
text "{color=#ffffff}" +str(menu_item.owned)+ "{/color}"
if menu_item.active:
add "interface/topbar/icon_check.webp" align (1.0, 1.0) zoom 0.5