###Updater Python stuff### init python: if renpy.variant("pc"): #Don't run this on mobile, not supported if persistent.updateresult is None: persistent.updateresult = "No new version is available" if persistent.autoup is None: persistent.autoup = False if persistent.updateWebServer is None: persistent.updateWebServer = "http://updates.snootgame.xyz/updates.json" def UpdateCheck(): # WHY YES I ONLY ALLOW PEOPLE USING MY FRAMEWORK TO CHECK FOR AN UPDATE EVERY SIX FUCKING HOURS HOW DID YOU KNOW # NOPE check_interval=5 (5 SECONDS) FUCK YOU pendingVersion = updater.UpdateVersion(persistent.updateWebServer, check_interval=5) if pendingVersion == None or pendingVersion == config.version or "TEST" in pendingVersion: persistent.updateresult = "No new version is available" else: persistent.updateresult = pendingVersion #idk non-functional dummies for uisounds hackery #coming soon def onclick_audio(flag, _audioflag=False): audio_filename=["audio/ui/uiOptionOn.wav", "audio/ui/uiOptionOff.wav"] if _audioflag: audio_filename=["audio/ui/uiOptionOff.wav", "audio/ui/uiOptionOn.wav"] renpy.play(audio_filename[int(bool(flag))]) def ToggleAutoUpdate(): onclick_audio(persistent.autoup) persistent.autoup = not persistent.autoup def ToggleAutoForwardMove(): onclick_audio(persistent.afm_enable) preferences.afm_enable = not preferences.afm_enable # def ToggleMuteAll(): # if preferences.all_mute == True: # renpy.play("audio/ui/uiOptionOff.wav") # else: # renpy.play("audio/ui/uiOptionOn.wav") # preferences.all_mute = not preferences.all_mute ################################################################################ ## Initialization ################################################################################ init offset = -1 ################################################################################ ## Styles ################################################################################ style default: properties gui.text_properties() language gui.language style input: properties gui.text_properties("input", accent=True) adjust_spacing False style hyperlink_text: properties gui.text_properties("hyperlink", accent=True) hover_underline True style gui_text: properties gui.text_properties("interface") style button: properties gui.button_properties("button") style button_text is gui_text: properties gui.text_properties("button") yalign 0.5 style label_text is gui_text: properties gui.text_properties("label", accent=True) style prompt_text is gui_text: properties gui.text_properties("prompt") style bar: ysize gui.bar_size left_bar Frame("gui/bar/left.png", gui.bar_borders, tile=gui.bar_tile) right_bar Frame("gui/bar/right.png", gui.bar_borders, tile=gui.bar_tile) style vbar: xsize gui.bar_size top_bar Frame("gui/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) bottom_bar Frame("gui/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) style scrollbar: ysize gui.scrollbar_size base_bar Frame("gui/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) thumb Frame("gui/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) style vscrollbar: xsize gui.scrollbar_size base_bar Frame("gui/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) thumb Frame("gui/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) style slider: ysize gui.slider_size base_bar Frame("gui/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) thumb "gui/slider/horizontal_[prefix_]thumb.png" style vslider: xsize gui.slider_size base_bar Frame("gui/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) thumb "gui/slider/vertical_[prefix_]thumb.png" style frame: padding gui.frame_borders.padding background Frame("gui/frame.png", gui.frame_borders, tile=gui.frame_tile) ################################################################################ ## In-game screens ################################################################################ ## Say screen ################################################################## ## ## The say screen is used to display dialogue to the player. It takes two ## parameters, who and what, which are the name of the speaking character and ## the text to be displayed, respectively. (The who parameter can be None if no ## name is given.) ## ## This screen must create a text displayable with id "what", as Ren'Py uses ## this to manage text display. It can also create displayables with id "who" ## and id "window" to apply style properties. ## ## https://www.renpy.org/doc/html/screen_special.html#say screen say(who, what): style_prefix "say" window: id "window" if who is not None: background Image("gui/textbox_long.png", xalign=0.5, yalign=1.0) window: id "namebox" style "namebox" text who id "who" else: background Image("gui/textbox_no_hitch.png", xalign=0.5, yalign=1.0) text what id "what" ## If there's a side image, display it above the text. Do not display on the ## phone variant - there's no room. if not renpy.variant("small"): add SideImage() xalign 0.0 yalign 1.0 ## Make the namebox available for styling through the Character object. init python: config.character_id_prefixes.append('namebox') style window is default style say_label is default style say_dialogue is default style say_thought is say_dialogue style namebox is default style namebox_label is say_label style window: xalign 0.5 xfill True yalign gui.textbox_yalign ysize gui.textbox_height xoffset 0 yoffset gui.window_yoffset xcenter 0.5 style namebox: xalign 0.5 xpos gui.name_xpos ypos gui.name_ypos style say_label: properties gui.text_properties("name", accent=True) xalign gui.name_xalign yalign 0.5 xanchor gui.name_xalign style say_dialogue: properties gui.text_properties("dialogue") xpos gui.dialogue_xpos xsize gui.dialogue_width ypos gui.dialogue_ypos ## Input screen ################################################################ ## ## This screen is used to display renpy.input. The prompt parameter is used to ## pass a text prompt in. ## ## This screen must create an input displayable with id "input" to accept the ## various input parameters. ## ## https://www.renpy.org/doc/html/screen_special.html#input screen input(prompt): style_prefix "input" window: add Image("gui/textbox_no_hitch.png", xalign=0.5, yalign=1.0, yoffset=gui.input_yoffset) #for mobile OSK vbox: xalign gui.dialogue_text_xalign xpos gui.dialogue_xpos xsize gui.dialogue_width ypos gui.dialogue_ypos yoffset gui.input_yoffset #for mobile OSK text prompt style "input_prompt" input id "input" style input_prompt is default style input_prompt: xalign gui.dialogue_text_xalign properties gui.text_properties("input_prompt") style input: xalign gui.dialogue_text_xalign xmaximum gui.dialogue_width ## Choice screen ############################################################### ## ## This screen is used to display the in-game choices presented by the menu ## statement. The one parameter, items, is a list of objects, each with caption ## and action fields. ## ## https://www.renpy.org/doc/html/screen_special.html#choice screen choice(items): style_prefix "choice" vbox: for i in items: textbutton i.caption action i.action ## When this is true, menu captions will be spoken by the narrator. When false, ## menu captions will be displayed as empty buttons. define config.narrator_menu = True style choice_vbox is vbox style choice_button is button style choice_button_text is button_text style choice_vbox: xalign 0.5 ypos 405 yanchor 0.5 spacing gui.choice_spacing style choice_button is default: properties gui.button_properties("choice_button") activate_sound "audio/ui/uiRollover.wav" style choice_button_text is default: properties gui.button_text_properties("choice_button") ## Quick Menu screen ########################################################### ## ## The quick menu is displayed in-game to provide easy access to the out-of-game ## menus. screen quick_button(filename, label, function): button: xsize 71 ysize 71 action function if 'Return' in label or 'Back' in label or 'Menu' in label: activate_sound "audio/ui/uiBack.wav" else: activate_sound "audio/ui/uiClick.wav" fixed: add filename xalign 0.5 yalign 0.5 zoom 1 text label xalign 0.5 yalign 0.5 xanchor 0.5 size 22 style "quick_button_text" # label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ] # Reuse the same image string and keep things 'neat'. screen quick_buttons(filename, label_functions): for l_f in label_functions: use quick_button(filename, l_f[0], l_f[1]) screen quick_menu(): ## Ensure this appears on top of other screens. zorder 100 if quick_menu: window: xpos 1.45 ypos 0.977 vbox: style_prefix "quick" spacing 1 use quick_buttons("gui/button/uioptionbuttons/template_idle.png", [ [ "Skip", Skip() ], [ "Save", ShowMenu('save') ], [ "Auto", Preference("auto-forward", "toggle") ], [ "Load", ShowMenu('load') ] ] ) screen score_menu(): zorder 100 window: background "gui/debug.webp" xalign -1.0 yalign 0.0 grid 1 3: style_prefix "score" xalign 0.0 yalign 0.0 text "anons: " + str(anonscore) text "fang: " + str(fangscore) text "DEBUG SCORE CARD" ## This code ensures that the quick_menu screen is displayed in-game, whenever ## the player has not explicitly hidden the interface. init python: config.overlay_screens.append("quick_menu") default quick_menu = True style quick_button is default style quick_button_text is button_text style quick_button: properties gui.button_properties("quick_button") style quick_button_text: #properties gui.button_text_properties("quick_button") color gui.selected_color hover_color gui.hover_color selected_color gui.accent_color ################################################################################ ## Main and Game Menu Screens ################################################################################ ## Navigation screen ########################################################## ## ## This screen is included in the main and game menus, and provides navigation ## to other menus, and to start the game. screen navigation(): vbox: style_prefix "navigation" xpos gui.notMM_navigation_xpos yalign 0.5 spacing gui.navigation_spacing textbutton _("History") activate_sound "audio/ui/uiClick.wav" action ShowMenu("history") textbutton _("Save") activate_sound "audio/ui/uiClick.wav" action ShowMenu("save") textbutton _("Load") activate_sound "audio/ui/uiClick.wav" action ShowMenu("load") textbutton _("Delete") activate_sound "audio/ui/uiClick.wav" action ShowMenu("delete") textbutton _("Options") activate_sound "audio/ui/uiClick.wav" action ShowMenu("preferences") #textbutton _("Extras") action ShowMenu("extras") textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action Return() if _in_replay: textbutton _("End Replay") activate_sound "audio/ui/uiBack.wav" action EndReplay(confirm=True) elif not main_menu: textbutton _("Main Menu") activate_sound "audio/ui/uiBack.wav" action MainMenu() #textbutton _("Debug Score Card") action ShowMenu("score_menu") #if renpy.variant("pc"): ## The quit button is banned on iOS and unnecessary on Android and ## Web. #textbutton _("Quit") action Quit() style navigation_button is gui_button style navigation_button_text is gui_button_text style navigation_button: size_group "navigation" properties gui.button_properties("navigation_button") style navigation_button_text: properties gui.button_text_properties("navigation_button") ## Main Menu screen ############################################################ ## ## Used to display the main menu when Ren'Py starts. ## ## https://www.renpy.org/doc/html/screen_special.html#main-menu #similar to quick_button funcs screen main_menu_button(filename, label, function): button: xmaximum 500 ymaximum 129 action function if 'Back' in label or 'Return' in label or 'Quit' in label or 'Main Menu' in label: activate_sound "audio/ui/uiBack.wav" else: activate_sound "audio/ui/uiClick.wav" fixed: add filename xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5 text label xalign 0.5 yalign 0.5 xanchor 0.5 image bonus_flash: "gui/button/menubuttons/template_idle.png" matrixcolor TintMatrix(Color((5*255, 5*255, 5*255))) easeout_cubic 0.30 matrixcolor TintMatrix(Color((255, 255, 255))) pause 0.133 repeat 4 image template_black_m = Composite( (511, 129), (6, 5), Crop((0, 0, 511-12, 129-12), Solid("#000000", width=2, height=2)), (0, 0), "gui/button/menubuttons/template_idle.png", (0, 0), "gui/button/menubuttons/template_idle.png" ) image template_black: "template_black_m" matrixcolor TintMatrix(Color((0, 0, 0))) alpha 0.8 screen bonus_chapter_button(f="gui/button/menubuttons/template_idle.png"): #("gui/button/menubuttons/template_idle.png", "Bonus Chapters", ShowMenu("ex_ch_menu")) button: xmaximum 500 ymaximum 129 action ShowMenu("ex_ch_menu") activate_sound "audio/ui/uiClick.wav" fixed: if persistent.old_endings != persistent.endings: add "bonus_flash" xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5 $ persistent.old_endings = persistent.endings else: add f xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5 text _("Bonus Chapters") xalign 0.5 yalign 0.5 xanchor 0.5 # label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ] # Reuse the same image string and keep things 'neat'. screen main_menu_buttons(filename, label_functions): for l_f in label_functions: use main_menu_button(filename, l_f[0], l_f[1]) transform bonus_notif: #text_align 0.5 pause 6.00 easeout_cubic 0.65 alpha 0 screen main_menu(): ## This ensures that any other menu screen is replaced. tag menu if renpy.seen_image("big ending"): style_prefix "main_menu_ex" add "big ending" else: style_prefix "main_menu" add gui.main_menu_background ## This empty frame darkens the main menu. frame: pass if persistent.old_endings != persistent.endings: fixed: xalign 0.125 yalign 0.5 xsize 1920/2 ysize 1080/4 add Solid(gui.accent_color) at bonus_notif if persistent.endings == 0b1111: text _("You have unlocked all bonus chapters!") style "main_menu_text" yalign 0.5 else: text _("You have unlocked new bonus chapters, complete unseen endings to see more!") style "main_menu_text" yalign 0.5 ## The use statement includes another screen inside this one. The actual ## contents of the main menu are in the navigation screen. vbox: xpos 1940 yalign 0.03 if persistent.splashtype == 1: add "gui/sneedgame.png" else: add "gui/snootgame.png" vbox: spacing 10 xpos 1885 ypos 1130 if renpy.seen_image('big ending'): use main_menu_button("template_black", _("Start"), Start()) use bonus_chapter_button("template_black") use main_menu_buttons("template_black", [ [ "Load", ShowMenu("load") ], [ "Options", ShowMenu("preferences") ], [ "Extras", ShowMenu("extras") ], \ [ _("Quit"), Quit(confirm=not main_menu) ] ] ) else: use main_menu_button("gui/button/menubuttons/template_idle.png", _("Start"), Start()) use bonus_chapter_button() use main_menu_buttons("gui/button/menubuttons/template_idle.png", [ [ "Load", ShowMenu("load") ], [ "Options", ShowMenu("preferences") ], [ "Extras", ShowMenu("extras") ], \ [ _("Quit"), Quit(confirm=not main_menu) ] ] ) on "show" action renpy.start_predict_screen("cg_gallery") style main_menu_frame is empty style main_menu_vbox is vbox style main_menu_text is gui_text style main_menu_title is main_menu_text style main_menu_version is main_menu_text style main_menu_frame: xsize 420 yfill True background "gui/overlay/main_menu.png" style main_menu_vbox: xalign 1.0 xoffset -30 xmaximum 1200 yalign 1.0 yoffset -60 style main_menu_text: properties gui.text_properties("main_menu") #, accent=True) color gui.main_menu_color hover_color gui.hover_color size gui.main_menu_text_size style main_menu_title: properties gui.text_properties("title") style main_menu_ex is main_menu style main_menu_ex_vbox is main_menu_vbox style main_menu_ex_text is main_menu_text style main_menu_ex_frame is main_menu_frame #style main_menu_ex_button: #color "#222" #background "gui/button/menubuttons/template_idle.png" #xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5 #style main_menu_ex_button: #color "#222" #style main_menu_version: # properties gui.text_properties("version") # style ## Game Menu screen ############################################################ ## ## This lays out the basic common structure of a game menu screen. It's called ## with the screen title, and displays the background, title, and navigation. ## ## The scroll parameter can be None, or one of "viewport" or "vpgrid". When ## this screen is intended to be used with one or more children, which are ## transcluded (placed) inside it. screen game_menu(title, scroll=None, yinitial=0.0): style_prefix "game_menu" if main_menu: add gui.main_menu_background else: add gui.game_menu_background frame: style "game_menu_outer_frame" hbox: ## Reserve space for the navigation section. frame: style "game_menu_navigation_frame" frame: style "game_menu_content_frame" if scroll == "viewport": viewport: yinitial yinitial scrollbars "vertical" mousewheel True draggable True pagekeys True side_yfill True vbox: transclude elif scroll == "vpgrid": vpgrid: cols 1 yinitial yinitial scrollbars "vertical" mousewheel True draggable True pagekeys True side_yfill True transclude else: transclude use navigation label title if main_menu: key "game_menu" action ShowMenu("main_menu") style game_menu_outer_frame is empty style game_menu_navigation_frame is empty style game_menu_content_frame is empty style game_menu_viewport is gui_viewport style game_menu_side is gui_side style game_menu_scrollbar is gui_vscrollbar style game_menu_label is gui_label style game_menu_label_text is gui_label_text style return_button is navigation_button style return_button_text is navigation_button_text style game_menu_outer_frame: bottom_padding 45 top_padding 180 background "gui/overlay/game_menu.png" style game_menu_navigation_frame: xsize 420 yfill True style game_menu_content_frame: left_margin 60 right_margin 30 top_margin 15 style game_menu_viewport: xsize 1380 style game_menu_vscrollbar: unscrollable gui.unscrollable style game_menu_side: spacing 15 style game_menu_label: xpos 75 ysize 180 style game_menu_label_text: size gui.title_text_size color gui.accent_color yalign 0.5 style return_button: xpos gui.navigation_xpos yalign 1.0 yoffset -45 ## About screen ################################################################ ## ## This screen gives credit and copyright information about the game and Ren'Py. ## ## There's nothing special about this screen, and hence it also serves as an ## example of how to make a custom screen. screen about(): tag menu style_prefix "main_menu" add gui.main_menu_background add gui.extras_submenu_panel ## This empty frame darkens the main menu. frame: pass ## The use statement includes another screen inside this one. The actual ## contents of the main menu are in the navigation screen. vbox: yalign 0.00 yoffset 100 xoffset 80 xmaximum 1100 label "[config.name!t]" text _("Version [config.version!t]\n") ## gui.about is usually set in options.rpy. if gui.about: text "[gui.about!t]\n" style_prefix "quick" text _("{size=30}Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]\nTo find more information about the game (and its source code) please visit {a=https://www.snootgame.xyz/}our website{/a}.{/size}") text_align 0 use extrasnavigation ## Updates screen ################################################################ ## ## This screen houses the updates option using the built-in updates capabilities of Ren'Py. ## screen updates(): tag menu style_prefix "main_menu" add gui.main_menu_background add gui.extras_submenu_panel ## This empty frame darkens the main menu. frame: pass ## The use statement includes another screen inside this one. The actual ## contents of the main menu are in the navigation screen. vbox: yalign 0.00 yoffset 100 xoffset 80 xmaximum 1100 label "[config.name!t]" text _("Version [config.version!t]") if updater.can_update(): label _("{color=#00FF00}{size=32}Update directory exists, updating is possible!\n{/size}{/color}") else: label _("{color=#FF0000}{size=32}Update directory does not exist or is corrupt!\n{/size}{/color}") label _("Auto Update:") label _("{color=#FFFFFF}{size=32}Automatic Updates: [persistent.autoup!t]{/size}{/color}") textbutton _("{size=36}Toggle Automatic Updates\n{/size}") action [Notify("Toggling Automatic Updates..."), Function(ToggleAutoUpdate)] label _("Update Checker:") label _("{color=#FFFFFF}{size=32}[persistent.updateresult!t]{/size}{/color}") textbutton _("{size=36}Check for Update\n{/size}") activate_sound "audio/ui/uiClick.wav" action [Notify("Checking for update..."), Function(UpdateCheck)] label _("Updater:") label _("{color=#FFFFFF}{size=32}Server URL (click to edit):{/size}{/color}") default input_on = False button: key_events True if input_on: input: default "[persistent.updateWebServer!t]" size 36 color '#FFFFFF' value FieldInputValue(persistent, 'updateWebServer') length 49 copypaste True else: text persistent.updateWebServer size 36 color '#FFFF00' action ToggleScreenVariable('input_on') style_prefix "quick" if persistent.updateresult != "No new version is available": textbutton _("{size=36}Update Now!\n{/size}") activate_sound "audio/ui/uiNotification.wav" action [updater.Update(persistent.updateWebServer, force=False)] else: textbutton _("{size=36}Update Now!\n{/size}") activate_sound "audio/ui/uiFail.wav" action [Notify("Nothing to update to!")] use extrasnavigation ## Load and 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 screen save(): tag menu use file_slots(_("Save")) screen load(): tag menu use file_slots(_("Load")) screen delete(): tag menu use file_slots(_("Delete"), True) screen file_slots(title, flag=False): default page_name_value = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Automatic saves"), quick=_("Quick saves")) 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 button: style "page_label" key_events True xalign 0.5 #action page_name_value.Toggle() input: style "page_label_text" value page_name_value ## The grid of file slots. grid gui.file_slot_cols gui.file_slot_rows: style_prefix "slot" xalign 0.5 yalign 0.5 spacing gui.slot_spacing for i in range(gui.file_slot_cols * gui.file_slot_rows): $ slot = i + 1 button: if flag: action FileDelete(slot) else: action FileAction(slot) has vbox add FileScreenshot(slot) xalign 0.5 text FileTime(slot, format=_("{#file_time}%A, %B %d %Y, %H:%M"), empty=_("Empty Slot")): style "slot_time_text" text FileSaveName(slot): style "slot_name_text" key "save_delete" action FileDelete(slot) ## Buttons to access other pages. hbox: style_prefix "page" xalign 0.5 yalign 1.0 spacing gui.page_spacing textbutton _("<") activate_sound "audio/ui/uiRollover.wav" action FilePagePrevious() if config.has_autosave: textbutton _("{#auto_page}A") activate_sound "audio/ui/uiClick.wav" action FilePage("auto") if config.has_quicksave: textbutton _("{#quick_page}Q") activate_sound "audio/ui/uiClick.wav" action FilePage("quick") ## range(1, 10) gives the numbers from 1 to 9. for page in range(1, 10): textbutton "[page]" activate_sound "audio/ui/uiClick.wav" action FilePage(page) textbutton _(">") activate_sound "audio/ui/uiRollover.wav" action FilePageNext(max=9) style page_label is gui_label style page_label_text is gui_label_text style page_button is gui_button style page_button_text is gui_button_text style slot_button is gui_button style slot_button_text is gui_button_text style slot_time_text is slot_button_text style slot_name_text is slot_button_text style page_label: xpadding 75 ypadding 5 style page_label_text: text_align 0.5 layout "subtitle" hover_color gui.hover_color style page_button: properties gui.button_properties("page_button") style page_button_text: properties gui.button_text_properties("page_button") style slot_button: properties gui.button_properties("slot_button") style slot_button_text: properties gui.button_text_properties("slot_button") ## Preferences screen ########################################################## ## ## The preferences screen allows the player to configure the game to better suit ## themselves. ## ## https://www.renpy.org/doc/html/screen_special.html#preferences screen preferences(): tag menu use game_menu(_("Options"), scroll="viewport"): vbox: hbox: box_wrap True if renpy.variant("pc") or renpy.variant("web"): vbox: style_prefix "radio" label _("Display") textbutton _("Window") activate_sound "audio/ui/uiOptionOn.wav" action Preference("display", "any window") textbutton _("Fullscreen") activate_sound "audio/ui/uiOptionOn.wav" action Preference("display", "fullscreen") vbox: style_prefix "radio" label _("Rollback Side") textbutton _("Disable") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "disable") textbutton _("Left") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "left") textbutton _("Right") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "right") vbox: style_prefix "check" label _("Naughty Stuff") textbutton _("Enable Lewd Images") action [Function(onclick_audio, persistent.lewd), ToggleVariable("persistent.lewd", True, False)] vbox: style_prefix "check" label _("Requires Restart") textbutton _("Enable Forward-Scroll Movement") action [Function(onclick_audio, persistent.scroll), ToggleVariable("persistent.scroll", True, False)] vbox: style_prefix "check" label _("Skip") textbutton _("Unseen Text") action [Function(onclick_audio, preferences.skip_unseen), ToggleVariable("preferences.skip_unseen", True, False)] textbutton _("After Choices") action [Function(onclick_audio, preferences.skip_after_choices), ToggleVariable("preferences.skip_after_choices", True, False)] textbutton _("Transitions") action [Function(onclick_audio, preferences.transitions, True), ToggleVariable("preferences.transitions", 0, 2)] ## Additional vboxes of type "radio_pref" or "check_pref" can be ## added here, to add additional creator-defined preferences. vbox: style_prefix "check" label _("Language") $ persistent.chose_lang = True textbutton "English" action Language(None) textbutton "Español" action Language("es") null height (4 * gui.pref_spacing) hbox: style_prefix "slider" box_wrap True vbox: label _("Text Speed") bar value Preference("text speed") label _("Auto-Forward Time") bar value Preference("auto-forward time") vbox: if config.has_music: label _("Music Volume") hbox: bar value Preference("music volume") yalign 0.5 textbutton _("Reset"): action Function(preferences.set_volume, 'music', config.default_music_volume) if config.has_sound: label _("Sound Volume") hbox: bar value Preference("sfx volume") yalign 0.5 textbutton _("Reset"): action Function(preferences.set_volume, 'sfx', config.default_sfx_volume) if config.sample_sound: textbutton _("Test") action Play("sound", config.sample_sound) label _("UI Sounds Volume") hbox: bar value Preference("ui volume") yalign 0.5 textbutton _("Reset"): yalign 0.5 action Function(preferences.set_volume, 'ui', config.default_sfx_volume) if config.has_voice: label _("Voice Volume") hbox: bar value Preference("voice volume") yalign 0.5 textbutton _("Reset"): yalign 0.5 action Function(preferences.set_volume, 'voice', config.default_sfx_volume) if config.sample_voice: textbutton _("Test") action Play("voice", config.sample_voice) if config.has_music or config.has_sound or config.has_voice: null height gui.pref_spacing textbutton _("Mute All"): action Preference("all mute", "toggle") style "mute_all_button" style pref_label is gui_label style pref_label_text is gui_label_text style pref_vbox is vbox style radio_label is pref_label style radio_label_text is pref_label_text style radio_button is gui_button style radio_button_text is gui_button_text style radio_vbox is pref_vbox style check_label is pref_label style check_label_text is pref_label_text style check_button is gui_button style check_button_text is gui_button_text style check_vbox is pref_vbox style slider_label is pref_label style slider_label_text is pref_label_text style slider_slider is gui_slider style slider_button is gui_button style slider_button_text is gui_button_text style slider_pref_vbox is pref_vbox style mute_all_button is check_button style mute_all_button_text is check_button_text style pref_label: top_margin gui.pref_spacing bottom_margin 3 style pref_label_text: yalign 1.0 style pref_vbox: xsize 338 style radio_vbox: spacing gui.pref_button_spacing style radio_button: properties gui.button_properties("radio_button") foreground "gui/button/radio_[prefix_]foreground.png" style radio_button_text: properties gui.button_text_properties("radio_button") style check_vbox: spacing gui.pref_button_spacing style check_button: properties gui.button_properties("check_button") foreground "gui/button/check_[prefix_]foreground.png" style check_button_text: properties gui.button_text_properties("check_button") style slider_slider: xsize 525 style slider_button: properties gui.button_properties("slider_button") yalign 0.5 left_margin 15 style slider_button_text: properties gui.button_text_properties("slider_button") style slider_vbox: xsize 675 ## History screen ############################################################## ## ## This is a screen that displays the dialogue history to the player. While ## there isn't anything special about this screen, it does have to access the ## dialogue history stored in _history_list. ## ## https://www.renpy.org/doc/html/history.html screen history(): tag menu ## Avoid predicting this screen, as it can be very large. predict False use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0): style_prefix "history" for h in _history_list: window: ## This lays things out properly if history_height is None. has fixed: yfit True if h.who: label h.who: style "history_name" substitute False ## Take the color of the who text from the Character, if ## set. if "color" in h.who_args: text_color h.who_args["color"] $ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags) text what: substitute False if not _history_list: label _("The dialogue history is empty.") ## This determines what tags are allowed to be displayed on the history screen. define gui.history_allow_tags = set() style history_window is empty style history_name is gui_label style history_name_text is gui_label_text style history_text is gui_text style history_text is gui_text style history_label is gui_label style history_label_text is gui_label_text style history_window: xfill True ysize gui.history_height style history_name: xpos gui.history_name_xpos xanchor gui.history_name_xalign ypos gui.history_name_ypos xsize gui.history_name_width style history_name_text: min_width gui.history_name_width text_align gui.history_name_xalign style history_text: xpos gui.history_text_xpos ypos gui.history_text_ypos xanchor gui.history_text_xalign xsize gui.history_text_width min_width gui.history_text_width text_align gui.history_text_xalign layout ("subtitle" if gui.history_text_xalign else "tex") style history_label: xfill True style history_label_text: xalign 0.5 ## Extras screen######################################################## ## A screen that combines help, about, updates, gallery, screen extras(): tag menu style_prefix "main_menu" add gui.main_menu_background ## This empty frame darkens the main menu. frame: pass use extrasnavigation ##Extras Navigation Screen ##################################################### ## ##This screen is to be reused in screen extrasnavigation(): vbox: xpos 1940 yalign 0.03 if persistent.splashtype == 1: add "gui/sneedgame.png" else: add "gui/snootgame.png" vbox: spacing 10 xpos 1885 ypos 1120 use main_menu_buttons("gui/button/menubuttons/template_idle.png", [ [ _("Help"), ShowMenu("help") ], [ _("About"), ShowMenu("about") ], [ _("Updates"), ShowMenu("updates") ], [ _("Gallery"), ShowMenu("cg_gallery_0") ], [ _("Mods"), ShowMenu("mod_menu") ], [ _("Return"), ShowMenu("main_menu") ] ] ) ## Help screen ################################################################# ## ## A screen that gives information about key and mouse bindings. It uses other ## screens (keyboard_help, mouse_help, and gamepad_help) to display the actual ## help. screen help(): tag menu style_prefix "main_menu" add gui.main_menu_background add gui.extras_submenu_panel ## This empty frame darkens the main menu. frame: pass default device = "keyboard" # vbox: # xpos 1100 # ## ypos 1000 # yalign 0.4 # spacing 23 fixed: hbox: xpos 200 spacing 23 style_prefix "help" textbutton _("Keyboard") action SetScreenVariable("device", "keyboard") textbutton _("Mouse") action SetScreenVariable("device", "mouse") if GamepadExists(): textbutton _("Gamepad") action SetScreenVariable("device", "gamepad") vbox: yalign 0.5 xpos 1100 if device == "keyboard": use keyboard_help elif device == "mouse": use mouse_help elif device == "gamepad": use gamepad_help text _("") ## again in here to keep vbox in check use extrasnavigation screen keyboard_help(): style_prefix "help" hbox: label _("Enter") text _("Advances dialogue and activates the interface.") hbox: label _("Space") text _("Advances dialogue without selecting choices.") hbox: label _("Arrow Keys") text _("Navigate the interface.") hbox: label _("Escape") text _("Accesses the game menu. Also escapes the Gallery.") hbox: label _("Ctrl") text _("Skips dialogue while held down.") hbox: label _("Tab") text _("Toggles dialogue skipping.") hbox: label _("Page Up") text _("Rolls back to earlier dialogue.") hbox: label _("Page Down") text _("Rolls forward to later dialogue.") hbox: label "H" text _("Hides the user interface.") hbox: label "S" text _("Takes a screenshot.") hbox: label "V" text _("Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}.") screen mouse_help(): style_prefix "help" hbox: label _("Left Click") text _("Advances dialogue and activates the interface.") hbox: label _("Middle Click") text _("Hides the user interface.") hbox: label _("Right Click") text _("Accesses the game menu. Also escapes the Gallery.") hbox: label _("Mouse Wheel Up\nClick Rollback Side") text _("Rolls back to earlier dialogue.") hbox: label _("Mouse Wheel Down") text _("Rolls forward to later dialogue.") screen gamepad_help(): style_prefix "help" hbox: label _("Right Trigger\nA/Bottom Button") text _("Advances dialogue and activates the interface.") hbox: label _("Left Trigger\nLeft Shoulder") text _("Rolls back to earlier dialogue.") hbox: label _("Right Shoulder") text _("Rolls forward to later dialogue.") hbox: label _("D-Pad, Sticks") text _("Navigate the interface.") hbox: label _("Start, Guide") text _("Accesses the game menu.") hbox: label _("Y/Top Button") text _("Hides the user interface.") textbutton _("Calibrate") action GamepadCalibrate() #this bit is might need trimming or rework style help_button is gui_button style help_button_text is gui_button_text style help_label is gui_label style help_label_text is gui_label_text style help_text is gui_text style help_button: properties gui.button_properties("help_button") xmargin 12 style help_button_text: properties gui.button_text_properties("help_button") style help_label: xsize 375 right_padding 30 style help_label_text: size gui.text_size xalign 1.0 text_align 1.0 ################################################################################ ## Additional screens ################################################################################ ## Confirm screen ############################################################## ## ## The confirm screen is called when Ren'Py wants to ask the player a yes or no ## question. ## ## https://www.renpy.org/doc/html/screen_special.html#confirm screen confirm(message, yes_action, no_action): ## Ensure other screens do not get input while this screen is displayed. modal True zorder 200 style_prefix "confirm" add "gui/overlay/confirm.png" frame: vbox: xalign .5 yalign .5 spacing 45 label _(message): style "confirm_prompt" xalign 0.5 hbox: xalign 0.5 spacing 150 textbutton _("Yes") activate_sound "audio/ui/uiClick.wav" action yes_action textbutton _("No") activate_sound "audio/ui/uiBack.wav" action no_action ## Right-click and escape answer "no". key "game_menu" action no_action style confirm_frame is gui_frame style confirm_prompt is gui_prompt style confirm_prompt_text is gui_prompt_text style confirm_button is gui_medium_button style confirm_button_text is gui_medium_button_text style confirm_frame: background Frame([ "gui/confirm_frame.png", "gui/frame.png"], gui.confirm_frame_borders, tile=gui.frame_tile) padding gui.confirm_frame_borders.padding xalign .5 yalign .5 style confirm_prompt_text: text_align 0.5 layout "subtitle" style confirm_button: properties gui.button_properties("confirm_button") style confirm_button_text: properties gui.button_text_properties("confirm_button") ## Skip indicator screen ####################################################### ## ## The skip_indicator screen is displayed to indicate that skipping is in ## progress. ## ## https://www.renpy.org/doc/html/screen_special.html#skip-indicator screen skip_indicator(): zorder 100 style_prefix "skip" frame: hbox: spacing 9 text _("Skipping") text "▸" at delayed_blink(0.0, 1.0) style "skip_triangle" text "▸" at delayed_blink(0.2, 1.0) style "skip_triangle" text "▸" at delayed_blink(0.4, 1.0) style "skip_triangle" ## This transform is used to blink the arrows one after another. transform delayed_blink(delay, cycle): alpha .5 pause delay block: linear .2 alpha 1.0 pause .2 linear .2 alpha 0.5 pause (cycle - .4) repeat style skip_frame is empty style skip_text is gui_text style skip_triangle is skip_text style skip_frame: ypos gui.skip_ypos background Frame("gui/skip.png", gui.skip_frame_borders, tile=gui.frame_tile) padding gui.skip_frame_borders.padding style skip_text: size gui.notify_text_size style skip_triangle: ## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE ## glyph in it. font "DejaVuSans.ttf" ## Notify screen ############################################################### ## ## The notify screen is used to show the player a message. (For example, when ## the game is quicksaved or a screenshot has been taken.) ## ## https://www.renpy.org/doc/html/screen_special.html#notify-screen screen notify(message): zorder 100 style_prefix "notify" frame at notify_appear: text "[message!tq]" timer 3.25 action Hide('notify') transform notify_appear: on show: alpha 0 linear .25 alpha 1.0 on hide: linear .5 alpha 0.0 style notify_frame is empty style notify_text is gui_text style notify_frame: ypos gui.notify_ypos background Frame("gui/notify.png", gui.notify_frame_borders, tile=gui.frame_tile) padding gui.notify_frame_borders.padding style notify_text: properties gui.text_properties("notify") ## NVL screen ################################################################## ## ## This screen is used for NVL-mode dialogue and menus. ## ## https://www.renpy.org/doc/html/screen_special.html#nvl screen nvl(dialogue, items=None): window: style "nvl_window" has vbox: spacing gui.nvl_spacing ## Displays dialogue in either a vpgrid or the vbox. if gui.nvl_height: vpgrid: cols 1 yinitial 1.0 use nvl_dialogue(dialogue) else: use nvl_dialogue(dialogue) ## Displays the menu, if given. The menu may be displayed incorrectly if ## config.narrator_menu is set to True, as it is above. for i in items: textbutton i.caption: action i.action style "nvl_button" add SideImage() xalign 0.0 yalign 1.0 screen nvl_dialogue(dialogue): for d in dialogue: window: id d.window_id fixed: yfit gui.nvl_height is None if d.who is not None: text d.who: id d.who_id text d.what: id d.what_id ## This controls the maximum number of NVL-mode entries that can be displayed at ## once. define config.nvl_list_length = gui.nvl_list_length style nvl_window is default style nvl_entry is default style nvl_label is say_label style nvl_dialogue is say_dialogue style nvl_button is button style nvl_button_text is button_text style nvl_window: xfill True yfill True background "gui/nvl.png" padding gui.nvl_borders.padding style nvl_entry: xfill True ysize gui.nvl_height style nvl_label: xpos gui.nvl_name_xpos xanchor gui.nvl_name_xalign ypos gui.nvl_name_ypos yanchor 0.0 xsize gui.nvl_name_width min_width gui.nvl_name_width text_align gui.nvl_name_xalign style nvl_dialogue: xpos gui.nvl_text_xpos xanchor gui.nvl_text_xalign ypos gui.nvl_text_ypos xsize gui.nvl_text_width min_width gui.nvl_text_width text_align gui.nvl_text_xalign layout ("subtitle" if gui.nvl_text_xalign else "tex") style nvl_thought: xpos gui.nvl_thought_xpos xanchor gui.nvl_thought_xalign ypos gui.nvl_thought_ypos xsize gui.nvl_thought_width min_width gui.nvl_thought_width text_align gui.nvl_thought_xalign layout ("subtitle" if gui.nvl_text_xalign else "tex") style nvl_button: properties gui.button_properties("nvl_button") xpos gui.nvl_button_xpos xanchor gui.nvl_button_xalign style nvl_button_text: properties gui.button_text_properties("nvl_button") ################################################################################ ## Mobile Variants ################################################################################ style pref_vbox: variant "medium" xsize 675 ## Since a mouse may not be present, we replace the quick menu with a version ## that uses fewer and bigger buttons that are easier to touch. #redefine function screen quick_button(filename, label, function): variant "small mobile" button: xmaximum 124 ymaximum 124 action function fixed: add filename xalign 0.5 yalign 0.5 zoom 1.75 text label xalign 0.5 yalign 0.5 size 42 style "quick_button_text" screen quick_menu(): variant "small mobile" zorder 100 if quick_menu: hbox: spacing 28 style_prefix "quick" xalign 0.5 yalign 0.975 use quick_buttons("gui/button/uioptionbuttons/template_idle.png", \ [ \ [ "Back", Rollback() ], \ [ "Skip", Skip() ], \ [ "Auto", Preference("auto-forward", "toggle") ], \ [ "Menu", ShowMenu() ] \ ] ) screen extrasnavigation(): #Updates are removed (not even supported by Ren'Py) variant "small mobile" vbox: xpos 1940 yalign 0.03 if persistent.splashtype == 1: add "gui/sneedgame.png" else: add "gui/snootgame.png" vbox: spacing 25 xpos 1885 yalign 0.9 use main_menu_buttons("gui/button/menubuttons/template_idle.png", [ [ "Help", ShowMenu("help") ], [ "About", ShowMenu("about") ], [ "Gallery", ShowMenu("cg_gallery_0") ], [ "Return", ShowMenu("main_menu") ] ] ) style radio_button: variant "small mobile" foreground "gui/phone/button/radio_[prefix_]foreground.png" style check_button: variant "small mobile" foreground "gui/phone/button/check_[prefix_]foreground.png" style nvl_window: variant "small mobile" background "gui/phone/nvl.png" style game_menu_outer_frame: variant "small mobile" background "gui/phone/overlay/game_menu.png" style game_menu_navigation_frame: variant "small mobile" xsize 510 style game_menu_content_frame: variant "small mobile" top_margin 0 style pref_vbox: variant "small mobile" xsize 600 style bar: variant "small mobile" ysize gui.bar_size left_bar Frame("gui/phone/bar/left.png", gui.bar_borders, tile=gui.bar_tile) right_bar Frame("gui/phone/bar/right.png", gui.bar_borders, tile=gui.bar_tile) style vbar: variant "small mobile" xsize gui.bar_size top_bar Frame("gui/phone/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) bottom_bar Frame("gui/phone/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) style scrollbar: variant "small mobile" ysize gui.scrollbar_size base_bar Frame("gui/phone/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) thumb Frame("gui/phone/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) style vscrollbar: variant "small mobile" xsize gui.scrollbar_size base_bar Frame("gui/phone/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) thumb Frame("gui/phone/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) style slider: variant "small mobile" ysize gui.slider_size base_bar Frame("gui/phone/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) thumb "gui/phone/slider/horizontal_[prefix_]thumb.png" style vslider: variant "small mobile" xsize gui.slider_size base_bar Frame("gui/phone/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) thumb "gui/phone/slider/vertical_[prefix_]thumb.png" style slider_pref_vbox: variant "small mobile" xsize None style slider_pref_slider: variant "small mobile" xsize 900