# # Load/save screens # # These screens are responsible for letting the player save the game and load # it again. Since they share nearly everything in common, both are implemented # in terms of a third screen, file_slots. # # https://www.renpy.org/doc/html/screen_special.html#save # https://www.renpy.org/doc/html/screen_special.html#load init offset = -1 screen save(): tag menu use file_slots(_("Save")) screen load(): tag menu use file_slots(_("Load")) screen file_slots(title): default page_name = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Auto Saves"), quick=_("Quick Saves")) default page_modifier = 0 use game_menu(title): fixed: # This ensures the input will get the enter event before any of the buttons do order_reverse True # The page name, which can be edited by clicking on a button button: style gui.theme("page_label") key_events True xalign 0.5 action page_name.Toggle() hbox: spacing 9 input: style gui.theme("page_label_text") value page_name if page_name.editable: text "{size=-4}{font=[gui.glyph_font]}✎{/font}{/size}" ## The grid of file slots. grid gui.file_slot_cols gui.file_slot_rows: style_prefix gui.theme("slot") xalign 0.5 yalign 0.5 spacing gui.slot_spacing transpose True for i in range(gui.file_slot_cols * gui.file_slot_rows): $ slot = i + 1 button: if not FileCompatible(slot) and title == "Load": action Confirm(gui.SAVE_INCOMPATIBLE_WARNING, FileAction(slot)) else: action FileAction(slot) has fixed if FileLoadable(slot): add FileScreenshot(slot) vbox: style_prefix "slot_button" xpos config.thumbnail_width xsize gui.slot_width - config.thumbnail_width - gui.slot_height yalign 0.5 if FileCompatible(slot): default slot_time_format = "{#file_time}%#d %B, %Y, %#H:%M" if renpy.windows else "{#file_time}%-d %B, %Y, %-H:%M" $ day = FileJson(slot, "day", missing="Unknown") $ playtime = FileJson(slot, "playtime", missing=0) $ minutes, seconds = divmod(int(playtime), 60) $ hours, minutes = divmod(minutes, 60) text FileTime(slot, format=slot_time_format) text "Day: {}".format(day) text "Playtime: {}H {}M {}S".format(hours, minutes, seconds) else: text "INCOMPATIBLE VERSION" color "#f00" textbutton "{font=[gui.glyph_font]}✘{/font}": style "slot_delete_button" action FileDelete(slot) key "save_delete" action FileDelete(slot) else: text "Empty Slot {}.".format(FileSlotName(slot, gui.file_slot_cols * gui.file_slot_rows)) style "slot_button_text" ## Buttons to access other pages. hbox: style_prefix gui.theme("page") align (0.5, 1.0) yoffset 8 spacing gui.page_spacing textbutton _("<") action FilePagePrevious() if config.has_autosave: textbutton _("{#auto_page}A") action FilePage("auto") keysym "K_a" if config.has_quicksave: textbutton _("{#quick_page}Q") action FilePage("quick") keysym "K_q" $ page_modifier = max(0, int(FilePageName(str(page_modifier+9), str(page_modifier+9)))-9) for page in range(1+page_modifier, 10+page_modifier): textbutton "[page]": xminimum 40 action FilePage(page) if page < 10: keysym "K_{}".format(page) textbutton _(">") action FilePageNext() key ["mousedown_4", "K_RIGHT", "repeat_K_RIGHT"] action FilePageNext() key ["mousedown_5", "K_LEFT", "repeat_K_LEFT"] action FilePagePrevious() style page_label is gui_label style page_label_text is gui_label_text: text_align 0.5 layout "subtitle" hover_color gui.hover_color style dark_page_label_text is dark_label_text: take page_label_text style light_page_label_text is light_label_text: take page_label_text style page_button is gui_button: background None padding (9, 4, 9, 4) style page_button_text is gui_button_text: size 20 xalign 0.5 style slot_button is gui_button: # background gui.muted_color xsize gui.slot_width ysize gui.slot_height+4 padding (2, 2, 2, 2) style dark_slot_button: take dark_gui_frame insensitive_background Fixed(Transform(Frame("gui/dark_frame.png", 8, 8)), "#00000040") style light_slot_button: take light_gui_frame insensitive_background Fixed(Transform(Frame("gui/light_frame.png", 8, 8)), "#00000040") style slot_button_text is gui_button_text: size 14 xalign 0.5 text_align 0.5 idle_color gui.idle_small_color selected_idle_color gui.selected_color selected_hover_color gui.hover_color style slot_delete_button is gui_button: background None idle_background None xsize gui.slot_height ysize gui.slot_height xalign 1.0 style slot_delete_button_text is slot_button_text: size 24